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 X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD66BC433E1 for ; Tue, 2 Jun 2020 14:16:20 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id A16CF207F7 for ; Tue, 2 Jun 2020 14:16:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A16CF207F7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 925E0280006; Tue, 2 Jun 2020 10:16:17 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 85FBE280007; Tue, 2 Jun 2020 10:16:17 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7333A280004; Tue, 2 Jun 2020 10:16:17 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0104.hostedemail.com [216.40.44.104]) by kanga.kvack.org (Postfix) with ESMTP id 5892D280004 for ; Tue, 2 Jun 2020 10:16:17 -0400 (EDT) Received: from smtpin13.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 0DF1B824559C for ; Tue, 2 Jun 2020 14:16:17 +0000 (UTC) X-FDA: 76884471594.13.laugh83_362efaf22bc30 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin13.hostedemail.com (Postfix) with ESMTP id C2E7018048260 for ; Tue, 2 Jun 2020 14:16:12 +0000 (UTC) X-HE-Tag: laugh83_362efaf22bc30 X-Filterd-Recvd-Size: 5415 Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by imf30.hostedemail.com (Postfix) with ESMTP for ; Tue, 2 Jun 2020 14:16:12 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id CD10DAE6F; Tue, 2 Jun 2020 14:16:12 +0000 (UTC) From: Vlastimil Babka To: Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel-team@android.com, vinmenon@codeaurora.org, Kees Cook , Matthew Garrett , Vlastimil Babka , Jann Horn , Vijayanand Jitta Subject: [RFC PATCH 4/5] mm, slub: make remaining slub_debug related attributes read-only Date: Tue, 2 Jun 2020 16:15:18 +0200 Message-Id: <20200602141519.7099-5-vbabka@suse.cz> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200602141519.7099-1-vbabka@suse.cz> References: <20200602141519.7099-1-vbabka@suse.cz> MIME-Version: 1.0 X-Rspamd-Queue-Id: C2E7018048260 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam04 Content-Transfer-Encoding: quoted-printable 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: SLUB_DEBUG creates several files under /sys/kernel/slab// that can= be read to check if the respective debugging options are enabled for given c= ache. Some options, namely sanity_checks, trace, and failslab can be also enabl= ed and disabled at runtime by writing into the files. The runtime toggling is racy. Some options disable __CMPXCHG_DOUBLE when enabled, which means that in case of concurrent allocations, some can sti= ll use __CMPXCHG_DOUBLE and some not, leading to potential corruption. The s->fl= ags field is also not updated or checked atomically. The simplest solution is= to remove the runtime toggling. The extended slub_debug boot parameter synta= x introduced by earlier patch should allow to fine-tune the debugging configuration during boot with same granularity. Signed-off-by: Vlastimil Babka --- Documentation/vm/slub.rst | 7 ++--- mm/slub.c | 62 ++------------------------------------- 2 files changed, 5 insertions(+), 64 deletions(-) diff --git a/Documentation/vm/slub.rst b/Documentation/vm/slub.rst index 61805e984a0d..f240292589bd 100644 --- a/Documentation/vm/slub.rst +++ b/Documentation/vm/slub.rst @@ -115,11 +115,8 @@ If the file contains 1, the option is enabled, 0 mea= ns disabled. The debug T trace A failslab =20 -The sanity_checks, trace and failslab files are writable, so writing 1 o= r 0 -will enable or disable the option at runtime. The writes to trace and fa= ilslab -may return -EINVAL if the cache is subject to slab merging. Careful with -tracing: It may spew out lots of information and never stop if used on t= he -wrong slab. +Careful with tracing: It may spew out lots of information and never stop= if +used on the wrong slab. =20 Slab merging =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D diff --git a/mm/slub.c b/mm/slub.c index 58c1e9e7b3b3..38dd6f3ebb04 100644 --- a/mm/slub.c +++ b/mm/slub.c @@ -5056,20 +5056,6 @@ static ssize_t show_slab_objects(struct kmem_cache= *s, return x + sprintf(buf + x, "\n"); } =20 -#ifdef CONFIG_SLUB_DEBUG -static int any_slab_objects(struct kmem_cache *s) -{ - int node; - struct kmem_cache_node *n; - - for_each_kmem_cache_node(s, node, n) - if (atomic_long_read(&n->total_objects)) - return 1; - - return 0; -} -#endif - #define to_slab_attr(n) container_of(n, struct slab_attribute, attr) #define to_slab(n) container_of(n, struct kmem_cache, kobj) =20 @@ -5291,43 +5277,13 @@ static ssize_t sanity_checks_show(struct kmem_cac= he *s, char *buf) { return sprintf(buf, "%d\n", !!(s->flags & SLAB_CONSISTENCY_CHECKS)); } - -static ssize_t sanity_checks_store(struct kmem_cache *s, - const char *buf, size_t length) -{ - s->flags &=3D ~SLAB_CONSISTENCY_CHECKS; - if (buf[0] =3D=3D '1') { - s->flags &=3D ~__CMPXCHG_DOUBLE; - s->flags |=3D SLAB_CONSISTENCY_CHECKS; - } - return length; -} -SLAB_ATTR(sanity_checks); +SLAB_ATTR_RO(sanity_checks); =20 static ssize_t trace_show(struct kmem_cache *s, char *buf) { return sprintf(buf, "%d\n", !!(s->flags & SLAB_TRACE)); } - -static ssize_t trace_store(struct kmem_cache *s, const char *buf, - size_t length) -{ - /* - * Tracing a merged cache is going to give confusing results - * as well as cause other issues like converting a mergeable - * cache into an umergeable one. - */ - if (s->refcount > 1) - return -EINVAL; - - s->flags &=3D ~SLAB_TRACE; - if (buf[0] =3D=3D '1') { - s->flags &=3D ~__CMPXCHG_DOUBLE; - s->flags |=3D SLAB_TRACE; - } - return length; -} -SLAB_ATTR(trace); +SLAB_ATTR_RO(trace); =20 static ssize_t red_zone_show(struct kmem_cache *s, char *buf) { @@ -5391,19 +5347,7 @@ static ssize_t failslab_show(struct kmem_cache *s,= char *buf) { return sprintf(buf, "%d\n", !!(s->flags & SLAB_FAILSLAB)); } - -static ssize_t failslab_store(struct kmem_cache *s, const char *buf, - size_t length) -{ - if (s->refcount > 1) - return -EINVAL; - - s->flags &=3D ~SLAB_FAILSLAB; - if (buf[0] =3D=3D '1') - s->flags |=3D SLAB_FAILSLAB; - return length; -} -SLAB_ATTR(failslab); +SLAB_ATTR_RO(failslab); #endif =20 static ssize_t shrink_show(struct kmem_cache *s, char *buf) --=20 2.26.2