Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1584435

[GIT PULL] debugobjects changes for v4.11

Path csiph.com!aioe.org!bofh.it!news.nic.it!robomod
From Ingo Molnar <mingo@kernel.org>
Newsgroups linux.kernel
Subject [GIT PULL] debugobjects changes for v4.11
Date Mon, 20 Feb 2017 10:40:01 +0100
Message-ID <tcSBP-2Sv-1@gated-at.bofh.it> (permalink)
Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=miWbPoiChgbpmR1UMe3iGBjcHiyk+vK63fioz4eXn/I=; b=msN/M8UBi1O0tfzjcVOYpLyaSfY30GDnMts32HfRUkZP8JDn6I1cXFLFyVGmgTyejq NCCWdt5JTL5yeQaAvvhKfEP3+M3b8jd/K77BhiIcSDIipxvEr3tt9yr0opqW+Lmd6QGh kqwiBsrGjx+AxjjKvtfi+ZwUQtzvonwHovp541KQG1QkE4jWVraOG1j4QMuAbPusjN4C 4FkyTMpBjh83c/ZmY8CeOKBg7klmq+j5f1Ch3a8O8IH31r9517mHeBwAPm2Z/zA4jzP/ b1kaeS4FpH3wW0pWJ3JJGmTa9+gtxDHOvPzYL+DEYFDB8OatmEn/wsXdNPk4wUyQWVxc 0GTA==
X-Google-Dkim-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:date:from:to:cc:subject:message-id :mime-version:content-disposition:user-agent; bh=miWbPoiChgbpmR1UMe3iGBjcHiyk+vK63fioz4eXn/I=; b=tkBrdZZzMEpIbswDSD2DHjlE3btE7ZfWtJAGzjC9XUv7ZCmCVmS+8FW4xaKppd2Pco SURYzHDiJnUcxUxLoP3CRZ5MXFesVmsfdtUF1BsFVHVGtWONcwuGuAUMtuKhezlm9UBo mscCQZMcsNhhc0CV885QfT5diqbZ9hgQdwTb0d2ULmqlsH6qHfwTCH2B8yQTTI+aw1lf qRM77KAWlEj6LQqEO6sYKImRUnaRDlfQx8s2A01N+vFZjCdVEy/GsQl45Rzzmn+MTYHK JN8aMzlH4xEvrEksjBwCSpSjvQKlppifeGKZfEaZbSIkhLUwCMs7qbhn3SIGT7U07LxU SwdQ==
X-Gm-Message-State AMke39lrP5At3l0/ic5bHsjsdPw8Kq7LaMf2Cu7jtgrF2NLc/yVxBURovKohf2MKPaYgZg==
X-Received by 10.223.172.136 with SMTP id o8mr12896197wrc.87.1487582936282; Mon, 20 Feb 2017 01:28:56 -0800 (PST)
MIME-Version 1.0
Content-Type text/plain; charset=us-ascii
Content-Disposition inline
User-Agent Mutt/1.5.24 (2015-08-30)
Sender robomod@news.nic.it
List-ID <linux-kernel.vger.kernel.org>
X-Mailing-List linux-kernel@vger.kernel.org
Approved robomod@news.nic.it
Lines 151
Organization linux.* mail to news gateway
X-Original-Cc linux-kernel@vger.kernel.org, Thomas Gleixner <tglx@linutronix.de>, Peter Zijlstra <a.p.zijlstra@chello.nl>, Andrew Morton <akpm@linux-foundation.org>
X-Original-Date Mon, 20 Feb 2017 10:28:53 +0100
X-Original-Message-ID <20170220092853.GA1909@gmail.com>
X-Original-Sender linux-kernel-owner@vger.kernel.org
Xref csiph.com linux.kernel:1584435

Show key headers only | View raw


Linus,

Please pull the latest core-debugobjects-for-linus git tree from:

   git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core-debugobjects-for-linus

   # HEAD: 0cad93c3453fc9d11692d3924ac3a520821bbf64 debugobjects: Improve variable naming

A number of scalability improvements, by Waimang Long.

 Thanks,

	Ingo

------------------>
Waiman Long (4):
      debugobjects: Track number of kmem_cache_alloc/kmem_cache_free done
      debugobjects: Scale thresholds with # of CPUs
      debugobjects: Reduce contention on the global pool_lock
      debugobjects: Improve variable naming


 lib/debugobjects.c | 58 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 46 insertions(+), 12 deletions(-)

diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index 04c1ef717fe0..8c28cbd7e104 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -52,9 +52,18 @@ static int			debug_objects_fixups __read_mostly;
 static int			debug_objects_warnings __read_mostly;
 static int			debug_objects_enabled __read_mostly
 				= CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT;
-
+static int			debug_objects_pool_size __read_mostly
+				= ODEBUG_POOL_SIZE;
+static int			debug_objects_pool_min_level __read_mostly
+				= ODEBUG_POOL_MIN_LEVEL;
 static struct debug_obj_descr	*descr_test  __read_mostly;
 
