[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1315461646-1379-4-git-send-email-ying.huang@intel.com>
Date: Thu, 8 Sep 2011 14:00:44 +0800
From: Huang Ying <ying.huang@...el.com>
To: Andrew Morton <akpm@...ux-foundation.org>
Cc: linux-kernel@...r.kernel.org, Andi Kleen <andi@...stfloor.org>,
ying.huang@...el.com, Peter Zijlstra <peterz@...radead.org>,
Mathieu Desnoyers <mathieu.desnoyers@...icios.com>
Subject: [PATCH -mm -v2 3/5] llist, Move cpu_relax after cmpxchg
If the first cmpxchg calling succeeds, it is not necessary to use
cpu_relax before cmpxchg. So cpu_relax in a busy loop involving
cmpxchg should go after cmpxchg instead of before that. This patch
fixes this in llist.
Signed-off-by: Huang Ying <ying.huang@...el.com>
Acked-by: Mathieu Desnoyers <mathieu.desnoyers@...icios.com>
Cc: Peter Zijlstra <peterz@...radead.org>
---
include/linux/llist.h | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
--- a/include/linux/llist.h
+++ b/include/linux/llist.h
@@ -156,11 +156,14 @@ static inline void llist_add(struct llis
CHECK_NMI_SAFE_CMPXCHG();
entry = head->first;
- do {
+ for (;;) {
old_entry = entry;
new->next = entry;
+ entry = cmpxchg(&head->first, old_entry, new);
+ if (entry == old_entry)
+ break;
cpu_relax();
- } while ((entry = cmpxchg(&head->first, old_entry, new)) != old_entry);
+ }
}
/**
@@ -178,11 +181,14 @@ static inline void llist_add_batch(struc
CHECK_NMI_SAFE_CMPXCHG();
entry = head->first;
- do {
+ for (;;) {
old_entry = entry;
new_last->next = entry;
+ entry = cmpxchg(&head->first, old_entry, new_first);
+ if (entry == old_entry)
+ break;
cpu_relax();
- } while ((entry = cmpxchg(&head->first, old_entry, new_first)) != old_entry);
+ }
}
/**
@@ -206,13 +212,16 @@ static inline struct llist_node *llist_d
CHECK_NMI_SAFE_CMPXCHG();
entry = head->first;
- do {
+ for (;;) {
if (entry == NULL)
return NULL;
old_entry = entry;
next = entry->next;
+ entry = cmpxchg(&head->first, old_entry, next);
+ if (entry == old_entry)
+ break;
cpu_relax();
- } while ((entry = cmpxchg(&head->first, old_entry, next)) != old_entry);
+ }
return entry;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists