Messages in this thread Patch in this message | | | Date | Wed, 16 Jun 2004 12:38:25 +1000 | From | Nick Piggin <> | Subject | Re: [2.4] build error with latest BK |
| |
Nuno Monteiro wrote: > > Hi all, > > > Just pulled latest bk of 2.4 and it appears to be broken. The recent > rwsem race fixes seem to be the culprit (see > http://linux.bkbits.net:8080/linux-2.4/cset@40cee86dCLGhZc1lEOWZV6K7FysQlw?nav=index.html| > ChangeSet@-1d). Reversing it fixes the problem. >
Sorry, that was stupid of me.
Does the attached patch look acceptable? In particular, should task_lock be used in this manner? (ie. to guarantee the task doesn't go away).
--- linux-2.4/lib/rwsem.c.orig 2004-06-16 12:26:52.000000000 +1000 +++ linux-2.4/lib/rwsem.c 2004-06-16 12:33:28.000000000 +1000 @@ -61,10 +61,10 @@ static inline struct rw_semaphore *__rws list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); /* task_lock is an implicit memory barrier */ waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); goto out; /* grant an infinite number of read locks to the readers at the front of the queue @@ -93,10 +93,10 @@ static inline struct rw_semaphore *__rws waiter = list_entry(next,struct rwsem_waiter,list); next = waiter->list.next; tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); } sem->wait_list.next = next; @@ -128,7 +128,6 @@ static inline struct rw_semaphore *rwsem /* set up my own style of waitqueue */ spin_lock(&sem->wait_lock); waiter->task = tsk; - get_task_struct(tsk); list_add_tail(&waiter->list,&sem->wait_list); --- linux-2.4/lib/rwsem-spinlock.c.orig 2004-06-16 12:33:40.000000000 +1000 +++ linux-2.4/lib/rwsem-spinlock.c 2004-06-16 12:34:39.000000000 +1000 @@ -66,10 +66,10 @@ static inline struct rw_semaphore *__rws sem->activity = -1; list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); /* implicit memory barrier */ waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); goto out; } @@ -78,10 +78,10 @@ static inline struct rw_semaphore *__rws do { list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); woken++; if (list_empty(&sem->wait_list)) break; @@ -108,10 +108,10 @@ static inline struct rw_semaphore *__rws list_del(&waiter->list); tsk = waiter->task; - mb(); + task_lock(tsk); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + task_unlock(tsk); return sem; } @@ -140,7 +140,6 @@ void __down_read(struct rw_semaphore *se /* set up my own style of waitqueue */ waiter.task = tsk; waiter.flags = RWSEM_WAITING_FOR_READ; - get_task_struct(tsk); list_add_tail(&waiter.list,&sem->wait_list); @@ -209,7 +208,6 @@ void __down_write(struct rw_semaphore *s /* set up my own style of waitqueue */ waiter.task = tsk; waiter.flags = RWSEM_WAITING_FOR_WRITE; - get_task_struct(tsk); list_add_tail(&waiter.list,&sem->wait_list); | |