From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 253BAECE579 for ; Mon, 9 Sep 2024 16:24:38 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6636C6B00B6; Mon, 9 Sep 2024 12:24:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 5ECDF6B00C2; Mon, 9 Sep 2024 12:24:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 48DE06B00C3; Mon, 9 Sep 2024 12:24:37 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 2BBB66B00B6 for ; Mon, 9 Sep 2024 12:24:37 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id A279F1A0AAA for ; Mon, 9 Sep 2024 16:24:36 +0000 (UTC) X-FDA: 82545722952.09.9044118 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) by imf01.hostedemail.com (Postfix) with ESMTP id C15FC40004 for ; Mon, 9 Sep 2024 16:24:34 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="E/f4yG/U"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of andreyknvl@gmail.com designates 209.85.128.42 as permitted sender) smtp.mailfrom=andreyknvl@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1725898992; a=rsa-sha256; cv=none; b=7Yd2FLd5SoBlBUfmEzN9N1qHyZ2a2uydF0sae+0Gs/8ldtw62scAadKuF/Tzg7wPWOPYvd f2uIWQ3xZXFluR2WlmKQ/xNwL0SzO4FocPdTmn7Ps3n4c/uPvBAhdxhyRvLx/HayVyJJws LavPZhyHpAke+jvhUPeR80+FuAYlMNQ= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="E/f4yG/U"; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf01.hostedemail.com: domain of andreyknvl@gmail.com designates 209.85.128.42 as permitted sender) smtp.mailfrom=andreyknvl@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1725898992; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=bTdPIISC7QCFQ1CliKh1ID7iwFPfjIWMG7u/QhygHqE=; b=u6ypfbnl4pkNEmJdkZOnWy+BpGsPWIxphPpyoiFpifdFeMP0k+wqDfx5kfkdjaLVqv4+e2 yPJV85/EQWrjwi2W9HemFPSfdtkqITAgogU9OccGGh9I426T8cDh+Kjx4XhBaz9Ai0VFJk nDyPqBG6JiY+V4hL2+ifN4gZokZ69q0= Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-42bb7298bdeso53542275e9.1 for ; Mon, 09 Sep 2024 09:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1725899073; x=1726503873; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=bTdPIISC7QCFQ1CliKh1ID7iwFPfjIWMG7u/QhygHqE=; b=E/f4yG/U0UD0hneaMgxKhMXKoWX9EtXUXgsp2/PXJOtvse8EkXWVZ+c4ivVC+x6cIu RoXV8Z61cggJVaEiFSp/kiwTMvvuOzw1eyN05JgpGin/mM0zQGy7jFMTpKaGw2C4ambK NUCjmpdUVxEqSDkuhxWt1mKSR3MOd2el54z0JpcHVuyczOth7tyayR1etqtYWG9QsRam QV+ZZPPaA+10ekOWmNJulILq4R+FT7U6dCHFF9VjC0TSLfVWoZ3PahvBv4AH1I4rrg0/ jOUjK0m8V+clZgy6rDpJjfdUDNM6U0alEHtpgyTUv0Hh8Npn0HXb6/v5qRP3KAZesSnP rIWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725899073; x=1726503873; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bTdPIISC7QCFQ1CliKh1ID7iwFPfjIWMG7u/QhygHqE=; b=cm6JQqxLR72vN0EjfwA5peNrpj2VxWYZo5J9Bv8tztSf/M9fTIdJ8ZdD3tgLDbe1PS rA1nOCx6EmPTA356oOp432M7H18zhl+a61xajWkE1hHdE4HC5ofemaJcXRYpvL5RvQoC yH5Umr3EF3aPQ/rDLqyEGx28JbIKR9/b+Qyur6bYVWUgdZ2YT2XFgFUIfRK4rmcNeNTU 3ivWnkK63Mm0dTvRSlDBui8WkMoqyyPud11pZafpWibGtytVS/PFaF13ix+V3S07CCbH YNC91WX9TKJLW1QtGICadIb1RrBSBWTtbFCygEZmAJLmBQ4KDJ7y0pVDJZe2bOdoY0u6 fIeQ== X-Forwarded-Encrypted: i=1; AJvYcCV0hUtLhTYJ7B3p/o8/xMnPeFYSW/bGlNiRE1DvxbeRRyYKTI/CEiiExiTYRiF/X66JzeEJrpT/0w==@kvack.org X-Gm-Message-State: AOJu0YwCFEPcntk573eJBX+61SKf248ZoRnoPh4tzTK2ZL1jCCql9EBN /ADJdunNXssH/pBaWctbDqvBlHD2rkEpuMOcztR5eOjyXXcQG9PiFiVi04Jir2ztd/N2H2tGJrj /CS+gbgNiAUuxlmFiOw1VwLKxQIY= X-Google-Smtp-Source: AGHT+IEa9vusa1dYi5rukRbMZKTu7GjjtsVEDL9x/ZsO1PQhj18CTLXrJN6VsmoyvPyaXW5/GIxlVZ/FMC4JBFqmqPA= X-Received: by 2002:a05:600c:4753:b0:42b:ac3d:3abc with SMTP id 5b1f17b1804b1-42c9f9e08famr102166945e9.24.1725899072151; Mon, 09 Sep 2024 09:24:32 -0700 (PDT) MIME-Version: 1.0 References: <20240909012958.913438-1-feng.tang@intel.com> <20240909012958.913438-2-feng.tang@intel.com> In-Reply-To: <20240909012958.913438-2-feng.tang@intel.com> From: Andrey Konovalov Date: Mon, 9 Sep 2024 18:24:21 +0200 Message-ID: Subject: Re: [PATCH 1/5] mm/kasan: Don't store metadata inside kmalloc object when slub_debug_orig_size is on To: Feng Tang Cc: Vlastimil Babka , Andrew Morton , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Roman Gushchin , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Marco Elver , Shuah Khan , David Gow , Danilo Krummrich , linux-mm@kvack.org, kasan-dev@googlegroups.com, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: C15FC40004 X-Stat-Signature: hpw9ip6rn7sed66aq7ykmz9xkynsn1xh X-Rspam-User: X-HE-Tag: 1725899074-110647 X-HE-Meta: U2FsdGVkX18XRAMGrOAKG4y1ByBwiQQRprfndrwAGBFQAF6bNDAgu86U2K13dDFgaRQSR/rjXE6hKhRmGjzfkrpDJ2sS67So1VHf3DQ/7hMehYlU89YaxXrhHLwwH4/f872+n6GFezO20aZHcRjlb/4TS5lfJIUoRQBZudOKFLMNE1kSdLjqy9IxOwIBzoy2uarIUn6jFsmChnlXxM7bihLNddpt6KX64WtYrnHueOro54HLdTNOOBylgzZSV6sIIpB9/pGx215kKe0kIal9Jn8J5fRtk4g7qgI2fVP8ECExdbDOWjVcPidAZi0CVLAMijJbFlGf2GoJ+xa+xK2YA2qHINxB5hXlCtI3FORdsPLlrLjZ2v98gIbeomI79GO5w74TcRsATmlQkVBOhhtsMGYzjLs+OQNZYgBrGnUILW48Hlx2C3yGIw7OLSnBihVKaxSdrIZ+b9dWC4EhrNGK2vP+sI9Ip1Z4UFRblPh2VUrg865wwssGNhtcuai4hZVb0gC/RmcxxyIhSQ95SUMuO3NcJ7UKI/uOkSTTNT+u6epm0buBbRYZNOARtn+Ufnz1Zfs4kC9S/QSfbmNO8tMc/vp21nlA7urKwVsDZQZslxWrLYGuc/Go3TKK7xctQBCmDd0Aq8uwY6rEfFmBaHHitVOABHBLYkK720h/lhQ0xiOmUzVCX5/5Xmo1FJztFEeM8AUCnrGwDQDKjgXvLYqlMYWTRn8HRnmNlzNX1rCt4XH/ir4zgwbxaHhMLj3g4hv10xYjA8tnhoJMtEM1pAFZaTaGtteS1Wp+90KnxDVVBQ0AknBLXezRKuUV69iOf3jL2z8/lsL7IfyognjFLTRPGtse5XPNzWXVqFNkqqjPr0HbWdPwdN70pPXGIqkXTWtjJBr0Vki8JGKNVvp8ITwJ2nfdIZp4P1LccviiqW46Z1Cg6HYw/SEDWgMNSmUSTUpV5aCsP8X8qUd6YPFAQEf dPh+A/oo 25asWywxb39kpyxNxkAkNzcvQ8qu/qmoBbbVqh2WIrCLmaZawgqWi8Ph7NhVQ8QiTrrWkZVh5njSV/kU/nVGxyRI79LSzZgYvm6/5tun7+d3fsJyjK2YUiET7JAfH4n132jl/TiYFRg+TCpxSJkzrsTJsXBghJVSkHPmIvpxl2PyGMjC5EsCAtGB5qWCPg18XyjFxNGWJEx8ts1HGtCqCdrBu0N1d/8bml+VfdowpdSgr0drZBNpAbkgVOW+1nBn+Zk41golJwr1wLkFIxizdwsCvQkkKGkwwkkYxFgi1ocy1O+IqiVMtyrgbtRO+843tFDTs7/YHF7CYKS2sY4AiZJVnHbxvjJOeE3JZ0TRzqtMDshP2pMtnmjNPRol+mlICdCWTG+5sgjFHKWEo/zfvnpi7OW75o4tcaFZvRymj4Fxx40UbxLknWoD1xKLdxlJbzvhx/pa1Pm+qZSB7t0qTOuvGJi/rU7EoY5Xdr7V6a70oVKI= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Mon, Sep 9, 2024 at 3:30=E2=80=AFAM Feng Tang wrot= e: > > For a kmalloc object, when both kasan and slub redzone sanity check > are enabled, they could both manipulate its data space like storing > kasan free meta data and setting up kmalloc redzone, and may affect > accuracy of that object's 'orig_size'. > > As an accurate 'orig_size' will be needed by some function like > krealloc() soon, save kasan's free meta data in slub's metadata area > instead of inside object when 'orig_size' is enabled. > > This will make it easier to maintain/understand the code. Size wise, > when these two options are both enabled, the slub meta data space is > already huge, and this just slightly increase the overall size. > > Signed-off-by: Feng Tang > --- > mm/kasan/generic.c | 5 ++++- > mm/slab.h | 6 ++++++ > mm/slub.c | 17 ----------------- > 3 files changed, 10 insertions(+), 18 deletions(-) > > diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c > index 6310a180278b..cad376199d47 100644 > --- a/mm/kasan/generic.c > +++ b/mm/kasan/generic.c > @@ -393,8 +393,11 @@ void kasan_cache_create(struct kmem_cache *cache, un= signed int *size, > * be touched after it was freed, or > * 2. Object has a constructor, which means it's expected to > * retain its content until the next allocation. Nit: ", or" above. > + * 3. It is from a kmalloc cache which enables the debug option > + * to store original size. > */ > - if ((cache->flags & SLAB_TYPESAFE_BY_RCU) || cache->ctor) { > + if ((cache->flags & SLAB_TYPESAFE_BY_RCU) || cache->ctor || > + slub_debug_orig_size(cache)) { > cache->kasan_info.free_meta_offset =3D *size; > *size +=3D sizeof(struct kasan_free_meta); > goto free_meta_added; > diff --git a/mm/slab.h b/mm/slab.h > index 90f95bda4571..7a0e9b34ba2a 100644 > --- a/mm/slab.h > +++ b/mm/slab.h > @@ -689,6 +689,12 @@ void __kmem_obj_info(struct kmem_obj_info *kpp, void= *object, struct slab *slab) > void __check_heap_object(const void *ptr, unsigned long n, > const struct slab *slab, bool to_user); > > +static inline bool slub_debug_orig_size(struct kmem_cache *s) > +{ > + return (kmem_cache_debug_flags(s, SLAB_STORE_USER) && > + (s->flags & SLAB_KMALLOC)); > +} > + > #ifdef CONFIG_SLUB_DEBUG > void skip_orig_size_check(struct kmem_cache *s, const void *object); > #endif > diff --git a/mm/slub.c b/mm/slub.c > index 23761533329d..996a72fa6f62 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -230,12 +230,6 @@ static inline bool kmem_cache_debug(struct kmem_cach= e *s) > return kmem_cache_debug_flags(s, SLAB_DEBUG_FLAGS); > } > > -static inline bool slub_debug_orig_size(struct kmem_cache *s) > -{ > - return (kmem_cache_debug_flags(s, SLAB_STORE_USER) && > - (s->flags & SLAB_KMALLOC)); > -} > - > void *fixup_red_left(struct kmem_cache *s, void *p) > { > if (kmem_cache_debug_flags(s, SLAB_RED_ZONE)) > @@ -760,21 +754,10 @@ static inline void set_orig_size(struct kmem_cache = *s, > void *object, unsigned int orig_size) > { > void *p =3D kasan_reset_tag(object); > - unsigned int kasan_meta_size; > > if (!slub_debug_orig_size(s)) > return; > > - /* > - * KASAN can save its free meta data inside of the object at offs= et 0. > - * If this meta data size is larger than 'orig_size', it will ove= rlap > - * the data redzone in [orig_size+1, object_size]. Thus, we adjus= t > - * 'orig_size' to be as at least as big as KASAN's meta data. > - */ > - kasan_meta_size =3D kasan_metadata_size(s, true); > - if (kasan_meta_size > orig_size) > - orig_size =3D kasan_meta_size; > - > p +=3D get_info_end(s); > p +=3D sizeof(struct track) * 2; > > -- > 2.34.1 > Acked-by: Andrey Konovalov