Skip to content

Commit e66eed6

Browse files
committed
list: remove prefetching from regular list iterators
This is removes the use of software prefetching from the regular list iterators. We don't want it. If you do want to prefetch in some iterator of yours, go right ahead. Just don't expect the iterator to do it, since normally the downsides are bigger than the upsides. It also replaces <linux/prefetch.h> with <linux/const.h>, because the use of LIST_POISON ends up needing it. <linux/poison.h> is sadly not self-contained, and including prefetch.h just happened to hide that. Suggested by David Miller (networking has a lot of regular lists that are often empty or a single entry, and prefetching is not going to do anything but add useless instructions). Acked-by: Ingo Molnar <mingo@elte.hu> Acked-by: David S. Miller <davem@davemloft.net> Cc: linux-arch@vger.kernel.org Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 75d65a4 commit e66eed6

2 files changed

Lines changed: 14 additions & 18 deletions

File tree

include/linux/list.h

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <linux/types.h>
55
#include <linux/stddef.h>
66
#include <linux/poison.h>
7-
#include <linux/prefetch.h>
7+
#include <linux/const.h>
88

99
/*
1010
* Simple doubly linked list implementation.
@@ -367,18 +367,15 @@ static inline void list_splice_tail_init(struct list_head *list,
367367
* @head: the head for your list.
368368
*/
369369
#define list_for_each(pos, head) \
370-
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
371-
pos = pos->next)
370+
for (pos = (head)->next; pos != (head); pos = pos->next)
372371

373372
/**
374373
* __list_for_each - iterate over a list
375374
* @pos: the &struct list_head to use as a loop cursor.
376375
* @head: the head for your list.
377376
*
378-
* This variant differs from list_for_each() in that it's the
379-
* simplest possible list iteration code, no prefetching is done.
380-
* Use this for code that knows the list to be very short (empty
381-
* or 1 entry) most of the time.
377+
* This variant doesn't differ from list_for_each() any more.
378+
* We don't do prefetching in either case.
382379
*/
383380
#define __list_for_each(pos, head) \
384381
for (pos = (head)->next; pos != (head); pos = pos->next)
@@ -389,8 +386,7 @@ static inline void list_splice_tail_init(struct list_head *list,
389386
* @head: the head for your list.
390387
*/
391388
#define list_for_each_prev(pos, head) \
392-
for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
393-
pos = pos->prev)
389+
for (pos = (head)->prev; pos != (head); pos = pos->prev)
394390

395391
/**
396392
* list_for_each_safe - iterate over a list safe against removal of list entry
@@ -410,7 +406,7 @@ static inline void list_splice_tail_init(struct list_head *list,
410406
*/
411407
#define list_for_each_prev_safe(pos, n, head) \
412408
for (pos = (head)->prev, n = pos->prev; \
413-
prefetch(pos->prev), pos != (head); \
409+
pos != (head); \
414410
pos = n, n = pos->prev)
415411

416412
/**
@@ -421,7 +417,7 @@ static inline void list_splice_tail_init(struct list_head *list,
421417
*/
422418
#define list_for_each_entry(pos, head, member) \
423419
for (pos = list_entry((head)->next, typeof(*pos), member); \
424-
prefetch(pos->member.next), &pos->member != (head); \
420+
&pos->member != (head); \
425421
pos = list_entry(pos->member.next, typeof(*pos), member))
426422

427423
/**
@@ -432,7 +428,7 @@ static inline void list_splice_tail_init(struct list_head *list,
432428
*/
433429
#define list_for_each_entry_reverse(pos, head, member) \
434430
for (pos = list_entry((head)->prev, typeof(*pos), member); \
435-
prefetch(pos->member.prev), &pos->member != (head); \
431+
&pos->member != (head); \
436432
pos = list_entry(pos->member.prev, typeof(*pos), member))
437433

438434
/**
@@ -457,7 +453,7 @@ static inline void list_splice_tail_init(struct list_head *list,
457453
*/
458454
#define list_for_each_entry_continue(pos, head, member) \
459455
for (pos = list_entry(pos->member.next, typeof(*pos), member); \
460-
prefetch(pos->member.next), &pos->member != (head); \
456+
&pos->member != (head); \
461457
pos = list_entry(pos->member.next, typeof(*pos), member))
462458

463459
/**
@@ -471,7 +467,7 @@ static inline void list_splice_tail_init(struct list_head *list,
471467
*/
472468
#define list_for_each_entry_continue_reverse(pos, head, member) \
473469
for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
474-
prefetch(pos->member.prev), &pos->member != (head); \
470+
&pos->member != (head); \
475471
pos = list_entry(pos->member.prev, typeof(*pos), member))
476472

477473
/**
@@ -483,7 +479,7 @@ static inline void list_splice_tail_init(struct list_head *list,
483479
* Iterate over list of given type, continuing from current position.
484480
*/
485481
#define list_for_each_entry_from(pos, head, member) \
486-
for (; prefetch(pos->member.next), &pos->member != (head); \
482+
for (; &pos->member != (head); \
487483
pos = list_entry(pos->member.next, typeof(*pos), member))
488484

489485
/**

include/linux/rculist.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ static inline void list_splice_init_rcu(struct list_head *list,
253253
*/
254254
#define list_for_each_entry_rcu(pos, head, member) \
255255
for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
256-
prefetch(pos->member.next), &pos->member != (head); \
256+
&pos->member != (head); \
257257
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
258258

259259

@@ -270,7 +270,7 @@ static inline void list_splice_init_rcu(struct list_head *list,
270270
*/
271271
#define list_for_each_continue_rcu(pos, head) \
272272
for ((pos) = rcu_dereference_raw(list_next_rcu(pos)); \
273-
prefetch((pos)->next), (pos) != (head); \
273+
(pos) != (head); \
274274
(pos) = rcu_dereference_raw(list_next_rcu(pos)))
275275

276276
/**
@@ -284,7 +284,7 @@ static inline void list_splice_init_rcu(struct list_head *list,
284284
*/
285285
#define list_for_each_entry_continue_rcu(pos, head, member) \
286286
for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \
287-
prefetch(pos->member.next), &pos->member != (head); \
287+
&pos->member != (head); \
288288
pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
289289

290290
/**

0 commit comments

Comments
 (0)