mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
c8afaa1b0f
The only remaining consumer is new_inode, where it showed up in 2001 as commit c37fa164f793 ("v2.4.9.9 -> v2.4.9.10") in a historical repo [1] with a changelog which does not mention it. Since then the line got only touched up to keep compiling. While it may have been of benefit back in the day, it is guaranteed to at best not get in the way in the multicore setting -- as the code performs *a lot* of work between the prefetch and actual lock acquire, any contention means the cacheline is already invalid by the time the routine calls spin_lock(). It adds spurious traffic, for short. On top of it prefetch is notoriously tricky to use for single-threaded purposes, making it questionable from the get go. As such, remove it. I admit upfront I did not see value in benchmarking this change, but I can do it if that is deemed appropriate. Removal from new_inode and of the entire thing are in the same patch as requested by Linus, so whatever weird looks can be directed at that guy. Link: https://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git/commit/fs/inode.c?id=c37fa164f793735b32aa3f53154ff1a7659e6442 [1] Signed-off-by: Mateusz Guzik <mjguzik@gmail.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Generic cache management functions. Everything is arch-specific,
|
|
* but this header exists to make sure the defines/functions can be
|
|
* used in a generic way.
|
|
*
|
|
* 2000-11-13 Arjan van de Ven <arjan@fenrus.demon.nl>
|
|
*
|
|
*/
|
|
|
|
#ifndef _LINUX_PREFETCH_H
|
|
#define _LINUX_PREFETCH_H
|
|
|
|
#include <linux/types.h>
|
|
#include <asm/processor.h>
|
|
#include <asm/cache.h>
|
|
|
|
struct page;
|
|
/*
|
|
prefetch(x) attempts to pre-emptively get the memory pointed to
|
|
by address "x" into the CPU L1 cache.
|
|
prefetch(x) should not cause any kind of exception, prefetch(0) is
|
|
specifically ok.
|
|
|
|
prefetch() should be defined by the architecture, if not, the
|
|
#define below provides a no-op define.
|
|
|
|
There are 2 prefetch() macros:
|
|
|
|
prefetch(x) - prefetches the cacheline at "x" for read
|
|
prefetchw(x) - prefetches the cacheline at "x" for write
|
|
|
|
there is also PREFETCH_STRIDE which is the architecure-preferred
|
|
"lookahead" size for prefetching streamed operations.
|
|
|
|
*/
|
|
|
|
#ifndef ARCH_HAS_PREFETCH
|
|
#define prefetch(x) __builtin_prefetch(x)
|
|
#endif
|
|
|
|
#ifndef ARCH_HAS_PREFETCHW
|
|
#define prefetchw(x) __builtin_prefetch(x,1)
|
|
#endif
|
|
|
|
#ifndef PREFETCH_STRIDE
|
|
#define PREFETCH_STRIDE (4*L1_CACHE_BYTES)
|
|
#endif
|
|
|
|
static inline void prefetch_range(void *addr, size_t len)
|
|
{
|
|
#ifdef ARCH_HAS_PREFETCH
|
|
char *cp;
|
|
char *end = addr + len;
|
|
|
|
for (cp = addr; cp < end; cp += PREFETCH_STRIDE)
|
|
prefetch(cp);
|
|
#endif
|
|
}
|
|
|
|
static inline void prefetch_page_address(struct page *page)
|
|
{
|
|
#if defined(WANT_PAGE_VIRTUAL) || defined(HASHED_PAGE_VIRTUAL)
|
|
prefetch(page);
|
|
#endif
|
|
}
|
|
|
|
#endif
|