From: taoyue <yue.tao@windriver.com>
To: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Sukadev Bhattiprolu <sukadev@us.ibm.com>,
Andrew Morton <akpm@linux-foundation.org>,
Alexey Dobriyan <adobriyan@sw.ru>, Ingo Molnar <mingo@elte.hu>,
Thomas Gleixner <tglx@linutronix.de>,
Roland McGrath <roland@redhat.com>,
linux-kernel@vger.kernel.org, stable@kernel.org,
Mark Zhan <rongkai.zhan@windriver.com>,
"Ashfield, Bruce" <Bruce.Ashfield@windriver.com>
Subject: Re: [PATCH] sigqueue_free: fix the race with collect_signal()
Date: Mon, 27 Aug 2007 09:45:34 -0400 [thread overview]
Message-ID: <46D2D57E.4070406@windriver.com> (raw)
In-Reply-To: <20070824202305.GA274@tv-sign.ru>
Oleg Nesterov wrote:
> On 08/24, Sukadev Bhattiprolu wrote:
>
>> Oleg Nesterov wrote:
>>
>>> On 08/24, taoyue wrote:
>>>
>>>
>>>> Oleg Nesterov wrote:
>>>>
>>>>
>>>>>> collect_signal: sigqueue_free:
>>>>>>
>>>>>> list_del_init(&first->list);
>>>>>> spin_lock_irqsave(lock, flags);
>>>>>>
>>>>>>
>>>>>>
>>>>> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>>
>>>>>
>>>>>
>>>>>> if (!list_empty(&q->list))
>>>>>> list_del_init(&q->list);
>>>>>> spin_unlock_irqrestore(lock,
>>>>>> flags);
>>>>>> q->flags &= ~SIGQUEUE_PREALLOC;
>>>>>>
>>>>>> __sigqueue_free(first); __sigqueue_free(q);
>>>>>>
>>>>>>
>>>>>>
>>>>> collect_signal() is always called under ->siglock which is also taken by
>>>>> sigqueue_free(), so this is not possible.
>>>>>
>>>>>
>>>>>
>>>>>
>>>> I know, using current->sighand->siglock to prevent one sigqueue
>>>> is free twice. I want to know whether it is possible that the two
>>>> function is called in different thread. If that, the spin_lock is useless.
>>>>
>>>>
>>> Not sure I understand. Yes, it is possible they are called by 2 different
>>> threads, that is why we had a race. But all threads in the same thread
>>> group have the same ->sighand, and thus the same ->sighand->siglock.
>>>
I has applied the new patch, and start test program last Friday.
So far, the test program has run for three days.
In my test program, all threads is created in one process, so they
are in the same thread group. If two thread is not in the same thread
group, they have the different ->sighand->siglock. In this case, the
lock can't prevent the sigqueue object from race condition.
>>>
>>>
>> Oleg, if one thread can be in collect_signal() and another in
>> sigqueue_free() and both operate on the exact same sigqueue object, its
>> not clear how we prevent two calls to __sigqueue_free() to
>> the same object. In that case the lock (or some lock) should be around
>> __sigqueue_free() - no ?
>>
>> i.e if we enter sigqueue_free(), we will call __sigqueue_free()
>> regardless of the state.
>>
>
> Yes. They both will call __sigqueue_free(). But please note that __sigqueue_free()
> checks SIGQUEUE_PREALLOC, which is cleared by sigqueue_free().
>
> IOW, when sigqueue_free() unlocks ->siglock, we know that it can't be used
> by collect_signal() from another thread. So we can clear SIGQUEUE_PREALLOC
> and free sigqueue. We don't need this lock around sigqueue_free() to prevent
> the race. collect_signal() can "see" only those sigqueues which are on list.
>
> IOW, when sigqueue_free() takes ->siglock, colect_signal() can't run, because
> it needs the same lock. Now we delete this sigqueue from list, nobody can
> see it, it can't have other references. So we can unlock ->siglock, mark
> sigqueue as freeable (clear SIGQUEUE_PREALLOC), and free it.
>
> Do you agree?
>
> Oleg.
>
>
>
next prev parent reply other threads:[~2007-08-27 1:59 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-08-23 13:45 [PATCH] sigqueue_free: fix the race with collect_signal() Oleg Nesterov
2007-08-23 21:36 ` Sukadev Bhattiprolu
2007-08-23 22:05 ` Oleg Nesterov
2007-08-24 14:26 ` taoyue
2007-08-24 7:45 ` Oleg Nesterov
2007-08-24 21:29 ` taoyue
2007-08-24 11:08 ` Oleg Nesterov
2007-08-24 20:03 ` Sukadev Bhattiprolu
2007-08-24 20:23 ` Oleg Nesterov
2007-08-25 17:24 ` Sukadev Bhattiprolu
2007-08-25 17:34 ` Oleg Nesterov
2007-08-27 13:45 ` taoyue [this message]
2007-08-27 5:57 ` Oleg Nesterov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=46D2D57E.4070406@windriver.com \
--to=yue.tao@windriver.com \
--cc=Bruce.Ashfield@windriver.com \
--cc=adobriyan@sw.ru \
--cc=akpm@linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=oleg@tv-sign.ru \
--cc=roland@redhat.com \
--cc=rongkai.zhan@windriver.com \
--cc=stable@kernel.org \
--cc=sukadev@us.ibm.com \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox