Managed to self-destruct pager.

Issues:
- A page-faulting thread suspends if receives -1 from pager page fault ipc.
  This is fine if pager is about to delete the thread, but it is not if
  it is a buggy pager.
- Need to find a way to completely get rid of suspended pager.
- A method of deleting suspended tasks could remedy both cases above.
This commit is contained in:
Bahadir Balban
2009-10-19 00:33:10 +03:00
parent c3b0399485
commit 9177166817
10 changed files with 162 additions and 36 deletions

View File

@@ -162,9 +162,10 @@ int init_first_pager(struct pager *pager,
space->pgd = current_pgd;
address_space_attach(task, space);
/* Initialize container relationships */
/* Initialize container/pager relationships */
pager->tcb = task;
task->pager = pager;
task->pagerid = task->tid;
task->container = cont;
task->cap_list_ptr = &pager->cap_list;
@@ -220,12 +221,13 @@ int init_pager(struct pager *pager, struct container *cont)
task->space = address_space_create(0);
/* Initialize container relationships */
/* Initialize container/pager relationships */
pager->tcb = task;
task->pager = pager;
task->container = cont;
task->cap_list_ptr = &pager->cap_list;
task->pagerid = task->tid;
task->cap_list_ptr = &pager->cap_list;
add_mapping_pgd(pager->start_lma, pager->start_vma,
page_align_up(pager->memsize),
MAP_USR_DEFAULT_FLAGS, TASK_PGD(task));

View File

@@ -236,11 +236,23 @@ void sched_suspend_sync(void)
current->state = TASK_INACTIVE;
current->flags &= ~TASK_SUSPENDING;
scheduler.prio_total -= current->priority;
BUG_ON(scheduler.prio_total <= 0);
BUG_ON(scheduler.prio_total < 0);
preempt_enable();
/* Async wake up any waiters */
wake_up_task(tcb_find(current->pagerid), 0);
/*
* Async wake up any waiting pagers
*
* If we're not a pager, then a pager must have
* signalled us to suspend, and it must have been
* waiting for us to wake it up when we suspend.
* We do it here.
*
* If though, we _are_ a pager that is suspending,
* we silently do so. Noone is waiting us.
*/
if (current->pagerid != current->tid)
wake_up_task(tcb_find(current->pagerid), 0);
schedule();
}
@@ -251,13 +263,25 @@ void sched_suspend_async(void)
current->state = TASK_INACTIVE;
current->flags &= ~TASK_SUSPENDING;
scheduler.prio_total -= current->priority;
BUG_ON(scheduler.prio_total <= 0);
BUG_ON(scheduler.prio_total < 0);
/* This will make sure we yield soon */
preempt_enable();
/* Async wake up any waiters */
wake_up_task(tcb_find(current->pagerid), 0);
/*
* Async wake up any waiting pagers
*
* If we're not a pager, then a pager must have
* signalled us to suspend, and it must have been
* waiting for us to wake it up when we suspend.
* We do it here.
*
* If though, we _are_ a pager that is suspending,
* we silently do so. Noone is waiting us.
*/
if (current->pagerid != current->tid)
wake_up_task(tcb_find(current->pagerid), 0);
need_resched = 1;
}