On Mon, Oct 11, 2021 at 10:33:02AM +0000, Hyeonggon Yoo wrote: > Hello Vlastimil. > > On Mon, Oct 11, 2021 at 09:21:01AM +0200, Vlastimil Babka wrote: > > On 10/11/21 00:49, David Rientjes wrote: > > > On Fri, 8 Oct 2021, Hyeonggon Yoo wrote: > > > > > >> It's certain that an object will be not only read, but also > > >> written after allocation. > > >> > > > > > > Why is it certain? I think perhaps what you meant to say is that if we > > > are doing any prefetching here, then access will benefit from prefetchw > > > instead of prefetch. But it's not "certain" that allocated memory will be > > > accessed at all. > > > > I think the primary reason there's a prefetch is freelist traversal. The > > cacheline we prefetch will be read during the next allocation, so if we > > expect there to be one soon, prefetch might help. > > I agree that. > > > That the freepointer is > > part of object itself and thus the cache line will be probably accessed also > > after the allocation, is secondary. > > Right. it depends on cache line size and whether first cache line of an > object is frequently accessed or not. Not first cache line because free pointer is in the middle of object or out of object area. my mistake. > >> Use prefetchw instead of prefetchw. On supported architecture > > > > If we're using prefetchw instead of prefetchw, I think the diff would be > > 0 lines changed :) > > > >> like x86, it helps to invalidate cache line when the object exists > >> in other processors' cache. > >> > >> Signed-off-by: Hyeonggon Yoo <42.hyeyoo@xxxxxxxxx> > >> --- > >> mm/slub.c | 7 +++---- > >> 1 file changed, 3 insertions(+), 4 deletions(-) > >> > >> diff --git a/mm/slub.c b/mm/slub.c > >> index 3d2025f7163b..2aca7523165e 100644 > >> --- a/mm/slub.c > >> +++ b/mm/slub.c > >> @@ -352,9 +352,9 @@ static inline void *get_freepointer(struct kmem_cache *s, void *object) > >> return freelist_dereference(s, object + s->offset); > >> } > >> > >> -static void prefetch_freepointer(const struct kmem_cache *s, void *object) > >> +static void prefetchw_freepointer(const struct kmem_cache *s, void *object) > > I wouldn't rename the function itself, unless we have both variants for > different situations (we don't). That it uses prefetchw() is internal detail > at this point. looks good. that is simpler.