+/*
+ * Track numbers of kmem_cache_alloc()/free() calls done.
+ */
+static int			debug_objects_allocated;
+static int			debug_objects_freed;
+
 static void free_obj_work(struct work_struct *work);
 static DECLARE_WORK(debug_obj_work, free_obj_work);
 
@@ -88,13 +97,13 @@ static void fill_pool(void)
 	struct debug_obj *new;
 	unsigned long flags;
 
-	if (likely(obj_pool_free >= ODEBUG_POOL_MIN_LEVEL))
+	if (likely(obj_pool_free >= debug_objects_pool_min_level))
 		return;
 
 	if (unlikely(!obj_cache))
 		return;
 
-	while (obj_pool_free < ODEBUG_POOL_MIN_LEVEL) {
+	while (obj_pool_free < debug_objects_pool_min_level) {
 
 		new = kmem_cache_zalloc(obj_cache, gfp);
 		if (!new)
@@ -102,6 +111,7 @@ static void fill_pool(void)
 
 		raw_spin_lock_irqsave(&pool_lock, flags);
 		hlist_add_head(&new->node, &obj_pool);
+		debug_objects_allocated++;
 		obj_pool_free++;
 		raw_spin_unlock_irqrestore(&pool_lock, flags);
 	}
@@ -162,24 +172,39 @@ alloc_object(void *addr, struct debug_bucket *b, struct debug_obj_descr *descr)
 
 /*
  * workqueue function to free objects.
+ *
+ * To reduce contention on the global pool_lock, the actual freeing of
+ * debug objects will be delayed if the pool_lock is busy. We also free
+ * the objects in a batch of 4 for each lock/unlock cycle.
  */
+#define ODEBUG_FREE_BATCH	4
+
 static void free_obj_work(struct work_struct *work)
 {
-	struct debug_obj *obj;
+	struct debug_obj *objs[ODEBUG_FREE_BATCH];
 	unsigned long flags;
+	int i;
 
-	raw_spin_lock_irqsave(&pool_lock, flags);
-	while (obj_pool_free > ODEBUG_POOL_SIZE) {
-		obj = hlist_entry(obj_pool.first, typeof(*obj), node);
-		hlist_del(&obj->node);
-		obj_pool_free--;
+	if (!raw_spin_trylock_irqsave(&pool_lock, flags))
+		return;
+	while (obj_pool_free >= debug_objects_pool_size + ODEBUG_FREE_BATCH) {
+		for (i = 0; i < ODEBUG_FREE_BATCH; i++) {
+			objs[i] = hlist_entry(obj_pool.first,
+					      typeof(*objs[0]), node);
+			hlist_del(&objs[i]->node);
+		}
+
+		obj_pool_free -= ODEBUG_FREE_BATCH;
+		debug_objects_freed += ODEBUG_FREE_BATCH;
 		/*
 		 * We release pool_lock across kmem_cache_free() to
 		 * avoid contention on pool_lock.
 		 */
 		raw_spin_unlock_irqrestore(&pool_lock, flags);
-		kmem_cache_free(obj_cache, obj);
-		raw_spin_lock_irqsave(&pool_lock, flags);
+		for (i = 0; i < ODEBUG_FREE_BATCH; i++)
+			kmem_cache_free(obj_cache, objs[i]);
+		if (!raw_spin_trylock_irqsave(&pool_lock, flags))
+			return;
 	}
 	raw_spin_unlock_irqrestore(&pool_lock, flags);
 }
@@ -198,7 +223,7 @@ static void free_object(struct debug_obj *obj)
 	 * schedule work when the pool is filled and the cache is
 	 * initialized:
 	 */
-	if (obj_pool_free > ODEBUG_POOL_SIZE && obj_cache)
+	if (obj_pool_free > debug_objects_pool_size && obj_cache)
 		sched = 1;
 	hlist_add_head(&obj->node, &obj_pool);
 	obj_pool_free++;
@@ -758,6 +783,8 @@ static int debug_stats_show(struct seq_file *m, void *v)
 	seq_printf(m, "pool_min_free :%d\n", obj_pool_min_free);
 	seq_printf(m, "pool_used     :%d\n", obj_pool_used);
 	seq_printf(m, "pool_max_used :%d\n", obj_pool_max_used);
+	seq_printf(m, "objs_allocated:%d\n", debug_objects_allocated);
+	seq_printf(m, "objs_freed    :%d\n", debug_objects_freed);
 	return 0;
 }
 
@@ -1116,4 +1143,11 @@ void __init debug_objects_mem_init(void)
 		pr_warn("out of memory.\n");
 	} else
 		debug_objects_selftest();
+
+	/*
+	 * Increase the thresholds for allocating and freeing objects
+	 * according to the number of possible CPUs available in the system.
+	 */
+	debug_objects_pool_size += num_possible_cpus() * 32;
+	debug_objects_pool_min_level += num_possible_cpus() * 4;
 }

Back to linux.kernel | Previous | Next | Find similar | Unroll thread


Thread

[GIT PULL] debugobjects changes for v4.11 Ingo Molnar <mingo@kernel.org> - 2017-02-20 10:40 +0100

csiph-web