Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp834439rwb; Thu, 22 Sep 2022 07:02:59 -0700 (PDT) X-Google-Smtp-Source: AMsMyM7hDMd9RXggfFS+CumKFLqHDCqpE1kqi88c1Gi7z4svtAvqohbcFE2rew9zfu0qtXilIv2Z X-Received: by 2002:a17:902:ea02:b0:176:afd7:3d1d with SMTP id s2-20020a170902ea0200b00176afd73d1dmr3464636plg.120.1663855378916; Thu, 22 Sep 2022 07:02:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1663855378; cv=none; d=google.com; s=arc-20160816; b=JydpmbRHdrE4WU6SOZDMThRR9rGDhwX6wMTvCil9LpO1Qe1c0tOSFnbbHZsK7MhIBE UvR7Lke544JoZ8qEvJfVATXdirdBrpxBze55l9Y0EUNsyHP/1U/5iW0XXoeigH/y1/oM 9njd3MQYHC+eMnMrQL6b5sIwTZnAzyTWDEmHQhRtV3n+j6nyhyAwUK0ppWIa5lLz3sta hdoOZVJbVesc1DPWM+cHYPKzIgz/a/a0um1xrI74fRJclrVOIYWRW+mbHvfxmiZMFnZg FCWJquJcxPYa3LzJzIJQEJjnbdi6xTiev7DbGkasQdk7P5ggktnGFMHxuomzZEY76jbN Mt1w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=BdNQukVriI/lSPpzgqgy6zFTHn+uKzZnK4/agAciPGk=; b=l1Q6gTTmoMjLGQ2LjRcpCKxiIDl8UTcM8Ojq1Spz5l1EhlKGT8mNhe9jTNfd8sTt0Z MHvcoo84bPvJJmgUQyugMICM1ljUQduxvCmMsuTAy0Bgn4IRv3WkaVNz8batcrmdOgiy dDaPV1lWqlAeMtWKIjFXUv0rzsM3g7A4K41VD9HoYhxjo803TmjqCGZ+at9GX4C3Feq8 0WTkqi7CdoVvIHwiBeSNdjDSZ3dkAP6jr393xaDhzhfEh81gcM56L7UUYeEc5ykjsSZ4 7C84iXfjOJJGy/tuJV7RptPhrC2vd9Ej8m5QSkVVxyhoi1wioi6PfDqdzsic+H93T7he wgkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=NNABwjLK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x38-20020a634866000000b0043a18ce4e2asi6324806pgk.393.2022.09.22.07.02.29; Thu, 22 Sep 2022 07:02:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=NNABwjLK; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231247AbiIVNcR (ORCPT + 99 others); Thu, 22 Sep 2022 09:32:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230262AbiIVNcO (ORCPT ); Thu, 22 Sep 2022 09:32:14 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DFAEED4DEF for ; Thu, 22 Sep 2022 06:32:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1663853533; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding; bh=BdNQukVriI/lSPpzgqgy6zFTHn+uKzZnK4/agAciPGk=; b=NNABwjLKP8AkrSe9ZRv0sL/v+hojljYwccwR2a1amfwZ9IORRhq3r0XALzZNG2ymD2vAxl LNlTaRXdfkOGmR78H/8lEMQYb3Dcz3c+5wb3JKxlCB2z79CNHIfLln/9Rgt4SCxFlsPPQH mqjAtqGzhaOO6Q6WywVrRaUCLG985CM= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-670-MXzlOAE8NIaCwhC9tV5AdA-1; Thu, 22 Sep 2022 09:32:11 -0400 X-MC-Unique: MXzlOAE8NIaCwhC9tV5AdA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 39EED802C17; Thu, 22 Sep 2022 13:32:10 +0000 (UTC) Received: from llong.com (unknown [10.22.33.6]) by smtp.corp.redhat.com (Postfix) with ESMTP id DBF2640C2088; Thu, 22 Sep 2022 13:32:09 +0000 (UTC) From: Waiman Long To: Peter Zijlstra , Ingo Molnar , Will Deacon , Boqun Feng , Steven Rostedt Cc: linux-kernel@vger.kernel.org, Waiman Long Subject: [PATCH v2] tracing: Disable interrupt or preemption before acquiring arch_spinlock_t Date: Thu, 22 Sep 2022 09:31:58 -0400 Message-Id: <20220922133158.1731333-1-longman@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It was found that some tracing functions in kernel/trace/trace.c acquire an arch_spinlock_t with preemption and irqs enabled. An example is the tracing_saved_cmdlines_size_read() function which intermittently causes a "BUG: using smp_processor_id() in preemptible" warning when the LTP read_all_proc test is run. That can be problematic in case preemption happens after acquiring the lock. Add the necessary preemption or interrupt disabling code in the appropriate places before acquiring an arch_spinlock_t. The convention here is to disable preemption for trace_cmdline_lock and interupt for max_lock. Suggested-by: Steven Rostedt Signed-off-by: Waiman Long --- kernel/trace/trace.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d3005279165d..aed7ea6e6045 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1193,12 +1193,14 @@ void *tracing_cond_snapshot_data(struct trace_array *tr) { void *cond_data = NULL; + local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) cond_data = tr->cond_snapshot->cond_data; arch_spin_unlock(&tr->max_lock); + local_irq_enable(); return cond_data; } @@ -1334,9 +1336,11 @@ int tracing_snapshot_cond_enable(struct trace_array *tr, void *cond_data, goto fail_unlock; } + local_irq_disable(); arch_spin_lock(&tr->max_lock); tr->cond_snapshot = cond_snapshot; arch_spin_unlock(&tr->max_lock); + local_irq_enable(); mutex_unlock(&trace_types_lock); @@ -1363,6 +1367,7 @@ int tracing_snapshot_cond_disable(struct trace_array *tr) { int ret = 0; + local_irq_disable(); arch_spin_lock(&tr->max_lock); if (!tr->cond_snapshot) @@ -1373,6 +1378,7 @@ int tracing_snapshot_cond_disable(struct trace_array *tr) } arch_spin_unlock(&tr->max_lock); + local_irq_enable(); return ret; } @@ -2200,6 +2206,11 @@ static size_t tgid_map_max; #define SAVED_CMDLINES_DEFAULT 128 #define NO_CMDLINE_MAP UINT_MAX +/* + * Preemption must be disabled before acquiring trace_cmdline_lock. + * The various trace_arrays' max_lock must be acquired in a context + * where interrupt is disabled. + */ static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED; struct saved_cmdlines_buffer { unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1]; @@ -2412,7 +2423,11 @@ static int trace_save_cmdline(struct task_struct *tsk) * the lock, but we also don't want to spin * nor do we want to disable interrupts, * so if we miss here, then better luck next time. + * + * This is called within the scheduler and wake up, so interrupts + * had better been disabled and run queue lock been held. */ + lockdep_assert_preemption_disabled(); if (!arch_spin_trylock(&trace_cmdline_lock)) return 0; @@ -5890,9 +5905,11 @@ tracing_saved_cmdlines_size_read(struct file *filp, char __user *ubuf, char buf[64]; int r; + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); r = scnprintf(buf, sizeof(buf), "%u\n", savedcmd->cmdline_num); arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); } @@ -5917,10 +5934,12 @@ static int tracing_resize_saved_cmdlines(unsigned int val) return -ENOMEM; } + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); savedcmd_temp = savedcmd; savedcmd = s; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); free_saved_cmdlines_buffer(savedcmd_temp); return 0; @@ -6373,10 +6392,12 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf) #ifdef CONFIG_TRACER_SNAPSHOT if (t->use_max_tr) { + local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) ret = -EBUSY; arch_spin_unlock(&tr->max_lock); + local_irq_enable(); if (ret) goto out; } @@ -7436,10 +7457,12 @@ tracing_snapshot_write(struct file *filp, const char __user *ubuf, size_t cnt, goto out; } + local_irq_disable(); arch_spin_lock(&tr->max_lock); if (tr->cond_snapshot) ret = -EBUSY; arch_spin_unlock(&tr->max_lock); + local_irq_enable(); if (ret) goto out; -- 2.31.1