* 2.6.5-rc2-mm2 ipc hang fix
@ 2004-03-26 1:53 badari
2004-03-26 5:57 ` Manfred Spraul
0 siblings, 1 reply; 4+ messages in thread
From: badari @ 2004-03-26 1:53 UTC (permalink / raw)
To: andrew, lkml, manfred
Hi Andrew,
I ran into ipc hang while trying to shutdown database. Problem seems
to be due to missing sem_unlock() in find_undo(). Here is the patch
to fix the problem.
Please apply.
Thanks,
Badari
--- linux/ipc/sem.c 2004-03-26 05:19:22.833959160 -0800
+++ linux.new/ipc/sem.c 2004-03-26 05:19:57.047757872 -0800
@@ -972,8 +972,10 @@ static struct sem_undo *find_undo(int se
if(sma==NULL)
goto out;
un = ERR_PTR(-EIDRM);
- if (sem_checkid(sma,semid))
+ if (sem_checkid(sma,semid)) {
+ sem_unlock(sma);
goto out_unlock;
+ }
nsems = sma->sem_nsems;
sem_unlock(sma);
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: 2.6.5-rc2-mm2 ipc hang fix
2004-03-26 1:53 2.6.5-rc2-mm2 ipc hang fix badari
@ 2004-03-26 5:57 ` Manfred Spraul
2004-03-26 17:16 ` Badari Pulavarty
2004-03-26 17:36 ` 2.6.5-rc2-mm2 ipc hang fix (final version) Badari Pulavarty
0 siblings, 2 replies; 4+ messages in thread
From: Manfred Spraul @ 2004-03-26 5:57 UTC (permalink / raw)
To: badari; +Cc: andrew, lkml
badari wrote:
>--- linux/ipc/sem.c 2004-03-26 05:19:22.833959160 -0800
>+++ linux.new/ipc/sem.c 2004-03-26 05:19:57.047757872 -0800
>@@ -972,8 +972,10 @@ static struct sem_undo *find_undo(int se
> if(sma==NULL)
> goto out;
> un = ERR_PTR(-EIDRM);
>- if (sem_checkid(sma,semid))
>+ if (sem_checkid(sma,semid)) {
>+ sem_unlock(sma);
> goto out_unlock;
>+ }
> nsems = sma->sem_nsems;
> sem_unlock(sma);
>
>
[snip]
> out_unlock:
> unlock_semundo();
> out:
> return un;
> }
Thanks for finding the bug - out_unlock unlocks the wrong spinlock,
that's why I didn't notice it while searching for the bug.
But I think your fix is wrong: the "goto out_unlock" must be replaced
with "goto out": the semundo spinlock is not held.
--
Manfred
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: 2.6.5-rc2-mm2 ipc hang fix
2004-03-26 5:57 ` Manfred Spraul
@ 2004-03-26 17:16 ` Badari Pulavarty
2004-03-26 17:36 ` 2.6.5-rc2-mm2 ipc hang fix (final version) Badari Pulavarty
1 sibling, 0 replies; 4+ messages in thread
From: Badari Pulavarty @ 2004-03-26 17:16 UTC (permalink / raw)
To: Manfred Spraul; +Cc: andrew, lkml
[-- Attachment #1: Type: text/plain, Size: 1060 bytes --]
On Thursday 25 March 2004 09:57 pm, Manfred Spraul wrote:
> badari wrote:
> >--- linux/ipc/sem.c 2004-03-26 05:19:22.833959160 -0800
> >+++ linux.new/ipc/sem.c 2004-03-26 05:19:57.047757872 -0800
> >@@ -972,8 +972,10 @@ static struct sem_undo *find_undo(int se
> > if(sma==NULL)
> > goto out;
> > un = ERR_PTR(-EIDRM);
> >- if (sem_checkid(sma,semid))
> >+ if (sem_checkid(sma,semid)) {
> >+ sem_unlock(sma);
> > goto out_unlock;
> >+ }
> > nsems = sma->sem_nsems;
> > sem_unlock(sma);
>
> [snip]
>
> > out_unlock:
> > unlock_semundo();
> > out:
> > return un;
> > }
>
> Thanks for finding the bug - out_unlock unlocks the wrong spinlock,
> that's why I didn't notice it while searching for the bug.
> But I think your fix is wrong: the "goto out_unlock" must be replaced
> with "goto out": the semundo spinlock is not held.
Yes. You are correct. semundo lock is not held.
Here is the updated patch.
Thanks,
Badari
[-- Attachment #2: undo.patch --]
[-- Type: text/x-diff, Size: 397 bytes --]
--- linux/ipc/sem.c 2004-03-26 05:19:22.833959160 -0800
+++ linux.new/ipc/sem.c 2004-03-26 20:59:46.496258680 -0800
@@ -972,8 +972,10 @@ static struct sem_undo *find_undo(int se
if(sma==NULL)
goto out;
un = ERR_PTR(-EIDRM);
- if (sem_checkid(sma,semid))
- goto out_unlock;
+ if (sem_checkid(sma,semid)) {
+ sem_unlock(sma);
+ goto out;
+ }
nsems = sma->sem_nsems;
sem_unlock(sma);
^ permalink raw reply [flat|nested] 4+ messages in thread* Re: 2.6.5-rc2-mm2 ipc hang fix (final version)
2004-03-26 5:57 ` Manfred Spraul
2004-03-26 17:16 ` Badari Pulavarty
@ 2004-03-26 17:36 ` Badari Pulavarty
1 sibling, 0 replies; 4+ messages in thread
From: Badari Pulavarty @ 2004-03-26 17:36 UTC (permalink / raw)
To: Manfred Spraul; +Cc: andrew, lkml
[-- Attachment #1: Type: text/plain, Size: 130 bytes --]
Hi,
Here is the final version. I missed a compile warning before.
out_unlock label is no longer needed.
Thanks,
Badari
[-- Attachment #2: undo.patch --]
[-- Type: text/x-diff, Size: 562 bytes --]
--- linux/ipc/sem.c 2004-03-26 05:19:22.833959160 -0800
+++ linux.new/ipc/sem.c 2004-03-26 21:18:28.424699632 -0800
@@ -972,8 +972,10 @@ static struct sem_undo *find_undo(int se
if(sma==NULL)
goto out;
un = ERR_PTR(-EIDRM);
- if (sem_checkid(sma,semid))
- goto out_unlock;
+ if (sem_checkid(sma,semid)) {
+ sem_unlock(sma);
+ goto out;
+ }
nsems = sma->sem_nsems;
sem_unlock(sma);
@@ -1004,7 +1006,6 @@ static struct sem_undo *find_undo(int se
sma->undo = new;
sem_unlock(sma);
un = new;
-out_unlock:
unlock_semundo();
out:
return un;
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2004-03-26 17:42 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-03-26 1:53 2.6.5-rc2-mm2 ipc hang fix badari
2004-03-26 5:57 ` Manfred Spraul
2004-03-26 17:16 ` Badari Pulavarty
2004-03-26 17:36 ` 2.6.5-rc2-mm2 ipc hang fix (final version) Badari Pulavarty
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox