diff mbox

lib/stackdepot.c: use a non-instrumented version of memcpy()

Message ID 20180516153434.24479-1-glider@google.com (mailing list archive)
State New, archived
Headers show

Commit Message

Alexander Potapenko May 16, 2018, 3:34 p.m. UTC
stackdepot used to call memcpy(), which compiler tools normally
instrument, therefore every lookup used to unnecessarily call instrumented
code.  This is somewhat ok in the case of KASAN, but under KMSAN a lot of
time was spent in the instrumentation.

(A similar change has been previously committed for memcmp())

Signed-off-by: Alexander Potapenko <glider@google.com>
Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
---
 lib/stackdepot.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Andrey Ryabinin May 16, 2018, 4:47 p.m. UTC | #1
On 05/16/2018 06:34 PM, Alexander Potapenko wrote:
> stackdepot used to call memcpy(), which compiler tools normally
> instrument, therefore every lookup used to unnecessarily call instrumented
> code.  This is somewhat ok in the case of KASAN, but under KMSAN a lot of
> time was spent in the instrumentation.
> 
> (A similar change has been previously committed for memcmp())
> 
> Signed-off-by: Alexander Potapenko <glider@google.com>
> Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
> Cc: Dmitry Vyukov <dvyukov@google.com>
> ---
>  lib/stackdepot.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/lib/stackdepot.c b/lib/stackdepot.c
> index e513459a5601..d48c744fa750 100644
> --- a/lib/stackdepot.c
> +++ b/lib/stackdepot.c
> @@ -140,7 +140,7 @@ static struct stack_record *depot_alloc_stack(unsigned long *entries, int size,
>  	stack->handle.slabindex = depot_index;
>  	stack->handle.offset = depot_offset >> STACK_ALLOC_ALIGN;
>  	stack->handle.valid = 1;
> -	memcpy(stack->entries, entries, size * sizeof(unsigned long));
> +	__memcpy(stack->entries, entries, size * sizeof(unsigned long));

This has no effect. Since the whole file is not instrumented memcpy automagically replaced with __memcpy.
Alexander Potapenko May 17, 2018, 8:53 a.m. UTC | #2
On Wed, May 16, 2018 at 6:45 PM Andrey Ryabinin <aryabinin@virtuozzo.com>
wrote:

> On 05/16/2018 06:34 PM, Alexander Potapenko wrote:
> > stackdepot used to call memcpy(), which compiler tools normally
> > instrument, therefore every lookup used to unnecessarily call
instrumented
> > code.  This is somewhat ok in the case of KASAN, but under KMSAN a lot
of
> > time was spent in the instrumentation.
> >
> > (A similar change has been previously committed for memcmp())
> >
> > Signed-off-by: Alexander Potapenko <glider@google.com>
> > Cc: Andrey Ryabinin <aryabinin@virtuozzo.com>
> > Cc: Dmitry Vyukov <dvyukov@google.com>
> > ---
> >  lib/stackdepot.c | 2 +-
> >  1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/lib/stackdepot.c b/lib/stackdepot.c
> > index e513459a5601..d48c744fa750 100644
> > --- a/lib/stackdepot.c
> > +++ b/lib/stackdepot.c
> > @@ -140,7 +140,7 @@ static struct stack_record
*depot_alloc_stack(unsigned long *entries, int size,
> >       stack->handle.slabindex = depot_index;
> >       stack->handle.offset = depot_offset >> STACK_ALLOC_ALIGN;
> >       stack->handle.valid = 1;
> > -     memcpy(stack->entries, entries, size * sizeof(unsigned long));
> > +     __memcpy(stack->entries, entries, size * sizeof(unsigned long));

> This has no effect. Since the whole file is not instrumented memcpy
automagically replaced with __memcpy.
You're right, we just didn't have the code defining memcpy() to __memcpy()
in KMSAN. I'll fix that instead.
kernel test robot May 18, 2018, 1:04 a.m. UTC | #3
Hi Alexander,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v4.17-rc5 next-20180517]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Alexander-Potapenko/lib-stackdepot-c-use-a-non-instrumented-version-of-memcpy/20180518-015328
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=sh 

All errors (new ones prefixed by >>):

   lib/stackdepot.c: In function 'depot_alloc_stack':
>> lib/stackdepot.c:143:2: error: implicit declaration of function '__memcpy'; did you mean 'memcpy'? [-Werror=implicit-function-declaration]
     __memcpy(stack->entries, entries, size * sizeof(unsigned long));
     ^~~~~~~~
     memcpy
   cc1: some warnings being treated as errors

vim +143 lib/stackdepot.c

   106	
   107	/* Allocation of a new stack in raw storage */
   108	static struct stack_record *depot_alloc_stack(unsigned long *entries, int size,
   109			u32 hash, void **prealloc, gfp_t alloc_flags)
   110	{
   111		int required_size = offsetof(struct stack_record, entries) +
   112			sizeof(unsigned long) * size;
   113		struct stack_record *stack;
   114	
   115		required_size = ALIGN(required_size, 1 << STACK_ALLOC_ALIGN);
   116	
   117		if (unlikely(depot_offset + required_size > STACK_ALLOC_SIZE)) {
   118			if (unlikely(depot_index + 1 >= STACK_ALLOC_MAX_SLABS)) {
   119				WARN_ONCE(1, "Stack depot reached limit capacity");
   120				return NULL;
   121			}
   122			depot_index++;
   123			depot_offset = 0;
   124			/*
   125			 * smp_store_release() here pairs with smp_load_acquire() from
   126			 * |next_slab_inited| in depot_save_stack() and
   127			 * init_stack_slab().
   128			 */
   129			if (depot_index + 1 < STACK_ALLOC_MAX_SLABS)
   130				smp_store_release(&next_slab_inited, 0);
   131		}
   132		init_stack_slab(prealloc);
   133		if (stack_slabs[depot_index] == NULL)
   134			return NULL;
   135	
   136		stack = stack_slabs[depot_index] + depot_offset;
   137	
   138		stack->hash = hash;
   139		stack->size = size;
   140		stack->handle.slabindex = depot_index;
   141		stack->handle.offset = depot_offset >> STACK_ALLOC_ALIGN;
   142		stack->handle.valid = 1;
 > 143		__memcpy(stack->entries, entries, size * sizeof(unsigned long));
   144		depot_offset += required_size;
   145	
   146		return stack;
   147	}
   148	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/lib/stackdepot.c b/lib/stackdepot.c
index e513459a5601..d48c744fa750 100644
--- a/lib/stackdepot.c
+++ b/lib/stackdepot.c
@@ -140,7 +140,7 @@  static struct stack_record *depot_alloc_stack(unsigned long *entries, int size,
 	stack->handle.slabindex = depot_index;
 	stack->handle.offset = depot_offset >> STACK_ALLOC_ALIGN;
 	stack->handle.valid = 1;
-	memcpy(stack->entries, entries, size * sizeof(unsigned long));
+	__memcpy(stack->entries, entries, size * sizeof(unsigned long));
 	depot_offset += required_size;
 
 	return stack;