* [2.4] build error with latest BK @ 2004-06-15 16:48 Nuno Monteiro 2004-06-16 2:38 ` Nick Piggin 0 siblings, 1 reply; 9+ messages in thread From: Nuno Monteiro @ 2004-06-15 16:48 UTC (permalink / raw) To: linux-kernel; +Cc: nickpiggin, marcelo.tosatti 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. gcc -D__KERNEL__ -I/usr/local/src/linux-2.4/include -Wall -Wstrict- prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit- frame-pointer -pipe -mpreferred-stack-boundary=2 -march=athlon - nostdinc -iwithprefix include -DKBUILD_BASENAME=rwsem -DEXPORT_SYMTAB -c rwsem.c rwsem.c: In function `__rwsem_do_wake': rwsem.c:67: warning: implicit declaration of function `put_task_struct' rwsem.c: In function `rwsem_down_failed_common': rwsem.c:131: error: `mem_map' undeclared (first use in this function) rwsem.c:131: error: (Each undeclared identifier is reported only once rwsem.c:131: error: for each function it appears in.) make[2]: *** [rwsem.o] Error 1 make[2]: Leaving directory `/usr/local/src/linux-2.4/lib' make[1]: *** [first_rule] Error 2 make[1]: Leaving directory `/usr/local/src/linux-2.4/lib' make: *** [_dir_lib] Error 2 x86 target, gcc 3.3.2 (or 2.95.4 prerelease). Ping me if you need .config or anything else. [nuno@calvin] /usr/local/src/linux-2.4$ patch -Rp1 < fix-rwsem-race patching file lib/rwsem-spinlock.c patching file lib/rwsem.c [nuno@calvin] /usr/local/src/linux-2.4$ cd lib [nuno@calvin] ..src/linux-2.4/lib$ gcc -D__KERNEL__ -I/usr/local/src/ linux-2.4/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno- strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack- boundary=2 -march=athlon -nostdinc -iwithprefix include - DKBUILD_BASENAME=rwsem -DEXPORT_SYMTAB -c rwsem.c [nuno@calvin] ..src/linux-2.4/lib$ echo $? 0 Regards, Nuno ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-15 16:48 [2.4] build error with latest BK Nuno Monteiro @ 2004-06-16 2:38 ` Nick Piggin 2004-06-16 8:20 ` David Howells 0 siblings, 1 reply; 9+ messages in thread From: Nick Piggin @ 2004-06-16 2:38 UTC (permalink / raw) To: Nuno Monteiro; +Cc: linux-kernel, marcelo.tosatti, David Howells [-- Attachment #1: Type: text/plain, Size: 484 bytes --] 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). [-- Attachment #2: rwsem24-fix.patch --] [-- Type: text/x-patch, Size: 2547 bytes --] --- 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); ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 2:38 ` Nick Piggin @ 2004-06-16 8:20 ` David Howells 2004-06-16 8:43 ` Nick Piggin 0 siblings, 1 reply; 9+ messages in thread From: David Howells @ 2004-06-16 8:20 UTC (permalink / raw) To: Nick Piggin; +Cc: Nuno Monteiro, linux-kernel, marcelo.tosatti > - put_task_struct(tsk); > + task_unlock(tsk); Ummm... that doesn't look right. > - get_task_struct(tsk); This is necessary to stop someone deallocating the task structure, can the task structure be deallocated whilst locked? David ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 8:20 ` David Howells @ 2004-06-16 8:43 ` Nick Piggin 2004-06-16 9:01 ` Mikael Pettersson 0 siblings, 1 reply; 9+ messages in thread From: Nick Piggin @ 2004-06-16 8:43 UTC (permalink / raw) To: David Howells; +Cc: Nuno Monteiro, linux-kernel, marcelo.tosatti David Howells wrote: >>- put_task_struct(tsk); >>+ task_unlock(tsk); > > > Ummm... that doesn't look right. > > >>- get_task_struct(tsk); > > > This is necessary to stop someone deallocating the task structure, can the > task structure be deallocated whilst locked? > Ooh maybe it can. Should that be a read_lock of the tasklist lock then? ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 8:43 ` Nick Piggin @ 2004-06-16 9:01 ` Mikael Pettersson 2004-06-16 9:04 ` Nick Piggin 0 siblings, 1 reply; 9+ messages in thread From: Mikael Pettersson @ 2004-06-16 9:01 UTC (permalink / raw) To: Nick Piggin; +Cc: David Howells, Nuno Monteiro, linux-kernel, marcelo.tosatti Nick Piggin writes: > David Howells wrote: > >>- put_task_struct(tsk); > >>+ task_unlock(tsk); > > > > > > Ummm... that doesn't look right. > > > > > >>- get_task_struct(tsk); > > > > > > This is necessary to stop someone deallocating the task structure, can the > > task structure be deallocated whilst locked? > > > > Ooh maybe it can. Should that be a read_lock of the tasklist lock then? For 2.4 kernels, use get_task_struct() and free_task_struct() [not put] for locking and unlocking a task. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 9:01 ` Mikael Pettersson @ 2004-06-16 9:04 ` Nick Piggin 2004-06-16 13:40 ` Nuno Monteiro 2004-06-16 15:07 ` [2.4] build error with latest BK [fixed patch] Nuno Monteiro 0 siblings, 2 replies; 9+ messages in thread From: Nick Piggin @ 2004-06-16 9:04 UTC (permalink / raw) To: Mikael Pettersson Cc: David Howells, Nuno Monteiro, linux-kernel, marcelo.tosatti Mikael Pettersson wrote: > Nick Piggin writes: > > David Howells wrote: > > >>- put_task_struct(tsk); > > >>+ task_unlock(tsk); > > > > > > > > > Ummm... that doesn't look right. > > > > > > > > >>- get_task_struct(tsk); > > > > > > > > > This is necessary to stop someone deallocating the task structure, can the > > > task structure be deallocated whilst locked? > > > > > > > Ooh maybe it can. Should that be a read_lock of the tasklist lock then? > > For 2.4 kernels, use get_task_struct() and free_task_struct() [not put] > for locking and unlocking a task. > Sorry I'm an idiot. I'm sure Marcelo has already fixed it. Just simply replace put_task_struct with free_task_struct. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 9:04 ` Nick Piggin @ 2004-06-16 13:40 ` Nuno Monteiro 2004-06-16 13:57 ` Marcelo Tosatti 2004-06-16 15:07 ` [2.4] build error with latest BK [fixed patch] Nuno Monteiro 1 sibling, 1 reply; 9+ messages in thread From: Nuno Monteiro @ 2004-06-16 13:40 UTC (permalink / raw) To: Nick Piggin Cc: Mikael Pettersson, David Howells, linux-kernel, marcelo.tosatti On 2004.06.16 10:04, Nick Piggin wrote: > Just simply replace put_task_struct with free_task_struct. Like this, maybe? It applies on top of what's currently in BK -- it fixed it for me, compiled and boot tested, running for the last 20 minutes. Also, linux/mm.h is needed because of free_pages(). Marcelo, please apply. --- linux-2.4-BK/lib/rwsem.c~fix-rwsem-race-fix 2004-06-16 14:14:02.187159768 +0100 +++ linux-2.4-BK/lib/rwsem.c 2004-06-16 14:14:28.905098024 +0100 @@ -5,6 +5,7 @@ */ #include <linux/rwsem.h> #include <linux/sched.h> +#include <linux/mm.h> #include <linux/module.h> struct rwsem_waiter { @@ -64,7 +65,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); goto out; /* grant an infinite number of read locks to the readers at the front of the queue @@ -96,7 +97,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); } sem->wait_list.next = next; ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK 2004-06-16 13:40 ` Nuno Monteiro @ 2004-06-16 13:57 ` Marcelo Tosatti 0 siblings, 0 replies; 9+ messages in thread From: Marcelo Tosatti @ 2004-06-16 13:57 UTC (permalink / raw) To: Nuno Monteiro; +Cc: linux-kernel On Wed, Jun 16, 2004 at 02:40:36PM +0100, Nuno Monteiro wrote: > On 2004.06.16 10:04, Nick Piggin wrote: > > Just simply replace put_task_struct with free_task_struct. > > Like this, maybe? It applies on top of what's currently in BK -- it fixed > it for me, compiled and boot tested, running for the last 20 minutes. > Also, linux/mm.h is needed because of free_pages(). Ok, applied, thanks everyone. Should be releasing -pre6 in a few moments with this. ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [2.4] build error with latest BK [fixed patch] 2004-06-16 9:04 ` Nick Piggin 2004-06-16 13:40 ` Nuno Monteiro @ 2004-06-16 15:07 ` Nuno Monteiro 1 sibling, 0 replies; 9+ messages in thread From: Nuno Monteiro @ 2004-06-16 15:07 UTC (permalink / raw) To: Nick Piggin Cc: Mikael Pettersson, David Howells, linux-kernel, marcelo.tosatti On 2004.06.16 10:04, Nick Piggin wrote: > Just simply replace put_task_struct with free_task_struct. Sorry, only sent half of the patch the first time around. Here it is, with the second hunk touching rwsem-spinlock.c. This applies on top of what's currently in BK, and fixes the problems for me -- it is compiled and boot tested, running for the last 20 minutes. Also, linux/mm.h is needed because of free_pages(). I don't have any arch around here that actually needs rwsem-spinlock.c so that part is untested, although it should be ok. Marcelo, please apply. --- linux-2.4-BK/lib/rwsem.c~fix-rwsem-race-fix 2004-06-16 14:14:02.000000000 +0100 +++ linux-2.4-BK/lib/rwsem.c 2004-06-16 14:14:28.000000000 +0100 @@ -5,6 +5,7 @@ */ #include <linux/rwsem.h> #include <linux/sched.h> +#include <linux/mm.h> #include <linux/module.h> struct rwsem_waiter { @@ -64,7 +65,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); goto out; /* grant an infinite number of read locks to the readers at the front of the queue @@ -96,7 +97,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); } sem->wait_list.next = next; --- linux-2.4-BK/lib/rwsem-spinlock.c~fix-rwsem-race-fix 2004-06-16 15:47:26.982774224 +0100 +++ linux-2.4-BK/lib/rwsem-spinlock.c 2004-06-16 15:51:17.522726824 +0100 @@ -9,6 +9,7 @@ */ #include <linux/rwsem.h> #include <linux/sched.h> +#include <linux/mm.h> #include <linux/module.h> struct rwsem_waiter { @@ -69,7 +70,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); goto out; } @@ -81,7 +82,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); woken++; if (list_empty(&sem->wait_list)) break; @@ -111,7 +112,7 @@ static inline struct rw_semaphore *__rws mb(); waiter->task = NULL; wake_up_process(tsk); - put_task_struct(tsk); + free_task_struct(tsk); return sem; } ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2004-06-16 20:46 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2004-06-15 16:48 [2.4] build error with latest BK Nuno Monteiro 2004-06-16 2:38 ` Nick Piggin 2004-06-16 8:20 ` David Howells 2004-06-16 8:43 ` Nick Piggin 2004-06-16 9:01 ` Mikael Pettersson 2004-06-16 9:04 ` Nick Piggin 2004-06-16 13:40 ` Nuno Monteiro 2004-06-16 13:57 ` Marcelo Tosatti 2004-06-16 15:07 ` [2.4] build error with latest BK [fixed patch] Nuno Monteiro
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox