diff options
author | Oliver Neukum <oneukum@suse.de> | 2007-04-02 14:47:59 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-04-27 10:57:29 -0700 |
commit | 1b0b3b9980e482ab7c603430462538334f69f14a (patch) | |
tree | c64274b8814f6c07570152479261c851bfeb7241 /lib/kref.c | |
parent | 74e9f5fa1570f956c96dd5d3f1053daedbbf01a0 (diff) | |
download | lwn-1b0b3b9980e482ab7c603430462538334f69f14a.tar.gz lwn-1b0b3b9980e482ab7c603430462538334f69f14a.zip |
kref: fix CPU ordering with respect to krefs
some atomic operations are only atomic, not ordered. Thus a CPU is allowed
to reorder memory references to an object to before the reference is
obtained. This fixes it.
Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'lib/kref.c')
-rw-r--r-- | lib/kref.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/lib/kref.c b/lib/kref.c index 0d07cc31c818..a6dc3ec328e0 100644 --- a/lib/kref.c +++ b/lib/kref.c @@ -21,6 +21,7 @@ void kref_init(struct kref *kref) { atomic_set(&kref->refcount,1); + smp_mb(); } /** @@ -31,6 +32,7 @@ void kref_get(struct kref *kref) { WARN_ON(!atomic_read(&kref->refcount)); atomic_inc(&kref->refcount); + smp_mb__after_atomic_inc(); } /** |