Subject: Reading /proc/slabinfo may cause large latencies
From: Carsten Emde <C.Emde@osadl.org>
Date: Sat, 29 Jun 2013 15:28:27 +0100

Reading /proc/slabinfo may cause large latencies of up to several
milliseconds. This is due to a mutex lock that spans over the entire
readout period and, thus, may prevent a higher-priority process from
allocating memory during this amount of time.

This patch shortens the mutex lock to the data accumulation of a single
item. It still guarantees coherence of a single output line but not
across items which probably is a minor disadvantage compared to the
otherwise fatal effect on the system's real-time capabilities.

Signed-off-by: Carsten Emde <C.Emde@osadl.org>

---
 mm/slab_common.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Index: linux-3.18.11-rt6/mm/slab_common.c
===================================================================
@ linux-3.18.11-rt6/mm/slab_common.c:841 @ static void *s_start(struct seq_file *m,
 {
 	loff_t n = *pos;
 
-	mutex_lock(&slab_mutex);
 	if (!n)
 		print_slabinfo_header(m);
 
@ linux-3.18.11-rt6/mm/slab_common.c:854 @ void *slab_next(struct seq_file *m, void
 
 void slab_stop(struct seq_file *m, void *p)
 {
-	mutex_unlock(&slab_mutex);
 }
 
 static void
@ linux-3.18.11-rt6/mm/slab_common.c:866 @ memcg_accumulate_slabinfo(struct kmem_ca
 	if (!is_root_cache(s))
 		return;
 
+	mutex_lock(&slab_mutex);
 	for_each_memcg_cache_index(i) {
 		c = cache_from_memcg_idx(s, i);
 		if (!c)
@ linux-3.18.11-rt6/mm/slab_common.c:881 @ memcg_accumulate_slabinfo(struct kmem_ca
 		info->active_objs += sinfo.active_objs;
 		info->num_objs += sinfo.num_objs;
 	}
+	mutex_unlock(&slab_mutex);
 }
 
 int cache_show(struct kmem_cache *s, struct seq_file *m)