Messages in this thread Patch in this message | | | Date | Fri, 10 Oct 2008 11:06:21 +0800 | From | Lai Jiangshan <> | Subject | [PATCH] markers: bit-field is not thread-safe nor smp-safe |
| |
bit-field is not thread-safe nor smp-safe.
struct marker_entry.rcu_pending is not protected by any lock in rcu-callback free_old_closure(). so we must turn it into a safe type.
detail:
I suppose rcu_pending and ptype are store in struct marker_entry.tmp1
free_old_closure() side: change ptype side:
| load struct marker_entry.tmp1 --------------------------------|-------------------------------- | change ptype bit in tmp1 load struct marker_entry.tmp1 | change rcu_pending bit in tmp1 | store tmp1 | --------------------------------|-------------------------------- | store tmp1
now this result equals that free_old_closure() do not change rcu_pending bit, bug.
see also: http://en.wikipedia.org/wiki/Bit_field
Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com> --- diff --git a/kernel/marker.c b/kernel/marker.c index 7d1faec..4777218 100644 --- a/kernel/marker.c +++ b/kernel/marker.c @@ -62,7 +62,7 @@ struct marker_entry { int refcount; /* Number of times armed. 0 if disarmed. */ struct rcu_head rcu; void *oldptr; - unsigned char rcu_pending:1; + unsigned char rcu_pending; unsigned char ptype:1; char name[0]; /* Contains name'\0'format'\0' */ };
| |