summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Neukum <oneukum@suse.de>2007-04-02 14:47:59 +0200
committerGreg Kroah-Hartman <gregkh@suse.de>2007-04-27 19:57:29 +0200
commit1b0b3b9980e482ab7c603430462538334f69f14a (patch)
treec64274b8814f6c07570152479261c851bfeb7241
parentDriver core: remove unneeded completion from driver release path (diff)
downloadlinux-1b0b3b9980e482ab7c603430462538334f69f14a.tar.xz
linux-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>
-rw-r--r--lib/kref.c2
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();
}
/**