Commit e66eed651fd18a961f11cda62f3b5286c8cc4f9f

Authored by Linus Torvalds
1 parent 75d65a425c

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>

Showing 2 changed files with 14 additions and 18 deletions Side-by-side Diff

include/linux/list.h
... ... @@ -4,7 +4,7 @@
4 4 #include <linux/types.h>
5 5 #include <linux/stddef.h>
6 6 #include <linux/poison.h>
7   -#include <linux/prefetch.h>
  7 +#include <linux/const.h>
8 8  
9 9 /*
10 10 * Simple doubly linked list implementation.
11 11  
... ... @@ -367,18 +367,15 @@
367 367 * @head: the head for your list.
368 368 */
369 369 #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)
372 371  
373 372 /**
374 373 * __list_for_each - iterate over a list
375 374 * @pos: the &struct list_head to use as a loop cursor.
376 375 * @head: the head for your list.
377 376 *
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.
382 379 */
383 380 #define __list_for_each(pos, head) \
384 381 for (pos = (head)->next; pos != (head); pos = pos->next)
... ... @@ -389,8 +386,7 @@
389 386 * @head: the head for your list.
390 387 */
391 388 #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)
394 390  
395 391 /**
396 392 * list_for_each_safe - iterate over a list safe against removal of list entry
... ... @@ -410,7 +406,7 @@
410 406 */
411 407 #define list_for_each_prev_safe(pos, n, head) \
412 408 for (pos = (head)->prev, n = pos->prev; \
413   - prefetch(pos->prev), pos != (head); \
  409 + pos != (head); \
414 410 pos = n, n = pos->prev)
415 411  
416 412 /**
... ... @@ -421,7 +417,7 @@
421 417 */
422 418 #define list_for_each_entry(pos, head, member) \
423 419 for (pos = list_entry((head)->next, typeof(*pos), member); \
424   - prefetch(pos->member.next), &pos->member != (head); \
  420 + &pos->member != (head); \
425 421 pos = list_entry(pos->member.next, typeof(*pos), member))
426 422  
427 423 /**
... ... @@ -432,7 +428,7 @@
432 428 */
433 429 #define list_for_each_entry_reverse(pos, head, member) \
434 430 for (pos = list_entry((head)->prev, typeof(*pos), member); \
435   - prefetch(pos->member.prev), &pos->member != (head); \
  431 + &pos->member != (head); \
436 432 pos = list_entry(pos->member.prev, typeof(*pos), member))
437 433  
438 434 /**
... ... @@ -457,7 +453,7 @@
457 453 */
458 454 #define list_for_each_entry_continue(pos, head, member) \
459 455 for (pos = list_entry(pos->member.next, typeof(*pos), member); \
460   - prefetch(pos->member.next), &pos->member != (head); \
  456 + &pos->member != (head); \
461 457 pos = list_entry(pos->member.next, typeof(*pos), member))
462 458  
463 459 /**
... ... @@ -471,7 +467,7 @@
471 467 */
472 468 #define list_for_each_entry_continue_reverse(pos, head, member) \
473 469 for (pos = list_entry(pos->member.prev, typeof(*pos), member); \
474   - prefetch(pos->member.prev), &pos->member != (head); \
  470 + &pos->member != (head); \
475 471 pos = list_entry(pos->member.prev, typeof(*pos), member))
476 472  
477 473 /**
... ... @@ -483,7 +479,7 @@
483 479 * Iterate over list of given type, continuing from current position.
484 480 */
485 481 #define list_for_each_entry_from(pos, head, member) \
486   - for (; prefetch(pos->member.next), &pos->member != (head); \
  482 + for (; &pos->member != (head); \
487 483 pos = list_entry(pos->member.next, typeof(*pos), member))
488 484  
489 485 /**
include/linux/rculist.h
... ... @@ -253,7 +253,7 @@
253 253 */
254 254 #define list_for_each_entry_rcu(pos, head, member) \
255 255 for (pos = list_entry_rcu((head)->next, typeof(*pos), member); \
256   - prefetch(pos->member.next), &pos->member != (head); \
  256 + &pos->member != (head); \
257 257 pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
258 258  
259 259  
... ... @@ -270,7 +270,7 @@
270 270 */
271 271 #define list_for_each_continue_rcu(pos, head) \
272 272 for ((pos) = rcu_dereference_raw(list_next_rcu(pos)); \
273   - prefetch((pos)->next), (pos) != (head); \
  273 + (pos) != (head); \
274 274 (pos) = rcu_dereference_raw(list_next_rcu(pos)))
275 275  
276 276 /**
... ... @@ -284,7 +284,7 @@
284 284 */
285 285 #define list_for_each_entry_continue_rcu(pos, head, member) \
286 286 for (pos = list_entry_rcu(pos->member.next, typeof(*pos), member); \
287   - prefetch(pos->member.next), &pos->member != (head); \
  287 + &pos->member != (head); \
288 288 pos = list_entry_rcu(pos->member.next, typeof(*pos), member))
289 289  
290 290 /**