From: "Joel Fernandes (Google)" <joel@joelfernandes.org>
To: linux-kernel@vger.kernel.org
Cc: "Joel Fernandes (Google)" <joel@joelfernandes.org>,
urezki@gmail.com, Davidlohr Bueso <dave@stgolabs.net>,
Josh Triplett <josh@joshtriplett.org>,
Lai Jiangshan <jiangshanlai@gmail.com>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
rcu@vger.kernel.org, Steven Rostedt <rostedt@goodmis.org>
Subject: [PATCH 1/2] rcuperf: Add support to vary the slab object sizes
Date: Wed, 15 Jan 2020 17:42:24 -0500 [thread overview]
Message-ID: <20200115224225.246061-1-joel@joelfernandes.org> (raw)
This patch varies the allocated size of objects to be more realistic in
comparison to production workloads.
Cc: urezki@gmail.com
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
---
kernel/rcu/rcuperf.c | 48 +++++++++++++++++++++++++++++++++++++-------
1 file changed, 41 insertions(+), 7 deletions(-)
diff --git a/kernel/rcu/rcuperf.c b/kernel/rcu/rcuperf.c
index da94b89cd531..1fd0cc72022e 100644
--- a/kernel/rcu/rcuperf.c
+++ b/kernel/rcu/rcuperf.c
@@ -87,6 +87,7 @@ torture_param(bool, shutdown, RCUPERF_SHUTDOWN,
torture_param(int, verbose, 1, "Enable verbose debugging printk()s");
torture_param(int, writer_holdoff, 0, "Holdoff (us) between GPs, zero to disable");
torture_param(int, kfree_rcu_test, 0, "Do we run a kfree_rcu() perf test?");
+torture_param(bool, kfree_vary_obj_size, 0, "Vary the kfree_rcu object size");
static char *perf_type = "rcu";
module_param(perf_type, charp, 0444);
@@ -599,17 +600,29 @@ static int kfree_nrealthreads;
static atomic_t n_kfree_perf_thread_started;
static atomic_t n_kfree_perf_thread_ended;
-struct kfree_obj {
- char kfree_obj[8];
- struct rcu_head rh;
-};
+/*
+ * Define a kfree_obj with size as the @size parameter + the size of rcu_head
+ * (rcu_head is 16 bytes on 64-bit arch).
+ */
+#define DEFINE_KFREE_OBJ(size) \
+struct kfree_obj_ ## size { \
+ char kfree_obj[size]; \
+ struct rcu_head rh; \
+}
+
+/* This should goto the right sized slabs on both 32-bit and 64-bit arch */
+DEFINE_KFREE_OBJ(16); // goes on kmalloc-32 slab
+DEFINE_KFREE_OBJ(32); // goes on kmalloc-64 slab
+DEFINE_KFREE_OBJ(64); // goes on kmalloc-96 slab
+DEFINE_KFREE_OBJ(96); // goes on kmalloc-128 slab
static int
kfree_perf_thread(void *arg)
{
int i, loop = 0;
long me = (long)arg;
- struct kfree_obj *alloc_ptr;
+ void *alloc_ptr;
+
u64 start_time, end_time;
VERBOSE_PERFOUT_STRING("kfree_perf_thread task started");
@@ -627,11 +640,32 @@ kfree_perf_thread(void *arg)
do {
for (i = 0; i < kfree_alloc_num; i++) {
- alloc_ptr = kmalloc(sizeof(struct kfree_obj), GFP_KERNEL);
+ int kfree_type = i % 4;
+
+ // Allocate only kfree_obj_16 if rcuperf.kfree_vary_obj_size not passed.
+ if (!kfree_vary_obj_size)
+ kfree_type = 0;
+
+ if (kfree_type == 0)
+ alloc_ptr = kmalloc(sizeof(struct kfree_obj_16), GFP_KERNEL);
+ else if (kfree_type == 1)
+ alloc_ptr = kmalloc(sizeof(struct kfree_obj_32), GFP_KERNEL);
+ else if (kfree_type == 2)
+ alloc_ptr = kmalloc(sizeof(struct kfree_obj_64), GFP_KERNEL);
+ else
+ alloc_ptr = kmalloc(sizeof(struct kfree_obj_96), GFP_KERNEL);
+
if (!alloc_ptr)
return -ENOMEM;
- kfree_rcu(alloc_ptr, rh);
+ if (kfree_type == 0)
+ kfree_rcu((struct kfree_obj_16 *)alloc_ptr, rh);
+ else if (kfree_type == 1)
+ kfree_rcu((struct kfree_obj_32 *)alloc_ptr, rh);
+ else if (kfree_type == 2)
+ kfree_rcu((struct kfree_obj_64 *)alloc_ptr, rh);
+ else
+ kfree_rcu((struct kfree_obj_96 *)alloc_ptr, rh);
}
cond_resched();
--
2.25.0.rc1.283.g88dfdc4193-goog
next reply other threads:[~2020-01-15 22:42 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-15 22:42 Joel Fernandes (Google) [this message]
2020-01-15 22:42 ` [PATCH 2/2] rcuperf: Measure memory footprint during kfree_rcu() test (v4) Joel Fernandes (Google)
2020-01-18 10:51 ` kbuild test robot
2020-01-18 11:56 ` kbuild test robot
2020-01-27 8:51 ` kbuild test robot
2020-01-27 8:51 ` [RFC PATCH] rcuperf: mem_begin can be static kbuild test robot
2020-01-18 12:00 ` [PATCH 1/2] rcuperf: Add support to vary the slab object sizes Uladzislau Rezki
-- strict thread matches above, loose matches on Subject: below --
2020-01-15 22:40 Joel Fernandes (Google)
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=20200115224225.246061-1-joel@joelfernandes.org \
--to=joel@joelfernandes.org \
--cc=dave@stgolabs.net \
--cc=jiangshanlai@gmail.com \
--cc=josh@joshtriplett.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=paulmck@kernel.org \
--cc=rcu@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=urezki@gmail.com \
/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;
as well as URLs for NNTP newsgroup(s).