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 F31B1C021B2 for ; Sun, 23 Feb 2025 04:25:01 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 51D3B6B007B; Sat, 22 Feb 2025 23:25:01 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4CD086B0082; Sat, 22 Feb 2025 23:25:01 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 395146B0083; Sat, 22 Feb 2025 23:25:01 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 1B8366B007B for ; Sat, 22 Feb 2025 23:25:01 -0500 (EST) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id A0049B7BE6 for ; Sun, 23 Feb 2025 04:25:00 +0000 (UTC) X-FDA: 83149919160.24.B06311F Received: from mail-qt1-f179.google.com (mail-qt1-f179.google.com [209.85.160.179]) by imf16.hostedemail.com (Postfix) with ESMTP id C9C5218000D for ; Sun, 23 Feb 2025 04:24:58 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="UmcfZs+/"; spf=pass (imf16.hostedemail.com: domain of surenb@google.com designates 209.85.160.179 as permitted sender) smtp.mailfrom=surenb@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740284698; a=rsa-sha256; cv=none; b=AYhaFmLtdnBLoiHSNnIG6+WSu9KArUHUo23u/ubjY0UXO29A4tZvKS7Vwgc3iVgUHHBWf5 4XUoWxl6qmj7bI96ekXbzuO7eFTSSOONYlM+hVKUH+vwmID5rCmX7jIx27Qbb3dnSlmYFB dSiLkRM10CcxCfQmrgwKL9+pIl6l/FE= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b="UmcfZs+/"; spf=pass (imf16.hostedemail.com: domain of surenb@google.com designates 209.85.160.179 as permitted sender) smtp.mailfrom=surenb@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740284698; 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=FpuQrwj5kn8T28pwd/be4/nwdyPl0g5tN+YxiK2nm1I=; b=w2OgiFXatZabe5RlJxTRcVdF0UTNbHf6SWr1ZLsvQTZi+z6cbhabPhYI6cjMsJdySoAOFC 035xprOKuEnhEmqX5vrSqHmlSKggw+/8qmPH0fwXtBHPGD1o+ZiwwNLfqplG5oQZqpZaDW S0RkhIbZNwGMrCINDIkN7aHZGNselDE= Received: by mail-qt1-f179.google.com with SMTP id d75a77b69052e-471f1dd5b80so165361cf.1 for ; Sat, 22 Feb 2025 20:24:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1740284698; x=1740889498; 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=FpuQrwj5kn8T28pwd/be4/nwdyPl0g5tN+YxiK2nm1I=; b=UmcfZs+/SG0leeCJ6Sa8gkvNn5dMj5iYFLw76ye4/EvQqSV3KLznfFWTMpg1QGz49O pTYNdOD2raQGsxiPUDdLsqG2XNOgpYQcqg9GDfCmVW0YbbixiQ4rRUfx0NUQAh7AA8Pu TrPFLOvvZsfW0oVNodIEbXIpOu+92ZBs+RxBjVD1NjlVxs41JDUX8IOHft06tvjJ739f bJNBUA4GfjaqoL1yHcvM9HCLgAmTlhanlerCkWQ/dhExieyQgrug/440hSxhvwWO/Lyc RG3w7PCz0SyRz87hNrxo/AmyBKeEoqFejLkcFyzyGfXKa0Q2OoqnIXewgKsrE+DaziOO yFmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740284698; x=1740889498; 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=FpuQrwj5kn8T28pwd/be4/nwdyPl0g5tN+YxiK2nm1I=; b=new535sTMV8sog/EyYIo8R01JN+kfaDf3mv14GDxH97VGOkbuwoOXEJF6CsZJaJrAY hX/UqAbk/VBMa3YciHqYjly5o63M7KVXTPnHkubgy18vWZUycR5PkyTZDHaaDMJvSlLB x8lUpnnOA8T0qzoRC/j37PZOYtyJvVISVeoDLJ3GSjmGK7Auotxy2WQcjqco0tOfmODK pvQlz9+MOeBuc6xMN/HleXtUTK8U5/WWQ8nE3rGzoQmPYJ1zyBCGDKbNw+5oP289Ox9U MNrMOzb58XJiPDeYqDL8zcmVYr1feDSZkQvMTIp+beLIwFHVMjmHa1siI7TSMT4/2G1q D24A== X-Forwarded-Encrypted: i=1; AJvYcCVtDsMlWpbsWcBZRLSBxQ+fNRnJkg3YoL38ppF4pDMz7U3GtCK1G8qTG+Q6fQkqyLNSdwzkJFvgOQ==@kvack.org X-Gm-Message-State: AOJu0YwadAU3DZraXpngfgN6oIQn8O7s/auIc3WYYe2qx0/1wgbe0Pci ePmXTasBIAJhbPazx2d/RQwuqmMEC1RgCgyzD1W5yA6H+qz18bLGpQj6wbj1vgC/TX+b4KcrwRp MXqDAbgFNMbEh8Pao13acnDBJZ26fpbaiO0gZ X-Gm-Gg: ASbGnctD/BGW0YH33FaBME2RfCZ4J+RqqK4VEAR5qoi4+9m8nGK5swqZjU/cO2dy0nR rN3kPkITO43B5DSt3E5tvGnSDl7TPqiKQ10IXDJgf7pMMULJOZEBbSuo532fGjreWgJW2Gg21pY httIWsLw4= X-Google-Smtp-Source: AGHT+IHqlzzGDmchqwuv8tYa4UkHB33x2EQ4/CZTGjQcdIRYOou0hG8nG/b3fkWrYXhGj3FEx8URbFUtx3hdrLHzmmQ= X-Received: by 2002:ac8:7c49:0:b0:471:eab0:ef21 with SMTP id d75a77b69052e-47234bc7c92mr2878751cf.13.1740284697438; Sat, 22 Feb 2025 20:24:57 -0800 (PST) MIME-Version: 1.0 References: <20250214-slub-percpu-caches-v2-0-88592ee0966a@suse.cz> <20250214-slub-percpu-caches-v2-8-88592ee0966a@suse.cz> In-Reply-To: <20250214-slub-percpu-caches-v2-8-88592ee0966a@suse.cz> From: Suren Baghdasaryan Date: Sat, 22 Feb 2025 20:24:46 -0800 X-Gm-Features: AWEUYZkeoIfRGvLjXhEb5mYFlAdmLxCXFljBSmvRWT3okNr4_KEdDGtF6irOEXA Message-ID: Subject: Re: [PATCH RFC v2 08/10] tools: Add testing support for changes to rcu and slab for sheaves To: Vlastimil Babka Cc: "Liam R. Howlett" , Christoph Lameter , David Rientjes , Roman Gushchin , Hyeonggon Yoo <42.hyeyoo@gmail.com>, Uladzislau Rezki , linux-mm@kvack.org, linux-kernel@vger.kernel.org, rcu@vger.kernel.org, maple-tree@lists.infradead.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Stat-Signature: effdztgt8wnokg5nnhrwhzniypwiao5e X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: C9C5218000D X-Rspam-User: X-HE-Tag: 1740284698-516145 X-HE-Meta: U2FsdGVkX1/M1tzeh38WSEMRjuCO0CXAJni7o21hczb7ronFBjxBU/W7jW+61wSFAPVQzLWu1U2kl0lIxdrdud4LoX7g032WHNAgVuVYnjP2gme3UIiYvEocyOJFwiAagMOsJhQURwEVA34V97gTOYvqm/Gaz6LPnBayVyir6JturQPmghobyyY44bk5h8WbCAcLl0puMIB1tT0VxsBVAm4I0yYB6eSmdD/dWWUs4/j0ijYzOBsx3Hhy9fvi4ug8qV1Hx/BZMzjBmtCHCMpr3IrKSu3CCXdtr/WQ7ZhIB+HqC4a0Whc+fIdw0GopcL/dXrKw030xqeXKNTPDfoUJywFB3DuuUTnyCDoR9kdgkM3wDgeTmSCKkk35Qo/0QP/0wmnix8+dgo6UkSHXlMO6iYrl0zm19i9IVYV9JHmXgL501j57yeXiX9yw658ECO9ABuRUKc7UD39sdf3u1U/vaC+4DhPJ/dMQ8Rdt1KspwJ7VIiUHqy72F1ZRkJYeMfAake54uhSFsV8TIEXL264w71H4bkOCQE9euKtwTCys5WsHVehbpqoNA6YBTBN2gEFBHQGDY2cpYQ2kycNJgz1TL8bPB9O0LdpV0uaI1t3yjVxTkUh9kaBD4jMe/7IQwX3j/XgM42ET3CiZDgw279Ltds1980G5og08Vpm+ANvvsZKRulVkvKb7UpFQZTpTdsF0hJHld9fHtStGqqbc/V9pQZsZhhJ4dQjNTEuQpcMqSiccugIPpTmO7cg815z9iiNuSoLa6DkquF25s545K7WJk9M6tixXQSyN4GDCrpoeJcabuw10whKeY9W8ZzdX3mDgD2Pau0cDsInp68lmuPH36EAJLF6Yiy4QCTR+a9u9eb8srJyU6WLTfhG5jdLTBgigXUA5CmNHnAhlDqdB/i7PB8FIVqeGfwYZ9FjoEebWi2c5nbF9Ti/wMK7JGdJG/LgzR9MH747mNYyV0dgjFsW V5UYznpY ceM+qYptUS9rDX+SkJRvuroY9Pe2wtxSugzs9HONMbz7mTqyPICm6LPLahLgJCUqJxRMeUC6Sx9etZpL8CWbKK6KoLXWU+yqawrGyx9p3QJx6kO9donlV/6S+BaEAWgjcYbxSCgVK+a5KMyR/QqsyNBIlwBVoS+IgFNR3XeYA0EIDgZvAGMa9gXigwRDAO+f/1tPNxgtdTck6nwScoldvTh0jCW7Wq6QTfvZYpsaDvjds8/Gz8ehnWBCGQCe3ofPMEF+zzBC1RqIFCa+g5PAeKmbYyTYoT3ni3DHuc6GqcYSF9mgVHaOMQKpjfVgI0FI89nrf 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 Fri, Feb 14, 2025 at 8:27=E2=80=AFAM Vlastimil Babka wr= ote: > > From: "Liam R. Howlett" > > Make testing work for the slab and rcu changes that have come in with > the sheaves work. > > This only works with one kmem_cache, and only the first one used. > Subsequent setting of keme_cache will not update the active kmem_cache s/keme_cache/kmem_cache > and will be silently dropped because there are other tests which happen > after the kmem_cache of interest is set. > > The saved active kmem_cache is used in the rcu callback, which passes > the object to be freed. > > The rcu call takes the rcu_head, which is passed in as the field in the > struct (in this case rcu in the maple tree node), which is calculated by > pointer math. The offset of which is saved (in a global variable) for > restoring the node pointer on the callback after the rcu grace period > expires. > > Don't use any of this outside of testing, please. > > Signed-off-by: Liam R. Howlett > --- > tools/include/linux/slab.h | 41 +++++++++++++++++++++++++++++= +++--- > tools/testing/shared/linux.c | 24 ++++++++++++++++---- > tools/testing/shared/linux/rcupdate.h | 22 +++++++++++++++++++ > 3 files changed, 80 insertions(+), 7 deletions(-) > > diff --git a/tools/include/linux/slab.h b/tools/include/linux/slab.h > index 51b25e9c4ec7b66bdf4c68cc1353c6faf1ca7bb8..a475364cfd9fcdb10db252aab= 18ea3a620326b6b 100644 > --- a/tools/include/linux/slab.h > +++ b/tools/include/linux/slab.h > @@ -22,6 +22,12 @@ enum slab_state { > FULL > }; > > +struct kmem_cache_args { > + unsigned int align; > + unsigned int sheaf_capacity; > + void (*ctor)(void *); > +}; > + > static inline void *kzalloc(size_t size, gfp_t gfp) > { > return kmalloc(size, gfp | __GFP_ZERO); > @@ -36,9 +42,38 @@ static inline void *kmem_cache_alloc(struct kmem_cache= *cachep, int flags) > } > void kmem_cache_free(struct kmem_cache *cachep, void *objp); > > -struct kmem_cache *kmem_cache_create(const char *name, unsigned int size= , > - unsigned int align, unsigned int flags, > - void (*ctor)(void *)); > + > +struct kmem_cache * > +__kmem_cache_create_args(const char *name, unsigned int size, > + struct kmem_cache_args *args, unsigned int flags); > + > +/* If NULL is passed for @args, use this variant with default arguments.= */ > +static inline struct kmem_cache * > +__kmem_cache_default_args(const char *name, unsigned int size, > + struct kmem_cache_args *args, unsigned int flags) > +{ > + struct kmem_cache_args kmem_default_args =3D {}; > + > + return __kmem_cache_create_args(name, size, &kmem_default_args, f= lags); > +} > + > +static inline struct kmem_cache * > +__kmem_cache_create(const char *name, unsigned int size, unsigned int al= ign, > + unsigned int flags, void (*ctor)(void *)) > +{ > + struct kmem_cache_args kmem_args =3D { > + .align =3D align, > + .ctor =3D ctor, > + }; > + > + return __kmem_cache_create_args(name, size, &kmem_args, flags); > +} > + > +#define kmem_cache_create(__name, __object_size, __args, ...) = \ > + _Generic((__args), \ > + struct kmem_cache_args *: __kmem_cache_create_args, \ > + void *: __kmem_cache_default_args, \ > + default: __kmem_cache_create)(__name, __object_size, __ar= gs, __VA_ARGS__) > > void kmem_cache_free_bulk(struct kmem_cache *cachep, size_t size, void *= *list); > int kmem_cache_alloc_bulk(struct kmem_cache *cachep, gfp_t gfp, size_t s= ize, > diff --git a/tools/testing/shared/linux.c b/tools/testing/shared/linux.c > index 66dbb362385f3c3d923233448cc591adfe6dc9e7..9f5fd722f27f1d3877be8927b= e30409cd74ab3c3 100644 > --- a/tools/testing/shared/linux.c > +++ b/tools/testing/shared/linux.c > @@ -20,6 +20,7 @@ struct kmem_cache { > pthread_mutex_t lock; > unsigned int size; > unsigned int align; > + unsigned int sheaf_capacity; > int nr_objs; > void *objs; > void (*ctor)(void *); > @@ -31,6 +32,8 @@ struct kmem_cache { > void *private; > }; > > +static struct kmem_cache *kmem_active =3D NULL; > + > void kmem_cache_set_callback(struct kmem_cache *cachep, void (*callback)= (void *)) > { > cachep->callback =3D callback; > @@ -147,6 +150,14 @@ void kmem_cache_free(struct kmem_cache *cachep, void= *objp) > pthread_mutex_unlock(&cachep->lock); > } > > +void kmem_cache_free_active(void *objp) > +{ > + if (!kmem_active) > + printf("WARNING: No active kmem_cache\n"); > + > + kmem_cache_free(kmem_active, objp); > +} > + > void kmem_cache_free_bulk(struct kmem_cache *cachep, size_t size, void *= *list) > { > if (kmalloc_verbose) > @@ -234,23 +245,28 @@ int kmem_cache_alloc_bulk(struct kmem_cache *cachep= , gfp_t gfp, size_t size, > } > > struct kmem_cache * > -kmem_cache_create(const char *name, unsigned int size, unsigned int alig= n, > - unsigned int flags, void (*ctor)(void *)) > +__kmem_cache_create_args(const char *name, unsigned int size, > + struct kmem_cache_args *args, > + unsigned int flags) > { > struct kmem_cache *ret =3D malloc(sizeof(*ret)); > > pthread_mutex_init(&ret->lock, NULL); > ret->size =3D size; > - ret->align =3D align; > + ret->align =3D args->align; > + ret->sheaf_capacity =3D args->sheaf_capacity; > ret->nr_objs =3D 0; > ret->nr_allocated =3D 0; > ret->nr_tallocated =3D 0; > ret->objs =3D NULL; > - ret->ctor =3D ctor; > + ret->ctor =3D args->ctor; > ret->non_kernel =3D 0; > ret->exec_callback =3D false; > ret->callback =3D NULL; > ret->private =3D NULL; > + if (!kmem_active) > + kmem_active =3D ret; This kmem_active and kfree_cb_offset look like bad hacks... Could we maybe modify kmem_cache_alloc() to allocate a small metadata at the beginning to store a pointer to kmem_cache and kfree_cb_offset value? > + > return ret; > } > > diff --git a/tools/testing/shared/linux/rcupdate.h b/tools/testing/shared= /linux/rcupdate.h > index fed468fb0c78db6f33fb1900c7110ab5f3c19c65..c95e2f0bbd93798e544d7d34e= 0823ed68414f924 100644 > --- a/tools/testing/shared/linux/rcupdate.h > +++ b/tools/testing/shared/linux/rcupdate.h > @@ -9,4 +9,26 @@ > #define rcu_dereference_check(p, cond) rcu_dereference(p) > #define RCU_INIT_POINTER(p, v) do { (p) =3D (v); } while (0) > > +void kmem_cache_free_active(void *objp); > +static unsigned long kfree_cb_offset =3D 0; > + > +static inline void kfree_rcu_cb(struct rcu_head *head) > +{ > + void *objp =3D (void *) ((unsigned long)head - kfree_cb_offset); > + > + kmem_cache_free_active(objp); > +} > + > +#ifndef offsetof > +#define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) > +#endif > + > +#define kfree_rcu(ptr, rhv) \ > +do { \ > + if (!kfree_cb_offset) \ > + kfree_cb_offset =3D offsetof(typeof(*(ptr)), rhv); = \ > + \ > + call_rcu(&ptr->rhv, kfree_rcu_cb); \ > +} while (0) > + > #endif > > -- > 2.48.1 >