linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Matteo Rizzo <matteorizzo@google.com>,
	linux-mm@kvack.org, linux-kernel@vger.kernel.org, cl@linux.com,
	penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com,
	akpm@linux-foundation.org, vbabka@suse.cz
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
	roman.gushchin@linux.dev, 42.hyeyoo@gmail.com, jannh@google.com,
	matteorizzo@google.com
Subject: Re: [PATCH] mm/slub: refactor freelist to use custom type
Date: Tue, 4 Jul 2023 12:15:03 +0800	[thread overview]
Message-ID: <202307041252.XCQcx0eb-lkp@intel.com> (raw)
In-Reply-To: <20230703143820.152479-1-matteorizzo@google.com>

Hi Matteo,

kernel test robot noticed the following build errors:

[auto build test ERROR on a901a3568fd26ca9c4a82d8bc5ed5b3ed844d451]

url:    https://github.com/intel-lab-lkp/linux/commits/Matteo-Rizzo/mm-slub-refactor-freelist-to-use-custom-type/20230703-223944
base:   a901a3568fd26ca9c4a82d8bc5ed5b3ed844d451
patch link:    https://lore.kernel.org/r/20230703143820.152479-1-matteorizzo%40google.com
patch subject: [PATCH] mm/slub: refactor freelist to use custom type
config: arm-randconfig-r001-20230703 (https://download.01.org/0day-ci/archive/20230704/202307041252.XCQcx0eb-lkp@intel.com/config)
compiler: clang version 15.0.7 (https://github.com/llvm/llvm-project.git 8dfdcc7b7bf66834a761bd8de445840ef68e4d1a)
reproduce: (https://download.01.org/0day-ci/archive/20230704/202307041252.XCQcx0eb-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202307041252.XCQcx0eb-lkp@intel.com/

All errors (new ones prefixed by >>):

   mm/slub.c:368:15: error: unknown type name 'freeptr_t'
   static inline freeptr_t freelist_ptr_encode(const struct kmem_cache *s,
                 ^
>> mm/slub.c:385:10: error: use of undeclared identifier 'freeptr_t'
           return (freeptr_t){.v = (unsigned long)ptr};
                   ^
   mm/slub.c:390:6: error: unknown type name 'freeptr_t'
                                           freeptr_t ptr, unsigned long ptr_addr)
                                           ^
>> mm/slub.c:408:45: error: expected expression
           return freelist_ptr_decode(s, *(freeptr_t *)(ptr_addr),
                                                      ^
   mm/slub.c:408:34: error: use of undeclared identifier 'freeptr_t'
           return freelist_ptr_decode(s, *(freeptr_t *)(ptr_addr),
                                           ^
   mm/slub.c:415:45: error: expected expression
           return freelist_dereference(s, (freeptr_t *)(object + s->offset));
                                                      ^
   mm/slub.c:415:34: error: use of undeclared identifier 'freeptr_t'
           return freelist_dereference(s, (freeptr_t *)(object + s->offset));
                                           ^
   mm/slub.c:439:2: error: use of undeclared identifier 'freeptr_t'
           freeptr_t p;
           ^
   mm/slub.c:446:43: error: expected expression
           copy_from_kernel_nofault(&p, (freeptr_t *)freepointer_addr, sizeof(p));
                                                    ^
   mm/slub.c:446:32: error: use of undeclared identifier 'freeptr_t'
           copy_from_kernel_nofault(&p, (freeptr_t *)freepointer_addr, sizeof(p));
                                         ^
>> mm/slub.c:446:69: error: use of undeclared identifier 'p'
           copy_from_kernel_nofault(&p, (freeptr_t *)freepointer_addr, sizeof(p));
                                                                              ^
   mm/slub.c:446:28: error: use of undeclared identifier 'p'
           copy_from_kernel_nofault(&p, (freeptr_t *)freepointer_addr, sizeof(p));
                                     ^
   mm/slub.c:447:32: error: use of undeclared identifier 'p'
           return freelist_ptr_decode(s, p, freepointer_addr);
                                         ^
   mm/slub.c:459:15: error: expected expression
           *(freeptr_t *)freeptr_addr = freelist_ptr_encode(s, fp, freeptr_addr);
                        ^
   mm/slub.c:459:4: error: use of undeclared identifier 'freeptr_t'
           *(freeptr_t *)freeptr_addr = freelist_ptr_encode(s, fp, freeptr_addr);
             ^
   mm/slub.c:2285:15: warning: variable 'partial_slabs' set but not used [-Wunused-but-set-variable]
           unsigned int partial_slabs = 0;
                        ^
   1 warning and 15 errors generated.


vim +/freeptr_t +385 mm/slub.c

   358	
   359	/********************************************************************
   360	 * 			Core slab cache functions
   361	 *******************************************************************/
   362	
   363	/*
   364	 * Returns freelist pointer (ptr). With hardening, this is obfuscated
   365	 * with an XOR of the address where the pointer is held and a per-cache
   366	 * random number.
   367	 */
 > 368	static inline freeptr_t freelist_ptr_encode(const struct kmem_cache *s,
   369						    void *ptr, unsigned long ptr_addr)
   370	{
   371	#ifdef CONFIG_SLAB_FREELIST_HARDENED
   372		/*
   373		 * When CONFIG_KASAN_SW/HW_TAGS is enabled, ptr_addr might be tagged.
   374		 * Normally, this doesn't cause any issues, as both set_freepointer()
   375		 * and get_freepointer() are called with a pointer with the same tag.
   376		 * However, there are some issues with CONFIG_SLUB_DEBUG code. For
   377		 * example, when __free_slub() iterates over objects in a cache, it
   378		 * passes untagged pointers to check_object(). check_object() in turns
   379		 * calls get_freepointer() with an untagged pointer, which causes the
   380		 * freepointer to be restored incorrectly.
   381		 */
   382		return (freeptr_t){.v = (unsigned long)ptr ^ s->random ^
   383				swab((unsigned long)kasan_reset_tag((void *)ptr_addr))};
   384	#else
 > 385		return (freeptr_t){.v = (unsigned long)ptr};
   386	#endif
   387	}
   388	
   389	static inline void *freelist_ptr_decode(const struct kmem_cache *s,
   390						freeptr_t ptr, unsigned long ptr_addr)
   391	{
   392		void *decoded;
   393	
   394	#ifdef CONFIG_SLAB_FREELIST_HARDENED
   395		/* See the comment in freelist_ptr_encode */
   396		decoded = (void *)(ptr.v ^ s->random ^
   397			swab((unsigned long)kasan_reset_tag((void *)ptr_addr)));
   398	#else
   399		decoded = (void *)ptr.v;
   400	#endif
   401		return decoded;
   402	}
   403	
   404	/* Returns the freelist pointer recorded at location ptr_addr. */
   405	static inline void *freelist_dereference(const struct kmem_cache *s,
   406						 void *ptr_addr)
   407	{
 > 408		return freelist_ptr_decode(s, *(freeptr_t *)(ptr_addr),
   409				    (unsigned long)ptr_addr);
   410	}
   411	
   412	static inline void *get_freepointer(struct kmem_cache *s, void *object)
   413	{
   414		object = kasan_reset_tag(object);
   415		return freelist_dereference(s, (freeptr_t *)(object + s->offset));
   416	}
   417	
   418	#ifndef CONFIG_SLUB_TINY
   419	static void prefetch_freepointer(const struct kmem_cache *s, void *object)
   420	{
   421		prefetchw(object + s->offset);
   422	}
   423	#endif
   424	
   425	/*
   426	 * When running under KMSAN, get_freepointer_safe() may return an uninitialized
   427	 * pointer value in the case the current thread loses the race for the next
   428	 * memory chunk in the freelist. In that case this_cpu_cmpxchg_double() in
   429	 * slab_alloc_node() will fail, so the uninitialized value won't be used, but
   430	 * KMSAN will still check all arguments of cmpxchg because of imperfect
   431	 * handling of inline assembly.
   432	 * To work around this problem, we apply __no_kmsan_checks to ensure that
   433	 * get_freepointer_safe() returns initialized memory.
   434	 */
   435	__no_kmsan_checks
   436	static inline void *get_freepointer_safe(struct kmem_cache *s, void *object)
   437	{
   438		unsigned long freepointer_addr;
 > 439		freeptr_t p;
   440	
   441		if (!debug_pagealloc_enabled_static())
   442			return get_freepointer(s, object);
   443	
   444		object = kasan_reset_tag(object);
   445		freepointer_addr = (unsigned long)object + s->offset;
 > 446		copy_from_kernel_nofault(&p, (freeptr_t *)freepointer_addr, sizeof(p));
   447		return freelist_ptr_decode(s, p, freepointer_addr);
   448	}
   449	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki


      parent reply	other threads:[~2023-07-04  4:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-03 14:38 Matteo Rizzo
2023-07-03 20:10 ` David Rientjes
2023-07-04 11:26   ` Matteo Rizzo
2023-07-04  4:15 ` kernel test robot [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202307041252.XCQcx0eb-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=42.hyeyoo@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=cl@linux.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=jannh@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=llvm@lists.linux.dev \
    --cc=matteorizzo@google.com \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=penberg@kernel.org \
    --cc=rientjes@google.com \
    --cc=roman.gushchin@linux.dev \
    --cc=vbabka@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox