login
Login
/
Register
Search
Search this site:
Forums
News
Blogs
Features
Site
Home
»
Mailing list archives
»
linux-kernel
»
2010
»
December
»
22
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the priority list to plist_del()
view
thread
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
[view in full thread]
From: Darren Hart
Subject:
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the priority list to plist_del()
Date: Tuesday, December 21, 2010 - 11:50 pm
On 12/21/2010 10:18 PM, Lai Jiangshan wrote:
quoted text
> On 12/22/2010 03:13 AM, Darren Hart wrote: >> On 12/21/2010 01:55 AM, Lai Jiangshan wrote: >> >> Hi Lai, >> >> Looks about ready to me, only a couple of more nitpics from me. >> > > Fixed, thanks.
Looks good to me. How did the futextest runs go? -- Darren
quoted text
> > Subject: [PATCH 1/4 V3 ] futex,plist: pass the real head of the priority list to plist_del() > > Some plist_del()s in kernel/futex.c are passed a faked head of the > priority list. > > It does not fail because the current code does not require the real head > in plist_del(). The current code of plist_del() just uses the head for checking, > so it will not cause a bad result even when we use a faked head. > > But it is undocumented usage: > > /** > * plist_del - Remove a @node from plist. > * > * @node: &struct plist_node pointer - entry to be removed > * @head: &struct plist_head pointer - list head > */ > > The document said that @head is "list head" the head of the priority list. > > In futex code, several places use "plist_del(&q->list,&q->list.plist);", > they passes faked head, we fix them all. > > Thanks to Darren Hart for many suggestions. > > Signed-off-by: Lai Jiangshan<laijs@cn.fujitsu.com> > --- > diff --git a/kernel/futex.c b/kernel/futex.c > index 3019b92..d4f7252 100644 > --- a/kernel/futex.c > +++ b/kernel/futex.c > @@ -740,6 +740,24 @@ retry: > return ret; > } > > +/** > + * __unqueue_futex() - Remove the futex_q from its futex_hash_bucket > + * @q: The futex_q to unqueue > + * > + * The q->lock_ptr must not be NULL and must be held by the caller. > + */ > +static void __unqueue_futex(struct futex_q *q) > +{ > + struct futex_hash_bucket *hb; > + > + if (WARN_ON(!q->lock_ptr || !spin_is_locked(q->lock_ptr) > + || plist_node_empty(&q->list))) > + return; > + > + hb = container_of(q->lock_ptr, struct futex_hash_bucket, lock); > + plist_del(&q->list,&hb->chain); > +} > + > /* > * The hash bucket lock must be held when this is called. > * Afterwards, the futex_q must not be accessed. > @@ -757,7 +775,7 @@ static void wake_futex(struct futex_q *q) > */ > get_task_struct(p); > > - plist_del(&q->list,&q->list.plist); > + __unqueue_futex(q); > /* > * The waiting task can free the futex_q as soon as > * q->lock_ptr = NULL is written, without taking any locks. A > @@ -1066,8 +1084,7 @@ void requeue_pi_wake_futex(struct futex_q *q, union futex_key *key, > get_futex_key_refs(key); > q->key = *key; > > - WARN_ON(plist_node_empty(&q->list)); > - plist_del(&q->list,&q->list.plist); > + __unqueue_futex(q); > > WARN_ON(!q->rt_waiter); > q->rt_waiter = NULL; > @@ -1470,8 +1487,7 @@ retry: > spin_unlock(lock_ptr); > goto retry; > } > - WARN_ON(plist_node_empty(&q->list)); > - plist_del(&q->list,&q->list.plist); > + __unqueue_futex(q); > > BUG_ON(q->pi_state); > > @@ -1491,8 +1507,7 @@ retry: > static void unqueue_me_pi(struct futex_q *q) > __releases(q->lock_ptr) > { > - WARN_ON(plist_node_empty(&q->list)); > - plist_del(&q->list,&q->list.plist); > + __unqueue_futex(q); > > BUG_ON(!q->pi_state); > free_pi_state(q->pi_state); > @@ -2133,7 +2148,7 @@ int handle_early_requeue_pi_wakeup(struct futex_hash_bucket *hb, > * We were woken prior to requeue by a timeout or a signal. > * Unqueue the futex_q and determine which it was. > */ > - plist_del(&q->list,&q->list.plist); > + plist_del(&q->list,&hb->chain); > > /* Handle spurious wakeups gracefully */ > ret = -EWOULDBLOCK;
-- Darren Hart Yocto Linux Kernel --
unsubscribe notice
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to
majordomo@vger.kernel.org
More majordomo info at
http://vger.kernel.org/majordomo-info.html
Please read the FAQ at
http://www.tux.org/lkml/
Previous message: [
thread
] [
date
] [
author
]
Next message: [
thread
] [
date
] [
author
]
Messages in current thread:
[PATCH 1/4 V2 ] futex,plist: pass the real head of the pri ...
, Lai Jiangshan
, (Tue Dec 21, 2:55 am)
Re: [PATCH 1/4 V2 ] futex,plist: pass the real head of the ...
, Darren Hart
, (Tue Dec 21, 12:13 pm)
[PATCH 1/4 V3 ] futex,plist: pass the real head of the pri ...
, Lai Jiangshan
, (Tue Dec 21, 11:18 pm)
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the ...
, Darren Hart
, (Tue Dec 21, 11:50 pm)
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the ...
, Lai Jiangshan
, (Wed Dec 22, 2:02 am)
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the ...
, Darren Hart
, (Wed Dec 22, 9:22 am)
Re: [PATCH 1/4 V3 ] futex,plist: pass the real head of the ...
, Darren Hart
, (Wed Dec 22, 9:23 am)
Navigation
Mailing list archives
Recent posts
Popular discussions
linux-kernel
:
Greg KH
Og dreams of kernels