From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18FBC2690D7; Tue, 8 Apr 2025 12:30:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744115440; cv=none; b=uqWG06THBnhQmY9FnKv5KJz2yq5Fux/ey1OweVLBVu2IeyjZXDrPv1L6+Dktt0AcKe6QdCB+QLClgbYp71B9z+A4LOSqqgQOckTxTnxnQckJyxWTfmti0J/jTIoMekxfRswnCLn4aReejCgju3b5K0pv2STtEs+w6nADJRMBE/g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744115440; c=relaxed/simple; bh=MI37sKP1j7mAi0/I91VIsiReetzaxzs9BVROd/YHYdk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=U4wp3TwDlgeuWkz/VMg+iaQaXT0Vb7hP4Ovg57VCvqoUkq/kuJ917MefMa4xVE7kkQ7XADkSqAsSAQFaLGUPsGVNai+zQ2rDoJRF7ykiSoFkdSGj2OumVNS4fpH6MtLNliu2BgHKPBRyFKjuym/ZSeMW3HeT4Fhy50X25pyQ/E8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b=rhlAtDEh; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linuxfoundation.org header.i=@linuxfoundation.org header.b="rhlAtDEh" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9351BC4CEE5; Tue, 8 Apr 2025 12:30:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1744115439; bh=MI37sKP1j7mAi0/I91VIsiReetzaxzs9BVROd/YHYdk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=rhlAtDEhBWFqx1cWz9HIP145gvhpSx5j3xvLa1TgA70QV4i4MxjlVUQHpztMQl0Ak l2tcz7y62Wpt8SGhiywNKnipYZEl9MGm7XClx/Lx6g/uqwukMllVcRCDUdrdCIyH1b wDtxsV0eE9LIm+gPm6mrexvCKys4mqzRb5pMmKGw= From: Greg Kroah-Hartman To: stable@vger.kernel.org Cc: Greg Kroah-Hartman , patches@lists.linux.dev, Mathieu Desnoyers , Douglas Raillard , "Masami Hiramatsu (Google)" , "Steven Rostedt (Google)" Subject: [PATCH 6.13 476/499] tracing: Ensure module defining synth event cannot be unloaded while tracing Date: Tue, 8 Apr 2025 12:51:28 +0200 Message-ID: <20250408104903.225180355@linuxfoundation.org> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250408104851.256868745@linuxfoundation.org> References: <20250408104851.256868745@linuxfoundation.org> User-Agent: quilt/0.68 X-stable: review X-Patchwork-Hint: ignore Precedence: bulk X-Mailing-List: stable@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 6.13-stable review patch. If anyone has any objections, please let me know. ------------------ From: Douglas Raillard commit 21581dd4e7ff6c07d0ab577e3c32b13a74b31522 upstream. Currently, using synth_event_delete() will fail if the event is being used (tracing in progress), but that is normally done in the module exit function. At that stage, failing is problematic as returning a non-zero status means the module will become locked (impossible to unload or reload again). Instead, ensure the module exit function does not get called in the first place by increasing the module refcnt when the event is enabled. Cc: stable@vger.kernel.org Cc: Mathieu Desnoyers Fixes: 35ca5207c2d11 ("tracing: Add synthetic event command generation functions") Link: https://lore.kernel.org/20250318180906.226841-1-douglas.raillard@arm.com Signed-off-by: Douglas Raillard Acked-by: Masami Hiramatsu (Google) Signed-off-by: Steven Rostedt (Google) Signed-off-by: Greg Kroah-Hartman --- kernel/trace/trace_events_synth.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -859,6 +859,34 @@ static struct trace_event_fields synth_e {} }; +static int synth_event_reg(struct trace_event_call *call, + enum trace_reg type, void *data) +{ + struct synth_event *event = container_of(call, struct synth_event, call); + + switch (type) { + case TRACE_REG_REGISTER: + case TRACE_REG_PERF_REGISTER: + if (!try_module_get(event->mod)) + return -EBUSY; + break; + default: + break; + } + + int ret = trace_event_reg(call, type, data); + + switch (type) { + case TRACE_REG_UNREGISTER: + case TRACE_REG_PERF_UNREGISTER: + module_put(event->mod); + break; + default: + break; + } + return ret; +} + static int register_synth_event(struct synth_event *event) { struct trace_event_call *call = &event->call; @@ -888,7 +916,7 @@ static int register_synth_event(struct s goto out; } call->flags = TRACE_EVENT_FL_TRACEPOINT; - call->class->reg = trace_event_reg; + call->class->reg = synth_event_reg; call->class->probe = trace_event_raw_event_synth; call->data = event; call->tp = event->tp;