mirror of
https://github.com/drasko/codezero.git
synced 2026-01-12 10:53:16 +01:00
Added sharing of pager capabilities with children or siblings
Pagers can now share their own private capabilities with their paged children, or their siblings with whom they have a common pager ancestor. Added flags CAP_SHARE_CHILD and CAP_SHARE_SIBLINGS for that.
This commit is contained in:
@@ -48,10 +48,14 @@ int read_task_capabilities(void *userbuf)
|
||||
}
|
||||
|
||||
/*
|
||||
* Currently shares _all_ capabilities of a task
|
||||
* with a collection of threads
|
||||
* Currently shares _all_ capabilities of a task with a
|
||||
* collection of threads
|
||||
*
|
||||
* FIXME: Check ownership for sharing.
|
||||
*
|
||||
* Currently we don't need to check since we _only_ share
|
||||
* the ones from our own private list. If we shared from
|
||||
* a collection's list, we would need to check ownership.
|
||||
*/
|
||||
int capability_share(unsigned int share_flags)
|
||||
{
|
||||
@@ -64,11 +68,32 @@ int capability_share(unsigned int share_flags)
|
||||
cap_list_move(&curcont->cap_list,
|
||||
¤t->cap_list);
|
||||
break;
|
||||
case CAP_SHARE_GROUP: {
|
||||
struct ktcb *tgr_leader;
|
||||
case CAP_SHARE_CHILD:
|
||||
/*
|
||||
* Move own capabilities to paged-children
|
||||
* cap list so that all children can benefit
|
||||
* from our own capabilities.
|
||||
*/
|
||||
cap_list_move(¤t->pager_cap_list,
|
||||
¤t->cap_list);
|
||||
break;
|
||||
case CAP_SHARE_SIBLING: {
|
||||
/* Find our pager */
|
||||
struct ktcb *pager = tcb_find(current->pagerid);
|
||||
|
||||
BUG_ON(!(tgr_leader = tcb_find(current->tgid)));
|
||||
cap_list_move(&tgr_leader->tgr_cap_list,
|
||||
/*
|
||||
* Add own capabilities to its
|
||||
* paged-children cap_list
|
||||
*/
|
||||
cap_list_move(&pager->pager_cap_list,
|
||||
¤t->cap_list);
|
||||
break;
|
||||
}
|
||||
case CAP_SHARE_GROUP: {
|
||||
struct ktcb *tgroup_leader;
|
||||
|
||||
BUG_ON(!(tgroup_leader = tcb_find(current->tgid)));
|
||||
cap_list_move(&tgroup_leader->tgroup_cap_list,
|
||||
¤t->cap_list);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -395,6 +395,8 @@ int thread_create(struct task_ids *ids, unsigned int flags)
|
||||
else
|
||||
new->pagerid = new->tid;
|
||||
|
||||
//printk("Thread (%d) pager set as (%d)\n", new->tid, new->pagerid);
|
||||
|
||||
/*
|
||||
* Setup container-generic fields from current task
|
||||
*/
|
||||
|
||||
@@ -81,7 +81,7 @@ struct capability *capability_find_by_rtype(struct ktcb *task,
|
||||
unsigned int rtype)
|
||||
{
|
||||
struct capability *cap;
|
||||
struct ktcb *tgleader;
|
||||
struct ktcb *tgleader, *pager;
|
||||
|
||||
/* Search task's own list */
|
||||
list_foreach_struct(cap, &task->cap_list.caps, list)
|
||||
@@ -97,7 +97,15 @@ struct capability *capability_find_by_rtype(struct ktcb *task,
|
||||
BUG_ON(!(tgleader = tcb_find(task->tgid)));
|
||||
|
||||
/* Search thread group list */
|
||||
list_foreach_struct(cap, &tgleader->tgr_cap_list.caps, list)
|
||||
list_foreach_struct(cap, &tgleader->tgroup_cap_list.caps, list)
|
||||
if (cap_rtype(cap) == rtype)
|
||||
return cap;
|
||||
|
||||
/* Find pager */
|
||||
BUG_ON(!(pager = tcb_find(task->pagerid)));
|
||||
|
||||
/* Search pager's paged-children capability list */
|
||||
list_foreach_struct(cap, &pager->pager_cap_list.caps, list)
|
||||
if (cap_rtype(cap) == rtype)
|
||||
return cap;
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ void tcb_init(struct ktcb *new)
|
||||
mutex_init(&new->thread_control_lock);
|
||||
|
||||
cap_list_init(&new->cap_list);
|
||||
cap_list_init(&new->tgr_cap_list);
|
||||
cap_list_init(&new->tgroup_cap_list);
|
||||
cap_list_init(&new->pager_cap_list);
|
||||
|
||||
/* Initialise task's scheduling state and parameters. */
|
||||
|
||||
Reference in New Issue
Block a user