A better locking scheme for address spaces.

Same shall be done for the tcb list.
This commit is contained in:
Bahadir Balban
2009-11-01 14:32:55 +02:00
parent 003976e99e
commit 83a740f597
4 changed files with 28 additions and 51 deletions

View File

@@ -271,30 +271,38 @@ int thread_setup_space(struct ktcb *tcb, struct task_ids *ids, unsigned int flag
struct address_space *space, *new;
int ret = 0;
address_space_reference_lock();
if (flags & TC_SHARE_SPACE) {
mutex_lock(&curcont->space_list.lock);
if (!(space = address_space_find(ids->spid))) {
mutex_unlock(&curcont->space_list.lock);
ret = -ESRCH;
goto out;
}
mutex_lock(&space->lock);
mutex_unlock(&curcont->space_list.lock);
address_space_attach(tcb, space);
mutex_unlock(&space->lock);
}
if (flags & TC_COPY_SPACE) {
else if (flags & TC_COPY_SPACE) {
mutex_lock(&curcont->space_list.lock);
if (!(space = address_space_find(ids->spid))) {
ret = -ESRCH;
goto out;
}
mutex_lock(&space->lock);
if (IS_ERR(new = address_space_create(space))) {
mutex_unlock(&curcont->space_list.lock);
mutex_unlock(&space->lock);
ret = (int)new;
goto out;
}
/* New space id to be returned back to caller */
ids->spid = new->spid;
mutex_unlock(&space->lock);
ids->spid = new->spid; /* Return newid to caller */
address_space_attach(tcb, new);
address_space_add(new);
mutex_unlock(&curcont->space_list.lock);
}
if (flags & TC_NEW_SPACE) {
else if (flags & TC_NEW_SPACE) {
if (IS_ERR(new = address_space_create(0))) {
ret = (int)new;
goto out;
@@ -302,11 +310,12 @@ int thread_setup_space(struct ktcb *tcb, struct task_ids *ids, unsigned int flag
/* New space id to be returned back to caller */
ids->spid = new->spid;
address_space_attach(tcb, new);
mutex_lock(&curcont->space_list.lock);
address_space_add(new);
mutex_unlock(&curcont->space_list.lock);
}
out:
address_space_reference_unlock();
return ret;
}