| From oneukum@suse.de Mon Apr 2 06:24:01 2007 |
| From: Oliver Neukum <oneukum@suse.de> |
| Date: Mon, 2 Apr 2007 14:47:59 +0200 |
| Subject: kref: fix CPU ordering with respect to krefs |
| To: Greg KH <gregkh@suse.de>, linux-kernel@vger.kernel.org |
| Message-ID: <200704021447.59476.oneukum@suse.de> |
| Content-Disposition: inline |
| |
| |
| 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> |
| |
| --- |
| lib/kref.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- 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(); |
| } |
| |
| /** |