lkml.org 
[lkml]   [2004]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [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);
\
 
 \ /
  Last update: 2005-03-22 14:03    [W:0.049 / U:0.320 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site