From patchwork Fri Aug 16 11:07:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13765991 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 18B48C3DA4A for ; Fri, 16 Aug 2024 11:08:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=iHiOuWi1LCrCLlIWs39Rsb1iRox5iY606vEU71zx5po=; b=mjYWU+z7eBLVIFqkPcCDZhaorq LC7GpnkNBG+faPPOVsNtcMC9h+TZ7UvurHVu717UZTeF7YXhbmhJ5xRGZJQaKc9jBMjbC7KmaySdn e4esE02Skv3x8EaJrhTh4+8e74V4fFr5cO00G+TJEGV0WNvNqeMzrdN92OLr5zIyGB+XuLfxc25bo rIDqbE1Eo3FZuQWAvosqqcZp2kPzkgVI3OJuWrUq7td08VAmwfEg9IT5Cg7oa02CnbJBkDH/aveXB l2fjRrQyCt9Wd0sD6XnSZqklUmKkcYFDAZlXdcWghICWyBHFNgzm7wmEQJFRVbeqwJ+bmYEtAOHe8 492n5NgA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuon-0000000ChRR-2GrN; Fri, 16 Aug 2024 11:08:29 +0000 Received: from mail-wm1-x34a.google.com ([2a00:1450:4864:20::34a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuoh-0000000ChMy-3o1P for linux-riscv@lists.infradead.org; Fri, 16 Aug 2024 11:08:25 +0000 Received: by mail-wm1-x34a.google.com with SMTP id 5b1f17b1804b1-42809eb7b99so10391625e9.0 for ; Fri, 16 Aug 2024 04:08:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1723806501; x=1724411301; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=m06R8rBHhIV+fNfH7++C5Q7rVR6HteIR9+x3IVgvVo0=; b=cF5+ZT3lKR3VTNs8fAfUhRYY+amYJ+jvS+TsXhWS3MH+aFhP94lZEmlikagxundKxC LtrtqJ7V49CeJ3AFWgoFLBKuOrQor/DpVofZkFFE/ozc9EGklFRUJ6SIjloQeLoklxvm LxXJ3E+/QXAyQBe6I+B2nIk7scqh8tbLAoeHSEI7E1QVFUjwZdHTD1PXgNjv3z5joMJ8 v6EhEtgfH6cc4PyftPct5BcjQaQyPVepiQ2oAIT+60zpugtaTgUfD/3kRRWY7/1rNwXf oa3ZZyyW81n6/0WMGi0AbYnAyCUmvlFnp4CbhcjmrV00qUqUITxyEsRZKRGockd5q9W8 fjgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723806501; x=1724411301; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=m06R8rBHhIV+fNfH7++C5Q7rVR6HteIR9+x3IVgvVo0=; b=DjJqStg1B5jQk0pl+kdvZaaAKk7fJUDFsf5/p7LbR7jTDf5l33wCTuzOH8FBu52WUU A0XRT74tR/bnhvY7GoPtcnT5mYqV8sOvfudlCLChUscDNWYKuug6T6AOmrpPDPbW08A0 340QZ4q1UOuU7W+crxi3/QusNfc7UJfgmqk13ZIgEaJ4e7kGLEu8pI52roK/dUR6uwOB 3sJIP0XZYIu2/71Q6vLTxGwruRWPR0UCst1c08bnse4HHr+SMOHzPaZF8vx9Yeh4iYvW g7NYpD8lENTgPyl9qPtOKuzB+KJjQVmOjm5BHXszq/5+Auu7qGZpzfj/ZXOMZJ9ijCuB Xdwg== X-Forwarded-Encrypted: i=1; AJvYcCXIQhwJXIZiQO0GZvdLrZo0qdxKcQTq9vhkXRlnj+P3+M9vgeIF0LsEZtl8hhL0OSNCVbGh1RZ2yoLIIKdVljdWDHMvppK0vI/vVLYl04AV X-Gm-Message-State: AOJu0YxgR6cJeT9WJ+UXk+cHTtYf8P3BB8Jsnme6c6ZJRnV0fqItrkxT A2F756ny1sGyuYgqdTb1IKGAf0cYnCiHrbQPaPN/nNthrvuHoDfNgTUCkOnt35cw9RVTaYmCphh y/SrnDmh4h3M6Kw== X-Google-Smtp-Source: AGHT+IH+VAsKwfNCiHHe99AmivtojPl8jd65icHQdCeMvqDYGyRGiGAODBeHQJKgR08V8df12KeTAxMnbdJAq0U= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a05:600c:4798:b0:429:c788:c218 with SMTP id 5b1f17b1804b1-429e23a6fdbmr962585e9.2.1723806500805; Fri, 16 Aug 2024 04:08:20 -0700 (PDT) Date: Fri, 16 Aug 2024 11:07:38 +0000 In-Reply-To: <20240816-tracepoint-v7-0-d609b916b819@google.com> Mime-Version: 1.0 References: <20240816-tracepoint-v7-0-d609b916b819@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=3678; i=aliceryhl@google.com; h=from:subject:message-id; bh=x4Fj8n509ULmZ45N1WACwPWEQuAc2oLxAGwmKjHodr0=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmvzMdVneCXly8cWWe5Iu4uc6nbYralCN4y+TmV wOYf3kDVPyJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZr8zHQAKCRAEWL7uWMY5 Ri7iD/9j1byicYermmm/i5dPcFPGgulMHHWVSSxshMFGTPr69xesZ5H+/l90d3CEP5L9ih8x7ht QrRslTqFF8Yp9ivd8uuelOk1xaXEFPw8P5vRGIUU9b4I4WMxlcb9g7ckF8zrV1qdeFG1PZqDxsZ xf1pWqvqszr401XhR+fj7kNQVKbyFT0uPFGKXT3Sb9yrKuFQ5X/hMCfqLBrVhD29P8iiuEQoj62 Okn2MG+8n0fmnixuWv0j/lp/bG/b3vBJNckorv3W41tf3YW4Sj0kLi2Idk95pBqhlIYisy+dRKb MOc2IfnPfQElbeKsEDjMpHy0oQY7LRmRHYv9dX9RsRfQsymv6hB/b9lfSF9M5MTn4jLFWTOQRBQ /k+2/1Nqk8i+cA5WE5loHeBrozeYvSmBfJATXTrTjh6yj/dVhAs4nZeqcn6hfSOux836gJFmke6 Ahf59c/QmBydmV3fW9FO9HENgUanrfI0q3OCvmvwtDyHjA+ZZHCcpN7ZZGOkkPLIty1bxlL2P3W 8xKYvJqNhw8XQdYqohiOX5Y62t/TPJ+aev1v9H3X1cbjvpKylN1KIjeIwoeRJZEdKSGV2ODqCWs RY8tY+QqDcfw9StVvP3jwp5XFJ2EYVh48XZ+qL8U8sgg7kYI0soQk/bI+WslYVmSP2/0f7BRhDZ NICGotH/M88i+uA== X-Mailer: b4 0.13.0 Message-ID: <20240816-tracepoint-v7-1-d609b916b819@google.com> Subject: [PATCH v7 1/5] rust: add generic static_key_false From: Alice Ryhl To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Josh Poimboeuf , Jason Baron , Ard Biesheuvel , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg Cc: linux-trace-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Sean Christopherson , Uros Bizjak , Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , Mark Rutland , Ryan Roberts , Fuad Tabba , linux-arm-kernel@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Anup Patel , Andrew Jones , Alexandre Ghiti , Conor Dooley , Samuel Holland , linux-riscv@lists.infradead.org, Huacai Chen , WANG Xuerui , Bibo Mao , Tiezhu Yang , Andrew Morton , Tianrui Zhao , loongarch@lists.linux.dev, Alice Ryhl X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240816_040824_077289_CD70A30A X-CRM114-Status: GOOD ( 19.63 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Add just enough support for static key so that we can use it from tracepoints. Tracepoints rely on `static_key_false` even though it is deprecated, so we add the same functionality to Rust. This patch only provides a generic implementation without code patching (matching the one used when CONFIG_JUMP_LABEL is disabled). Later patches add support for inline asm implementations that use runtime patching. When CONFIG_JUMP_LABEL is unset, `static_key_count` is a static inline function, so a Rust helper is defined for `static_key_count` in this case. If Rust is compiled with LTO, this call should get inlined. The helper can be eliminated once we have the necessary inline asm to make atomic operations from Rust. Signed-off-by: Alice Ryhl --- rust/bindings/bindings_helper.h | 1 + rust/helpers.c | 9 +++++++++ rust/kernel/jump_label.rs | 29 +++++++++++++++++++++++++++++ rust/kernel/lib.rs | 1 + 4 files changed, 40 insertions(+) diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index b940a5777330..8fd092e1b809 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/rust/helpers.c b/rust/helpers.c index 92d3c03ae1bd..5a9bf5209cd8 100644 --- a/rust/helpers.c +++ b/rust/helpers.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -133,6 +134,14 @@ bool rust_helper_refcount_dec_and_test(refcount_t *r) } EXPORT_SYMBOL_GPL(rust_helper_refcount_dec_and_test); +#ifndef CONFIG_JUMP_LABEL +int rust_helper_static_key_count(struct static_key *key) +{ + return static_key_count(key); +} +EXPORT_SYMBOL_GPL(rust_helper_static_key_count); +#endif + __force void *rust_helper_ERR_PTR(long err) { return ERR_PTR(err); diff --git a/rust/kernel/jump_label.rs b/rust/kernel/jump_label.rs new file mode 100644 index 000000000000..011e1fc1d19a --- /dev/null +++ b/rust/kernel/jump_label.rs @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: GPL-2.0 + +// Copyright (C) 2024 Google LLC. + +//! Logic for static keys. +//! +//! C header: [`include/linux/jump_label.h`](srctree/include/linux/jump_label.h). + +/// Branch based on a static key. +/// +/// Takes three arguments: +/// +/// * `key` - the path to the static variable containing the `static_key`. +/// * `keytyp` - the type of `key`. +/// * `field` - the name of the field of `key` that contains the `static_key`. +/// +/// # Safety +/// +/// The macro must be used with a real static key defined by C. +#[macro_export] +macro_rules! static_key_false { + ($key:path, $keytyp:ty, $field:ident) => {{ + let _key: *const $keytyp = ::core::ptr::addr_of!($key); + let _key: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*_key).$field); + + $crate::bindings::static_key_count(_key.cast_mut()) > 0 + }}; +} +pub use static_key_false; diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 274bdc1b0a82..91af9f75d121 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -36,6 +36,7 @@ pub mod firmware; pub mod init; pub mod ioctl; +pub mod jump_label; #[cfg(CONFIG_KUNIT)] pub mod kunit; #[cfg(CONFIG_NET)] From patchwork Fri Aug 16 11:07:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13765992 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D3195C531DC for ; Fri, 16 Aug 2024 11:08:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=WcnDqxL2kzX3BfgvoC8qhLTAYPEYdXgTZBJuwjovtgA=; b=JCXWTbIFUHHluXI/i347mk3eCs s9b72pJcNz+2V1PQyx8lAQXitHi9KnnbphgbertxEE/aeN0V1O7D1nQurj47hhRv3hrTXzZcCIfAh 41Cj0kAss4BP3Jn8wun2tp1b90CCt5lz01ciJGWhJn01yujxkyIEw5Rdi5UDfN/jVlRlTLLL6Qxv2 6l/eTRlbkW/eBL3aSIrPy+pRrTwDyoF+5HBIQyCKWJEFNJ+n9Eg6qcAVfiEAMCao7sI2/B4V7S/21 U5qSI8UjjQjrlVcTAG/JJNuOeHiTQKIr0elD0pQ6Wuzv0whcLbcfUcugmRdfm6Hmsg4tRQsiOoSSc eTyv9qCA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuor-0000000ChU5-2UTP; Fri, 16 Aug 2024 11:08:33 +0000 Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuoj-0000000ChOB-3gA7 for linux-riscv@lists.infradead.org; Fri, 16 Aug 2024 11:08:29 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-6ad9ffa0d77so36105427b3.2 for ; Fri, 16 Aug 2024 04:08:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1723806504; x=1724411304; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=f8cDHUaReumSMCOwyu04+mqYJDxHlzEMGiEzz4YHS0I=; b=MMg/VbxiMi/28A5IwpHsGICVnG/E1XorehTimkFOv19lsDv8iVDDZ7YqUahtkPw3fu eMOaCwQdrPLqZelrHZczYIGXP54l5F4QCwYXqh/qUxXpU1Md/lxDh4C0AtPOh+movswC bQTFe4cu78xem6UArTiIESPllC4IWOu1i+ohF9ulooxNZTehbseDt2YKxMqXd4GZdNGy puisoMAMNqJxFlaIPklPl4R0zi6djG4gtRoHmkwkHKOV/0F8+CmpoKJBMGQExacjb63H IH/WoUOB6uEEHvOa3BZQjD/4ndHYMIr3Nl1sWJcpdP2UTOuq3cJFBGLeWcj+ApHNMGqD wBSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723806504; x=1724411304; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=f8cDHUaReumSMCOwyu04+mqYJDxHlzEMGiEzz4YHS0I=; b=wLXDgBhQoOSRa7yxWx1tScXGhXDRaqPlfz3aa7s7iRkn1xFx0A/7Q/ZN+wWYOWF9Oz ZSeDOKkaV5NrLuus0Hza4ivDIKZj9ddHFJ0D4Mj8T5ZrPF3i/FT8QVmdKojfdI50yizc MksRDaW6Cp4dle9qXP6rkLxcQFKRGHZpXuCRVzNdzuZBPQKx2aI9LU2xhcPF/ZDI0VbN r+X4ww0W7Yg8kJxuM/f5dgS/wwKBb8Jifm/+vcyTu44jDCdveYAYRNGSxlFR93ENhsQk 4YdBtrH3bryGWUivjlnHupup34YldG06Lh/09OLf12Z5w61bI706pFwUeEsfoh7j/jUI GqZQ== X-Forwarded-Encrypted: i=1; AJvYcCWfDzmGn//86BcibkSXIxk5DlbSbBzYa2BJQ/dDIbt/pnoizOShPnJ9ncba0vkQYQIpxBwQSFeKzHC/yKLRZUVI5LWEv7prVE9txDiWXK7L X-Gm-Message-State: AOJu0YzHEPu8Ss18HogH6PTOIfYnZhD7yWxkMJzX39V8ZjvxI2nSA/uO 6DxXkz0xLVnAdNMhbH+fGBgz4e29x28d/x7DKQIAupP8mB1dY0O9OZUGwTxv17TuBolN5Lv1xsN H5i67cj4zUBHLmA== X-Google-Smtp-Source: AGHT+IHH8lqqbhavxoP9Vhrf4pidZ6/IQffeAAO7T7zZPPnk0pGCI+CN5pb9fvzDZryrjR97LYdyHBHJxNwBKX8= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a05:690c:7281:b0:68e:8de6:618b with SMTP id 00721157ae682-6b1b72af093mr1195957b3.2.1723806503892; Fri, 16 Aug 2024 04:08:23 -0700 (PDT) Date: Fri, 16 Aug 2024 11:07:39 +0000 In-Reply-To: <20240816-tracepoint-v7-0-d609b916b819@google.com> Mime-Version: 1.0 References: <20240816-tracepoint-v7-0-d609b916b819@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=6866; i=aliceryhl@google.com; h=from:subject:message-id; bh=mbr+t2kdtAR0gaGGgahPyE7BcbfXEyne0mHE/YfAoMM=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmvzMdw+Rmuw1TZAV/JDQBRFjlFdszXt+U1btzR gGP87RjnbOJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZr8zHQAKCRAEWL7uWMY5 Rn4jEACX97xcITEZga8P+ngCFqMoTIOKDVCNcrHpYF1tLAFZDcR9+ZyrndHeCvZol3Ll5q11q18 kd9BSXFiKXLVSYTY+FqEDInWIquj6oGSWuz0uoyTkHvbQGQ0Tbc/EdWGx5hU11NcUaGjrsxCGqb 06bAm9AYahSnbpMI87qadxYJ5tjW/eNhxjQU0S/BxReS+m3/rcmLwrpxQKI/HD7FbdSg69OUEnk sqJeeZQVy2CyHsoDWpO2TBYkOpi/zuprwTO3+tjl/9fz/CRV4DfcS5CseZnOOiOTHAYSuUGnT8D gf12tNcy2PklPmTCrrpsX9w5hfCPU1NR1/7Hg0wMrkBiBZMY35RM5ScaiPJ5joj/eWQHLDbvrzR rGWR3OgLMb91wNGe6mXEe3CarzS9pJKXQu5yyIWcHUYtWYHcKNjF4D3BJnG93RDDkAz4ctOLcuz uO0S2+nNx56UrOP7QRbqIu1cKaiGl2M5neW1y6n1Bb/n2cH0PYp5xaeC9sQa+ecyzw3Kj1EaBLG MSvgcTS9T5/R/wB5AouMqn8j7gVWaz4asQMshftP+tAgmrCFyi7msOEYSvnhTGx2BlNIJCgFt4E gOqQJNjdL+HUbc8+sPDOr9q5HGaDikRjs7pZy3nxtLy4Up0Anr58vd4LLaUoxA+gBe6up974yfC CQrWHCnO/UBYrbw== X-Mailer: b4 0.13.0 Message-ID: <20240816-tracepoint-v7-2-d609b916b819@google.com> Subject: [PATCH v7 2/5] rust: add tracepoint support From: Alice Ryhl To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Josh Poimboeuf , Jason Baron , Ard Biesheuvel , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg Cc: linux-trace-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Sean Christopherson , Uros Bizjak , Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , Mark Rutland , Ryan Roberts , Fuad Tabba , linux-arm-kernel@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Anup Patel , Andrew Jones , Alexandre Ghiti , Conor Dooley , Samuel Holland , linux-riscv@lists.infradead.org, Huacai Chen , WANG Xuerui , Bibo Mao , Tiezhu Yang , Andrew Morton , Tianrui Zhao , loongarch@lists.linux.dev, Alice Ryhl , Carlos Llamas X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240816_040826_044117_07550201 X-CRM114-Status: GOOD ( 27.13 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org Make it possible to have Rust code call into tracepoints defined by C code. It is still required that the tracepoint is declared in a C header, and that this header is included in the input to bindgen. Instead of calling __DO_TRACE directly, the exported rust_do_trace_ function calls an inline helper function. This is because the `cond` argument does not exist at the callsite of DEFINE_RUST_DO_TRACE. __DECLARE_TRACE always emits an inline static and an extern declaration that is only used when CREATE_RUST_TRACE_POINTS is set. These should not end up in the final binary so it is not a problem that they sometimes are emitted without a user. Reviewed-by: Carlos Llamas Reviewed-by: Gary Guo Signed-off-by: Alice Ryhl --- include/linux/tracepoint.h | 22 +++++++++++++++++- include/trace/define_trace.h | 12 ++++++++++ rust/bindings/bindings_helper.h | 1 + rust/kernel/lib.rs | 1 + rust/kernel/tracepoint.rs | 49 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 84 insertions(+), 1 deletion(-) diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index 6be396bb4297..5042ca588e41 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h @@ -237,6 +237,18 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) #define __DECLARE_TRACE_RCU(name, proto, args, cond) #endif +/* + * Declare an exported function that Rust code can call to trigger this + * tracepoint. This function does not include the static branch; that is done + * in Rust to avoid a function call when the tracepoint is disabled. + */ +#define DEFINE_RUST_DO_TRACE(name, proto, args) +#define __DEFINE_RUST_DO_TRACE(name, proto, args) \ + notrace void rust_do_trace_##name(proto) \ + { \ + __rust_do_trace_##name(args); \ + } + /* * Make sure the alignment of the structure in the __tracepoints section will * not add unwanted padding between the beginning of the section and the @@ -252,6 +264,13 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) extern int __traceiter_##name(data_proto); \ DECLARE_STATIC_CALL(tp_func_##name, __traceiter_##name); \ extern struct tracepoint __tracepoint_##name; \ + extern void rust_do_trace_##name(proto); \ + static inline void __rust_do_trace_##name(proto) \ + { \ + __DO_TRACE(name, \ + TP_ARGS(args), \ + TP_CONDITION(cond), 0); \ + } \ static inline void trace_##name(proto) \ { \ if (static_key_false(&__tracepoint_##name.key)) \ @@ -336,7 +355,8 @@ static inline struct tracepoint *tracepoint_ptr_deref(tracepoint_ptr_t *p) void __probestub_##_name(void *__data, proto) \ { \ } \ - DEFINE_STATIC_CALL(tp_func_##_name, __traceiter_##_name); + DEFINE_STATIC_CALL(tp_func_##_name, __traceiter_##_name); \ + DEFINE_RUST_DO_TRACE(_name, TP_PROTO(proto), TP_ARGS(args)) #define DEFINE_TRACE(name, proto, args) \ DEFINE_TRACE_FN(name, NULL, NULL, PARAMS(proto), PARAMS(args)); diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h index 00723935dcc7..8159294c2041 100644 --- a/include/trace/define_trace.h +++ b/include/trace/define_trace.h @@ -72,6 +72,13 @@ #define DECLARE_TRACE(name, proto, args) \ DEFINE_TRACE(name, PARAMS(proto), PARAMS(args)) +/* If requested, create helpers for calling these tracepoints from Rust. */ +#ifdef CREATE_RUST_TRACE_POINTS +#undef DEFINE_RUST_DO_TRACE +#define DEFINE_RUST_DO_TRACE(name, proto, args) \ + __DEFINE_RUST_DO_TRACE(name, PARAMS(proto), PARAMS(args)) +#endif + #undef TRACE_INCLUDE #undef __TRACE_INCLUDE @@ -129,6 +136,11 @@ # undef UNDEF_TRACE_INCLUDE_PATH #endif +#ifdef CREATE_RUST_TRACE_POINTS +# undef DEFINE_RUST_DO_TRACE +# define DEFINE_RUST_DO_TRACE(name, proto, args) +#endif + /* We may be processing more files */ #define CREATE_TRACE_POINTS diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index 8fd092e1b809..fc6f94729789 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 91af9f75d121..d00a44b000b6 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -51,6 +51,7 @@ pub mod sync; pub mod task; pub mod time; +pub mod tracepoint; pub mod types; pub mod uaccess; pub mod workqueue; diff --git a/rust/kernel/tracepoint.rs b/rust/kernel/tracepoint.rs new file mode 100644 index 000000000000..cf2d9ad15912 --- /dev/null +++ b/rust/kernel/tracepoint.rs @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-2.0 + +// Copyright (C) 2024 Google LLC. + +//! Logic for tracepoints. + +/// Declare the Rust entry point for a tracepoint. +/// +/// This macro generates an unsafe function that calls into C, and its safety requirements will be +/// whatever the relevant C code requires. To document these safety requirements, you may add +/// doc-comments when invoking the macro. +#[macro_export] +macro_rules! declare_trace { + ($($(#[$attr:meta])* $pub:vis unsafe fn $name:ident($($argname:ident : $argtyp:ty),* $(,)?);)*) => {$( + $( #[$attr] )* + #[inline(always)] + $pub unsafe fn $name($($argname : $argtyp),*) { + #[cfg(CONFIG_TRACEPOINTS)] + { + // SAFETY: It's always okay to query the static key for a tracepoint. + let should_trace = unsafe { + $crate::macros::paste! { + $crate::jump_label::static_key_false!( + $crate::bindings::[< __tracepoint_ $name >], + $crate::bindings::tracepoint, + key + ) + } + }; + + if should_trace { + $crate::macros::paste! { + // SAFETY: The caller guarantees that it is okay to call this tracepoint. + unsafe { $crate::bindings::[< rust_do_trace_ $name >]($($argname),*) }; + } + } + } + + #[cfg(not(CONFIG_TRACEPOINTS))] + { + // If tracepoints are disabled, insert a trivial use of each argument + // to avoid unused argument warnings. + $( let _unused = $argname; )* + } + } + )*} +} + +pub use declare_trace; From patchwork Fri Aug 16 11:07:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13765993 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F021FC3DA4A for ; Fri, 16 Aug 2024 11:08:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=ghclI3fHXITnMCImyDIU1aDDMP71kKHki5NVww3XDXU=; b=Q0ZFYNbaa1AqP2A5jBwMzgnUMx EWpD+M8bz9hAOSSE9eZrWkRyBc7fhELsyhsr+3h6JLkPA0Ur0WPWHha7rCjuj+uUDoYbhDWMm6/GJ k0WFs52n+cc5vkZumPs0KN3XIEpxRv3atsM3qpmUcSyvr1g5ArbfEwj/Hn98+QmdnI6Em0JOhjQvN nrjpcOfprEMwjNYcMxlsW9QDZRHtq0uIZW6eZXHu15kOxAnkTJvlCWSTijwD4qxBqHAbrpvAyRLhV K+lIKO6RE34w+WTzwGcFYawAkt0rlDzDT0IEBlqOTLCiBKWBDXv3ZO/bHDYAmb3nS4k7P3rTffEko eDerXkyQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuow-0000000ChXq-3DJm; Fri, 16 Aug 2024 11:08:38 +0000 Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuol-0000000ChPs-3L9x for linux-riscv@lists.infradead.org; Fri, 16 Aug 2024 11:08:30 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-688777c95c4so32911077b3.1 for ; Fri, 16 Aug 2024 04:08:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1723806506; x=1724411306; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=8WXJYVeFW+jGG7DCrz93gCg6JPKvPQ2Wf4cfjKgCwaM=; b=ICCuxCbMUmxW3469sytsdoJFtOpFIqmKOj41ECJ1ycgNGSkE0798DLNZcXxW2RTfIU Per687C6rYckzsvitS93Wj9DgmCoWZGJSd+VlxHgfqnWcOcGZer7x7vYsrvSfJhHG0kx N3FI6NZuc60ynwvFmLEu+yW91pA82oD2Yz3CSkQzhAgltY8w+Nxe/1uyqQJ5Ou5l9h8T VcPiUZbsj0UplfNBk5XP+8vTAaIRhSPHLyGeGPoEd5pCaJ2idnUhJUb54q6y3bDMLlzX dpqasNAgcOrYCzf1JeYUBwNP1ewVK10Pz77NTAwW4mUlD4EAdip7bQGr1oPpOQXTjEeT YjCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723806506; x=1724411306; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=8WXJYVeFW+jGG7DCrz93gCg6JPKvPQ2Wf4cfjKgCwaM=; b=WZq4zkVpCC/9359aRQhACctv/AtyB17kN7XwU4acMGiyiXp964nWWxT3tQWVJConoB 9fvpqvQQyjq4sPbsFcSmALzDiZ3oIVh05Bmp7plQZe4eZLW1s4OhOflY3EdM73B9c/Bk ho5wXSbGhXAIhvMhyP4C0cAn6CZAhsVcdiRC/KiOnfsHFtFlYU9E6vrcruj1zckddOjW RV7nyRhQ4Cs0Jh05Svw7Xl7o8gZNtL+s4MlbbBRD/zicw+laOXE4jyE59Jy4ryAn+Zx3 1TAMsoUX4I271F1RzNQsmXLevqdvRKaWunyhcrYXfGSVF+tPx+uEdRNS9FGTzFTjxzh5 NImQ== X-Forwarded-Encrypted: i=1; AJvYcCVZJpQFZIzmMuv/90JLuDCEYUP29+L8ionYq22nVvhLaZPr//3L33WjFrqvH+4bzuHc18SUuWfiiqNvAxNVNVryMxSUms4+7a/FgDBI8+Z/ X-Gm-Message-State: AOJu0YwVT+UwfexGswz26sefvIxjojTLZrKnNH3dk/Ax6c9gR8mdILTL c0xIpkKbfdiBJcXvIEi8y0u9N+4Nhlk04KWeFKPuz0e5ykBTlMl3knTCjFBVK1zCocaB0WU/O3h aW8x/+CJuyoWqsg== X-Google-Smtp-Source: AGHT+IENG8RvWSbnEeZa76M5drDjzlxFaYucbJgX93Ypeu6LtXaRbJkU27vCvNm78s5etIFQTr+h0LBDYQvkbbw= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a05:690c:4e0e:b0:64a:d1b0:4f24 with SMTP id 00721157ae682-6b1bba55dd5mr529587b3.7.1723806506396; Fri, 16 Aug 2024 04:08:26 -0700 (PDT) Date: Fri, 16 Aug 2024 11:07:40 +0000 In-Reply-To: <20240816-tracepoint-v7-0-d609b916b819@google.com> Mime-Version: 1.0 References: <20240816-tracepoint-v7-0-d609b916b819@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=4269; i=aliceryhl@google.com; h=from:subject:message-id; bh=FjpJXotW1KGtmig+hIm0KQivxPyDztMFhKa3lXhpNM0=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmvzMepbhDiFvqOK4lVK+lVeXqMrqKeLQKfNtLv 1maxl+EY8uJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZr8zHgAKCRAEWL7uWMY5 RgtbEACRpT0zGevx2T2ZuevbMSrvHY8O+PkNODEE08LSGG6WrPSPMPM2z/eaZ4RcWU9QghWVt/A cY4ra+pbs5Izub0iUjuugm6FfriqtZ9xUmHCZKhSeIL7y3DBrSxO/RnogBPL3KyvFwLLDnQ8Vpe CqZN0JqAvxpLZ1CNPm+vh+gWVWZzuGXwl38dN1qn0yX1YUQ1i486KKeERY1HmMm2f7qWeH825sY UGmW4o6uJaZizSTb9FaFfOm66S0PTyiDmsq3cYgiIWd/oaQ5+5B99xFdqFzbVyj9UOhIQ8JwNl6 zr8b++dJNwpvKjSGVuoheFxbe369/u+zPY7qthE6SfSBojC8uwxa6VocZBcQan2FQlFF5Kp/IZk /bHiHjf+VK5xXsr0FzZ7xzq7xnTpBEVAGVcaDEp3fmvSjpJh0UtRpHIDdIPrDztCVyiXh046iaJ q6XzfRbm4hV8O3fE94OIUytGTKS+ty8M+E00WtiGsxHKfp74TlxWFYG/Wp62CQIAstKFA7XD3Ko 7UVtAvx4fVKSIp8x2vfqomxv9NuD28vjvx7o8/bSQQXbs0C00zek4wn/s8ZJisBKgL3ZkyYV1p3 dGpVxCf4EHopYVdJKvCih5BjJP7tWaRUzAdRiF2Yv6vey7++L3JHtkX+D24D48UIfCzhGC1W94m H0gt3NMLaXB1Yrg== X-Mailer: b4 0.13.0 Message-ID: <20240816-tracepoint-v7-3-d609b916b819@google.com> Subject: [PATCH v7 3/5] rust: samples: add tracepoint to Rust sample From: Alice Ryhl To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Josh Poimboeuf , Jason Baron , Ard Biesheuvel , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg Cc: linux-trace-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Sean Christopherson , Uros Bizjak , Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , Mark Rutland , Ryan Roberts , Fuad Tabba , linux-arm-kernel@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Anup Patel , Andrew Jones , Alexandre Ghiti , Conor Dooley , Samuel Holland , linux-riscv@lists.infradead.org, Huacai Chen , WANG Xuerui , Bibo Mao , Tiezhu Yang , Andrew Morton , Tianrui Zhao , loongarch@lists.linux.dev, Alice Ryhl X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240816_040827_915179_26602B90 X-CRM114-Status: GOOD ( 18.14 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org This updates the Rust printing sample to invoke a tracepoint. This ensures that we have a user in-tree from the get-go even though the patch is being merged before its real user. Signed-off-by: Alice Ryhl --- MAINTAINERS | 1 + include/trace/events/rust_sample.h | 31 +++++++++++++++++++++++++++++++ rust/bindings/bindings_helper.h | 1 + samples/rust/Makefile | 3 ++- samples/rust/rust_print.rs | 18 ++++++++++++++++++ samples/rust/rust_print_events.c | 8 ++++++++ 6 files changed, 61 insertions(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index f328373463b0..1acf5bfddfc4 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -19922,6 +19922,7 @@ C: zulip://rust-for-linux.zulipchat.com P: https://rust-for-linux.com/contributing T: git https://github.com/Rust-for-Linux/linux.git rust-next F: Documentation/rust/ +F: include/trace/events/rust_sample.h F: rust/ F: samples/rust/ F: scripts/*rust* diff --git a/include/trace/events/rust_sample.h b/include/trace/events/rust_sample.h new file mode 100644 index 000000000000..dbc80ca2e465 --- /dev/null +++ b/include/trace/events/rust_sample.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Tracepoints for `samples/rust/rust_print.rs`. + * + * Copyright (C) 2024 Google, Inc. + */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM rust_sample + +#if !defined(_RUST_SAMPLE_TRACE_H) || defined(TRACE_HEADER_MULTI_READ) +#define _RUST_SAMPLE_TRACE_H + +#include + +TRACE_EVENT(rust_sample_loaded, + TP_PROTO(int magic_number), + TP_ARGS(magic_number), + TP_STRUCT__entry( + __field(int, magic_number) + ), + TP_fast_assign( + __entry->magic_number = magic_number; + ), + TP_printk("magic=%d", __entry->magic_number) +); + +#endif /* _RUST_SAMPLE_TRACE_H */ + +/* This part must be outside protection */ +#include diff --git a/rust/bindings/bindings_helper.h b/rust/bindings/bindings_helper.h index fc6f94729789..fe97256afe65 100644 --- a/rust/bindings/bindings_helper.h +++ b/rust/bindings/bindings_helper.h @@ -23,6 +23,7 @@ #include #include #include +#include /* `bindgen` gets confused at certain things. */ const size_t RUST_CONST_HELPER_ARCH_SLAB_MINALIGN = ARCH_SLAB_MINALIGN; diff --git a/samples/rust/Makefile b/samples/rust/Makefile index 03086dabbea4..f29280ec4820 100644 --- a/samples/rust/Makefile +++ b/samples/rust/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 +ccflags-y += -I$(src) # needed for trace events obj-$(CONFIG_SAMPLE_RUST_MINIMAL) += rust_minimal.o -obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o +obj-$(CONFIG_SAMPLE_RUST_PRINT) += rust_print.o rust_print_events.o subdir-$(CONFIG_SAMPLE_RUST_HOSTPROGS) += hostprogs diff --git a/samples/rust/rust_print.rs b/samples/rust/rust_print.rs index 6eabb0d79ea3..6d14b08cac1c 100644 --- a/samples/rust/rust_print.rs +++ b/samples/rust/rust_print.rs @@ -69,6 +69,8 @@ fn init(_module: &'static ThisModule) -> Result { arc_print()?; + trace::trace_rust_sample_loaded(42); + Ok(RustPrint) } } @@ -78,3 +80,19 @@ fn drop(&mut self) { pr_info!("Rust printing macros sample (exit)\n"); } } + +mod trace { + use core::ffi::c_int; + + kernel::declare_trace! { + /// # Safety + /// + /// Always safe to call. + unsafe fn rust_sample_loaded(magic: c_int); + } + + pub(crate) fn trace_rust_sample_loaded(magic: i32) { + // SAFETY: Always safe to call. + unsafe { rust_sample_loaded(magic as c_int) } + } +} diff --git a/samples/rust/rust_print_events.c b/samples/rust/rust_print_events.c new file mode 100644 index 000000000000..a9169ff0edf1 --- /dev/null +++ b/samples/rust/rust_print_events.c @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright 2024 Google LLC + */ + +#define CREATE_TRACE_POINTS +#define CREATE_RUST_TRACE_POINTS +#include From patchwork Fri Aug 16 11:07:41 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13765994 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5AD7EC3DA4A for ; Fri, 16 Aug 2024 11:08:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=wxjxFHCXKRsZUF7piqLhJRqqd2+5a0hn64MPqXZaytY=; b=mpiyU8TIQpRkV5zJ37wbDJipz2 fdj6M4yfvs0jBFGB30p1jsNI2cY8sqoci7zk06AH+FUyVKR1sU8DDOY8MTTe3KLHMpcuWdryxjGev T/7QHIZFDvXkquZFJfQbuHX38LQZdXOsjuw8YAXGdPJ68OTSFFH8zFKFOyl0xpH1Zj3ygXmiI3LUr Rr/mi8e0jJlhJeuMgeIWO6w/NOjrvBkCZ1AJhWfSrYC4BQC+QhFi3nSQPbZtM7sV9A1o6a2tssMni ToussatxFg9KjM0gpcJqRijxefTMgOgLQPKmXAlPackG4bHq7DTXeGD1WVW20yduWJjdfrqNlSCkd fmMC+Dqg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1seup1-0000000Chav-1DtF; Fri, 16 Aug 2024 11:08:43 +0000 Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuop-0000000ChRe-1NvU for linux-riscv@lists.infradead.org; Fri, 16 Aug 2024 11:08:33 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-6ad660add0fso23450217b3.0 for ; Fri, 16 Aug 2024 04:08:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1723806509; x=1724411309; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=Q375QRvUD5Wva8hc3MN+sMayJuBnYHhQhae9RWdaskQ=; b=qqknZqtlxckmwFzxZh1NBb6JlOW4Ks5giJi18un0dOaq5glFlZ8DK2pArJUmGNlevo 7u1e0lUHcciC94cNHT2f4AxRHGq/beNmgoN97OxQ2eiQ1L8bNwC9RNdNBvjowa0wIAd7 Vwe4fJtagYY0IELCuBZkdKdCbKw2jANhNqc+P7g9Ho27ykOiUGvKFml/hC4eGGUtSoXi jvEO6LTdWyMvSyHddh/RubfACBGUD9zeMJaHswNEhmpcR1YAXxB/nsxiwVGT/CHB/5dx cfqn1gTZoHGx8LE5pdLzZwe5HD7iaW+N0fYuIy8qktwbe+t9K0kKmx1mu9epolquqwIv s00g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723806509; x=1724411309; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Q375QRvUD5Wva8hc3MN+sMayJuBnYHhQhae9RWdaskQ=; b=F/aipDCfrEkuDzQKBYSznlHbV1yA7U5juhuERvDkf8MzeEwD5eW9ligDIumEGNyfkv HUjSVjdEEw4fMzew2TmPwxSJcJ1sxkkBQVdAgDTxyxkCzIjNepghg5tyMTMXdW9nXX2V hWWg674By87OVRUrQmGMOLtZSrh5TOxFlHIZjGMkJvt4LZmzirFF5QkrhpT3OjDEt9M7 iZaG+SXyeSS3yZx7uw00zMcaHIgimM2FQBzgwpA9NvISW8ZWJnqQ0GgNQQwqu/TyPhQy b064x7UlqIrPyvoBcCTM/gH6rMt7nA5U6Em0kmeFgmScPn9bIWZ3giFKQVZqX9bS83dG W6nA== X-Forwarded-Encrypted: i=1; AJvYcCX3uQxNriZD344J+cQD66+ot7ZEpo2ft9rd32rDUgwF9vB4c0YdzN4ZAZ5NXmEMPhgvLJqf6vOMO75VAN+vJR3+bUBXqyQZitkndzxgUHAE X-Gm-Message-State: AOJu0Yxht2SlzdHMjYQ6WnBPuYYLqPl9DNG+l1pwwdHwqHlbaRfvGfIq zaumzst8zUVr97Bjv35DwYJO2/fpghuyB75ZbxgI8BIYc3zs5gx+zQTwXfxW7+6+R4Vk9bsO4I5 uBsGnEU44UtM/JA== X-Google-Smtp-Source: AGHT+IH0LQKf5808EUgr6iBkW6cUdKRyYRkb+ZU2dUSvXkgXGEj9sYf8m7CVk20xNtxPiBWbabelC/a7Yk1YS98= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a05:690c:b8e:b0:648:2f1d:1329 with SMTP id 00721157ae682-6b1d38cac51mr1920947b3.1.1723806508961; Fri, 16 Aug 2024 04:08:28 -0700 (PDT) Date: Fri, 16 Aug 2024 11:07:41 +0000 In-Reply-To: <20240816-tracepoint-v7-0-d609b916b819@google.com> Mime-Version: 1.0 References: <20240816-tracepoint-v7-0-d609b916b819@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=9372; i=aliceryhl@google.com; h=from:subject:message-id; bh=NCijnrFVATFS0Jb3tHGcAM6xeWG4d78Efm1z0mpVoWk=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmvzMe9Qsdoi2s5idl4F4MxYG7XPSkLKE9NF+bM rMy4FJDPcSJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZr8zHgAKCRAEWL7uWMY5 RhosD/9CWTEswpwOORoAMxjPJfw2m2DPxDoZQ5oIsQ9CKyp1rwE9hTQCVA/fGaVVTShlLkjoK+q NZyUmLLmYc315k1Bu529ZqzCoF4zJSW/Sa1x9thP9lTL7p4alaSIfPqRun9jtok+SQrc1Wo3uRM hS0BX3NmrGLzIW3afnMh0PnwGYAnSMTKP+s8oqDoz0z3GVE8xDK+eeD4ebneMeBwBpsBHVg9l+f ljSZ3aWPRWjNyM2K96CKfmt2zYEnz5nfYpRi434H8SPSxgWFLU2LLHsXGGyJmCytCLP6Cxnld9E OhFUnVogiVcV6pTrK5xRpOYTYB4PvzlXFzRMSq5uqjH+gzojo8oeZ535Wx0F0Ec9GxofWQ3OIsE 9lFjxyJOBeAPt57y3Z6TrvG4W6mMCKJB9unla7TRlVvkM2o0x+oMTXrm+7lhk4GPKZt55eZf0/s akOZmHVyHA/81TpTvknraSwXVnLI4v4Fb82bg7S36ND7dyYcYPp3znFC4OXE2nUG9+A30SUVrU/ MgKJVKIlF9vmUZCWfgOnmdCBFzl8UpXvAGeLYB5SFCu29cdOR2xKZHBQSYHJvFMan9ehxfOKO1a CE4TXfhDn+sPoqlVSEZ3m2OW0aIlKNwsEZ8CfapSA8WUVdmx6B0W1LY+oxkB0BDoUxiaMDwPW2Z xHo/VQDSQIKngSg== X-Mailer: b4 0.13.0 Message-ID: <20240816-tracepoint-v7-4-d609b916b819@google.com> Subject: [PATCH v7 4/5] jump_label: adjust inline asm to be consistent From: Alice Ryhl To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Josh Poimboeuf , Jason Baron , Ard Biesheuvel , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg Cc: linux-trace-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Sean Christopherson , Uros Bizjak , Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , Mark Rutland , Ryan Roberts , Fuad Tabba , linux-arm-kernel@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Anup Patel , Andrew Jones , Alexandre Ghiti , Conor Dooley , Samuel Holland , linux-riscv@lists.infradead.org, Huacai Chen , WANG Xuerui , Bibo Mao , Tiezhu Yang , Andrew Morton , Tianrui Zhao , loongarch@lists.linux.dev, Alice Ryhl X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240816_040831_443072_E4FCF928 X-CRM114-Status: GOOD ( 14.02 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org To avoid duplication of inline asm between C and Rust, we need to import the inline asm from the relevant `jump_label.h` header into Rust. To make that easier, this patch updates the header files to expose the inline asm via a new ARCH_STATIC_BRANCH_ASM macro. The header files are all updated to define a ARCH_STATIC_BRANCH_ASM that takes the same arguments in a consistent order so that Rust can use the same logic for every architecture. Suggested-by: Peter Zijlstra (Intel) Acked-by: Peter Zijlstra (Intel) Co-developed-by: Miguel Ojeda Signed-off-by: Miguel Ojeda Signed-off-by: Alice Ryhl --- arch/arm/include/asm/jump_label.h | 14 +++++---- arch/arm64/include/asm/jump_label.h | 20 ++++++++----- arch/loongarch/include/asm/jump_label.h | 16 +++++++---- arch/riscv/include/asm/jump_label.h | 50 ++++++++++++++++++--------------- arch/x86/include/asm/jump_label.h | 38 ++++++++++--------------- 5 files changed, 75 insertions(+), 63 deletions(-) diff --git a/arch/arm/include/asm/jump_label.h b/arch/arm/include/asm/jump_label.h index e4eb54f6cd9f..a35aba7f548c 100644 --- a/arch/arm/include/asm/jump_label.h +++ b/arch/arm/include/asm/jump_label.h @@ -9,13 +9,17 @@ #define JUMP_LABEL_NOP_SIZE 4 +/* This macro is also expanded on the Rust side. */ +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + "1:\n\t" \ + WASM(nop) "\n\t" \ + ".pushsection __jump_table, \"aw\"\n\t" \ + ".word 1b, " label ", " key "\n\t" \ + ".popsection\n\t" \ + static __always_inline bool arch_static_branch(struct static_key *key, bool branch) { - asm goto("1:\n\t" - WASM(nop) "\n\t" - ".pushsection __jump_table, \"aw\"\n\t" - ".word 1b, %l[l_yes], %c0\n\t" - ".popsection\n\t" + asm goto(ARCH_STATIC_BRANCH_ASM("%c0", "%l[l_yes]") : : "i" (&((char *)key)[branch]) : : l_yes); return false; diff --git a/arch/arm64/include/asm/jump_label.h b/arch/arm64/include/asm/jump_label.h index a0a5bbae7229..424ed421cd97 100644 --- a/arch/arm64/include/asm/jump_label.h +++ b/arch/arm64/include/asm/jump_label.h @@ -19,10 +19,14 @@ #define JUMP_TABLE_ENTRY(key, label) \ ".pushsection __jump_table, \"aw\"\n\t" \ ".align 3\n\t" \ - ".long 1b - ., %l["#label"] - .\n\t" \ - ".quad %c0 - .\n\t" \ - ".popsection\n\t" \ - : : "i"(key) : : label + ".long 1b - ., " label " - .\n\t" \ + ".quad " key " - .\n\t" \ + ".popsection\n\t" + +/* This macro is also expanded on the Rust side. */ +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + "1: nop\n\t" \ + JUMP_TABLE_ENTRY(key, label) static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) @@ -30,8 +34,8 @@ static __always_inline bool arch_static_branch(struct static_key * const key, char *k = &((char *)key)[branch]; asm goto( - "1: nop \n\t" - JUMP_TABLE_ENTRY(k, l_yes) + ARCH_STATIC_BRANCH_ASM("%c0", "%l[l_yes]") + : : "i"(k) : : l_yes ); return false; @@ -43,9 +47,11 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke const bool branch) { char *k = &((char *)key)[branch]; + asm goto( "1: b %l[l_yes] \n\t" - JUMP_TABLE_ENTRY(k, l_yes) + JUMP_TABLE_ENTRY("%c0", "%l[l_yes]") + : : "i"(k) : : l_yes ); return false; l_yes: diff --git a/arch/loongarch/include/asm/jump_label.h b/arch/loongarch/include/asm/jump_label.h index 29acfe3de3fa..8a924bd69d19 100644 --- a/arch/loongarch/include/asm/jump_label.h +++ b/arch/loongarch/include/asm/jump_label.h @@ -13,18 +13,22 @@ #define JUMP_LABEL_NOP_SIZE 4 -#define JUMP_TABLE_ENTRY \ +/* This macro is also expanded on the Rust side. */ +#define JUMP_TABLE_ENTRY(key, label) \ ".pushsection __jump_table, \"aw\" \n\t" \ ".align 3 \n\t" \ - ".long 1b - ., %l[l_yes] - . \n\t" \ - ".quad %0 - . \n\t" \ + ".long 1b - ., " label " - . \n\t" \ + ".quad " key " - . \n\t" \ ".popsection \n\t" +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + "1: nop \n\t" \ + JUMP_TABLE_ENTRY(key, label) + static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) { asm goto( - "1: nop \n\t" - JUMP_TABLE_ENTRY + ARCH_STATIC_BRANCH_ASM("%0", "%l[l_yes]") : : "i"(&((char *)key)[branch]) : : l_yes); return false; @@ -37,7 +41,7 @@ static __always_inline bool arch_static_branch_jump(struct static_key * const ke { asm goto( "1: b %l[l_yes] \n\t" - JUMP_TABLE_ENTRY + JUMP_TABLE_ENTRY("%0", "%l[l_yes]") : : "i"(&((char *)key)[branch]) : : l_yes); return false; diff --git a/arch/riscv/include/asm/jump_label.h b/arch/riscv/include/asm/jump_label.h index 1c768d02bd0c..87a71cc6d146 100644 --- a/arch/riscv/include/asm/jump_label.h +++ b/arch/riscv/include/asm/jump_label.h @@ -16,21 +16,28 @@ #define JUMP_LABEL_NOP_SIZE 4 +#define JUMP_TABLE_ENTRY(key, label) \ + ".pushsection __jump_table, \"aw\" \n\t" \ + ".align " RISCV_LGPTR " \n\t" \ + ".long 1b - ., " label " - . \n\t" \ + "" RISCV_PTR " " key " - . \n\t" \ + ".popsection \n\t" + +/* This macro is also expanded on the Rust side. */ +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + " .align 2 \n\t" \ + " .option push \n\t" \ + " .option norelax \n\t" \ + " .option norvc \n\t" \ + "1: nop \n\t" \ + " .option pop \n\t" \ + JUMP_TABLE_ENTRY(key, label) + static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) { asm goto( - " .align 2 \n\t" - " .option push \n\t" - " .option norelax \n\t" - " .option norvc \n\t" - "1: nop \n\t" - " .option pop \n\t" - " .pushsection __jump_table, \"aw\" \n\t" - " .align " RISCV_LGPTR " \n\t" - " .long 1b - ., %l[label] - . \n\t" - " " RISCV_PTR " %0 - . \n\t" - " .popsection \n\t" + ARCH_STATIC_BRANCH_ASM("%0", "%l[label]") : : "i"(&((char *)key)[branch]) : : label); return false; @@ -38,21 +45,20 @@ static __always_inline bool arch_static_branch(struct static_key * const key, return true; } +#define ARCH_STATIC_BRANCH_JUMP_ASM(key, label) \ + " .align 2 \n\t" \ + " .option push \n\t" \ + " .option norelax \n\t" \ + " .option norvc \n\t" \ + "1: j " label " \n\t" \ + " .option pop \n\t" \ + JUMP_TABLE_ENTRY(key, label) + static __always_inline bool arch_static_branch_jump(struct static_key * const key, const bool branch) { asm goto( - " .align 2 \n\t" - " .option push \n\t" - " .option norelax \n\t" - " .option norvc \n\t" - "1: j %l[label] \n\t" - " .option pop \n\t" - " .pushsection __jump_table, \"aw\" \n\t" - " .align " RISCV_LGPTR " \n\t" - " .long 1b - ., %l[label] - . \n\t" - " " RISCV_PTR " %0 - . \n\t" - " .popsection \n\t" + ARCH_STATIC_BRANCH_JUMP_ASM("%0", "%l[label]") : : "i"(&((char *)key)[branch]) : : label); return false; diff --git a/arch/x86/include/asm/jump_label.h b/arch/x86/include/asm/jump_label.h index cbbef32517f0..fb79fa1cf70a 100644 --- a/arch/x86/include/asm/jump_label.h +++ b/arch/x86/include/asm/jump_label.h @@ -12,49 +12,41 @@ #include #include -#define JUMP_TABLE_ENTRY \ +#define JUMP_TABLE_ENTRY(key, label) \ ".pushsection __jump_table, \"aw\" \n\t" \ _ASM_ALIGN "\n\t" \ ".long 1b - . \n\t" \ - ".long %l[l_yes] - . \n\t" \ - _ASM_PTR "%c0 + %c1 - .\n\t" \ + ".long " label " - . \n\t" \ + _ASM_PTR " " key " - . \n\t" \ ".popsection \n\t" +/* This macro is also expanded on the Rust side. */ #ifdef CONFIG_HAVE_JUMP_LABEL_HACK - -static __always_inline bool arch_static_branch(struct static_key *key, bool branch) -{ - asm goto("1:" - "jmp %l[l_yes] # objtool NOPs this \n\t" - JUMP_TABLE_ENTRY - : : "i" (key), "i" (2 | branch) : : l_yes); - - return false; -l_yes: - return true; -} - +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + "1: jmp " label " # objtool NOPs this \n\t" \ + JUMP_TABLE_ENTRY(key, label) #else /* !CONFIG_HAVE_JUMP_LABEL_HACK */ +#define ARCH_STATIC_BRANCH_ASM(key, label) \ + "1: .byte " __stringify(BYTES_NOP5) "\n\t" \ + JUMP_TABLE_ENTRY(key, label) +#endif /* CONFIG_HAVE_JUMP_LABEL_HACK */ static __always_inline bool arch_static_branch(struct static_key * const key, const bool branch) { - asm goto("1:" - ".byte " __stringify(BYTES_NOP5) "\n\t" - JUMP_TABLE_ENTRY - : : "i" (key), "i" (branch) : : l_yes); + int hack_bit = IS_ENABLED(CONFIG_HAVE_JUMP_LABEL_HACK) ? 2 : 0; + asm goto(ARCH_STATIC_BRANCH_ASM("%c0 + %c1", "%l[l_yes]") + : : "i" (key), "i" (hack_bit | branch) : : l_yes); return false; l_yes: return true; } -#endif /* CONFIG_HAVE_JUMP_LABEL_HACK */ - static __always_inline bool arch_static_branch_jump(struct static_key * const key, const bool branch) { asm goto("1:" "jmp %l[l_yes]\n\t" - JUMP_TABLE_ENTRY + JUMP_TABLE_ENTRY("%c0 + %c1", "%l[l_yes]") : : "i" (key), "i" (branch) : : l_yes); return false; From patchwork Fri Aug 16 11:07:42 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alice Ryhl X-Patchwork-Id: 13765995 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 637FDC531DC for ; Fri, 16 Aug 2024 11:08:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:From:Subject:Message-ID: References:Mime-Version:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=JoB10MFu3sGbya+aSnPxbguocHS9FFAdf5MBUnVmZxA=; b=XbhfXvLtbSsWLmPT6KbjYt4P27 9eY5W2cGeliaRzrs6bhXE4qls7nQ0wk/fGXURcCSTH/hueLln64i3Yx9730eZY0dxbjUvqMq/0b1J Z80UG0LNihco5U4pysttbzhQlBF+x9Hy5fLYSSLUqF/4jPS1uxcWWF3+pHtgSklR+DRXw9dnTLz+3 MmXwD1LAiJUVo3P70iwFVyzYrRqianfm1hC9AW/s6T+Jf0FyfswF3A+4iGn6h5nB8LWhZdEZsNAzS cFtPJHn3nVrGDk9LWtZP+6HBxq+9zA9zdHWoqvuOiZelOwjHTGkb6XpQamWheyf+/EKnKuYWsuaAO JDnLekDg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1seup3-0000000Chc8-1yLU; Fri, 16 Aug 2024 11:08:45 +0000 Received: from mail-yb1-f202.google.com ([209.85.219.202]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1seuos-0000000ChTP-1ENv for linux-riscv@lists.infradead.org; Fri, 16 Aug 2024 11:08:38 +0000 Received: by mail-yb1-f202.google.com with SMTP id 3f1490d57ef6-e11368fa2e3so3170686276.3 for ; Fri, 16 Aug 2024 04:08:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1723806511; x=1724411311; darn=lists.infradead.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=1kYdvblUgw1OrOR7Jj8FoRwUp6cU/heH8TLgLEsBdOM=; b=2Agb2y1wv/iUzao0U7iOlLCQG4GP2zHoO+JhDw0PUk6pviWH1HApj59Nx9VwHBcvjv 2IdKLqKk7+mQld38AZgxbGcLYr+FMzVi8Fg+4Zz1BqOOxjGerJpdC4WRVjsC6uuskzmX ZCGHmHQV8eJc16gGky3wWHecKz0Mdd1wqUFhmfk++uhA7x0vnOXpvukC7tSSziosN3nH 97ljinU1aPfLk2hU8o7dkJ5PO3cw+alE0rfukFPVlJHeavhEiKqL4Th1CCiFcX+EpT+q 09OdLyF6W5z9SxGLXd+mXdNilDuUA83QKd+sv/ENZXQd+OsqUTeT5RA4fTZkqtg1wHMh iGFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1723806511; x=1724411311; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=1kYdvblUgw1OrOR7Jj8FoRwUp6cU/heH8TLgLEsBdOM=; b=FsT0YrnphJgc3PNxOG55k+3lHSHNwUuZ3kHXCs/glZNCkyLXqKBEdK10QmreWeC+1U 6GyjDpXSeAwDkaJCdpR8AysUlHqdl63Djw0TREa9fohodOZVZXrK3UpGZ7Dchp4+5J5K nnUnzsYGMepvQU7Hla68oN2zlFC0WICCS6buhNbHhXCJAWDFoT3p1RhceosCYRE0Doy0 811A+w/EaPYJ8k14dgwcmRwvZx/tsyM6Gky4TQr9kIYYXOOiqe/8w1dU6g2Y0+G4M9eR VDtJa2OMH0s10BQ8VmYocbuJYotjZj3M4UEo15Rirl1IHmWKAdJUVQlTucjiGlLTLXly 0sTQ== X-Forwarded-Encrypted: i=1; AJvYcCVAGesyhKesPK18SKGJs9zMYEN7MHd5jVLr1cDZ3S3PkBKMzNmtly7QJk/2VYokFsroBCc7ck1WUug++g==@lists.infradead.org X-Gm-Message-State: AOJu0YzSTg4QSbbGWHPHbWcbWqnnIz0DHlhdlZyHuxgFvcRqzKGltjVh EbbteGwN0RzHarD+QqxN7sLX2E5YAtLhtWwQ9Np+eEfZSOH4G993j4YIvOvRzVHYn0pcVYnX/PD 662clNYHEexKD+w== X-Google-Smtp-Source: AGHT+IHHn3SbNiaCXJVjGPZrPAeS795rmnbHQkIGg2oTGHUByE9noAMpW2KQu0mkZPJ0Vqp6E7Vjez3yz4VfD7s= X-Received: from aliceryhl.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:35bd]) (user=aliceryhl job=sendgmr) by 2002:a25:c7d1:0:b0:e11:623d:874 with SMTP id 3f1490d57ef6-e1180e6098fmr50843276.3.1723806511454; Fri, 16 Aug 2024 04:08:31 -0700 (PDT) Date: Fri, 16 Aug 2024 11:07:42 +0000 In-Reply-To: <20240816-tracepoint-v7-0-d609b916b819@google.com> Mime-Version: 1.0 References: <20240816-tracepoint-v7-0-d609b916b819@google.com> X-Developer-Key: i=aliceryhl@google.com; a=openpgp; fpr=49F6C1FAA74960F43A5B86A1EE7A392FDE96209F X-Developer-Signature: v=1; a=openpgp-sha256; l=8293; i=aliceryhl@google.com; h=from:subject:message-id; bh=eqhw7ynCkyqRTBYr25akl57ew2XiOS3KqCJmdV1FKbU=; b=owEBbQKS/ZANAwAKAQRYvu5YxjlGAcsmYgBmvzMfcXLQpUYwewTAhsSdNWmokGVZvVA8EJG// aC62ZEklIeJAjMEAAEKAB0WIQSDkqKUTWQHCvFIvbIEWL7uWMY5RgUCZr8zHwAKCRAEWL7uWMY5 RoZHD/9KDdVUP3BBgQ8pSdZ3eJOAhx3HVdp/bSXL+MXcHSRDrSDIsJwxRWZS60hr6EtwT6AurLn UPla/AqD6Oay++sCbgaH8VLUixf+Tbvt7yuogvGmQZWZNTHWTJDEc7r7qZQ59/R1jI/PupK3IZ5 WAKHPbXBDCc1TSWmWKgCFLofieTPsG6pwHc+YnT24Cvn0VDvTF1OGXGhR1ekG2wj4rGEoIzzJj8 s0exuGT7OLyWPcxq2VBhvcWcxbplSMH3JfAhlhEIZ42Cf9mKPcSIZZYz+6VFdiCQDNMXfuP3B9J 8KwdUNCYWQpJaNnDIQUJuUGCmngfihTxD8GOr/qT2p2xdPfLiSmaXHlmNBJ7+xdHCwFXZbaq6KF BbD9z1HOS3dl2AdojQ32VfZPxSruVbQpUqw5oQpLhm2qZafOgiQBCJtxBSJm8Q/XmXjDSu9qu0F iPWOoS0lzTbWgbZN5Aje/U+aRPjdSm2CvTOXMzPyf/FsfsvBnpDucB5mAJffbfo+3yYunvJBkCr rDQbQiObpHhbXbEBg4y6KMY83Load++HUKIJRkrniazwGFJnMUFvqMrN/Hk2gQuAQNbp8fvd93b +NGHq0nYPgGFl3/jed1TAWrgBirpddAnt31c3ls16hHqlKFV/OG1ygnWvnSfgYhxUF/djO7+BZx 9GKLEuK+9ku6UiA== X-Mailer: b4 0.13.0 Message-ID: <20240816-tracepoint-v7-5-d609b916b819@google.com> Subject: [PATCH v7 5/5] rust: add arch_static_branch From: Alice Ryhl To: Steven Rostedt , Masami Hiramatsu , Mathieu Desnoyers , Peter Zijlstra , Josh Poimboeuf , Jason Baron , Ard Biesheuvel , Miguel Ojeda , Alex Gaynor , Wedson Almeida Filho , Boqun Feng , Gary Guo , " =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= " , Benno Lossin , Andreas Hindborg Cc: linux-trace-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, Arnd Bergmann , linux-arch@vger.kernel.org, Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Sean Christopherson , Uros Bizjak , Catalin Marinas , Will Deacon , Marc Zyngier , Oliver Upton , Mark Rutland , Ryan Roberts , Fuad Tabba , linux-arm-kernel@lists.infradead.org, Paul Walmsley , Palmer Dabbelt , Albert Ou , Anup Patel , Andrew Jones , Alexandre Ghiti , Conor Dooley , Samuel Holland , linux-riscv@lists.infradead.org, Huacai Chen , WANG Xuerui , Bibo Mao , Tiezhu Yang , Andrew Morton , Tianrui Zhao , loongarch@lists.linux.dev, Alice Ryhl X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240816_040834_540250_F523981B X-CRM114-Status: GOOD ( 23.67 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org To allow the Rust implementation of static_key_false to use runtime code patching instead of the generic implementation, pull in the relevant inline assembly from the jump_label.h header by running the C preprocessor on a .rs.S file. Build rules are added for .rs.S files. Since the relevant inline asm has been adjusted to export the inline asm via the ARCH_STATIC_BRANCH_ASM macro in a consistent way, the Rust side does not need architecture specific code to pull in the asm. It is not possible to use the existing C implementation of arch_static_branch via a Rust helper because it passes the argument `key` to inline assembly as an 'i' parameter. Any attempt to add a C helper for this function will fail to compile because the value of `key` must be known at compile-time. Suggested-by: Peter Zijlstra (Intel) Co-developed-by: Miguel Ojeda Signed-off-by: Miguel Ojeda Signed-off-by: Alice Ryhl --- rust/Makefile | 5 ++- rust/kernel/.gitignore | 3 ++ rust/kernel/arch_static_branch_asm.rs.S | 7 ++++ rust/kernel/jump_label.rs | 64 ++++++++++++++++++++++++++++++++- rust/kernel/lib.rs | 30 ++++++++++++++++ scripts/Makefile.build | 9 ++++- 6 files changed, 115 insertions(+), 3 deletions(-) diff --git a/rust/Makefile b/rust/Makefile index 199e0db67962..277fcef656b8 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -14,6 +14,8 @@ CFLAGS_REMOVE_helpers.o = -Wmissing-prototypes -Wmissing-declarations always-$(CONFIG_RUST) += libmacros.so no-clean-files += libmacros.so +always-$(subst y,$(CONFIG_RUST),$(CONFIG_JUMP_LABEL)) += kernel/arch_static_branch_asm.rs + always-$(CONFIG_RUST) += bindings/bindings_generated.rs bindings/bindings_helpers_generated.rs obj-$(CONFIG_RUST) += alloc.o bindings.o kernel.o always-$(CONFIG_RUST) += exports_alloc_generated.h exports_bindings_generated.h \ @@ -409,7 +411,8 @@ $(obj)/uapi.o: $(src)/uapi/lib.rs \ $(obj)/kernel.o: private rustc_target_flags = --extern alloc \ --extern build_error --extern macros --extern bindings --extern uapi $(obj)/kernel.o: $(src)/kernel/lib.rs $(obj)/alloc.o $(obj)/build_error.o \ - $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o FORCE + $(obj)/libmacros.so $(obj)/bindings.o $(obj)/uapi.o \ + $(obj)/kernel/arch_static_branch_asm.rs FORCE +$(call if_changed_rule,rustc_library) endif # CONFIG_RUST diff --git a/rust/kernel/.gitignore b/rust/kernel/.gitignore new file mode 100644 index 000000000000..d082731007c6 --- /dev/null +++ b/rust/kernel/.gitignore @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0 + +/arch_static_branch_asm.rs diff --git a/rust/kernel/arch_static_branch_asm.rs.S b/rust/kernel/arch_static_branch_asm.rs.S new file mode 100644 index 000000000000..9e373d4f7567 --- /dev/null +++ b/rust/kernel/arch_static_branch_asm.rs.S @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include + +// Cut here. + +::kernel::concat_literals!(ARCH_STATIC_BRANCH_ASM("{symb} + {off} + {branch}", "{l_yes}")) diff --git a/rust/kernel/jump_label.rs b/rust/kernel/jump_label.rs index 011e1fc1d19a..7757e4f8e85e 100644 --- a/rust/kernel/jump_label.rs +++ b/rust/kernel/jump_label.rs @@ -23,7 +23,69 @@ macro_rules! static_key_false { let _key: *const $keytyp = ::core::ptr::addr_of!($key); let _key: *const $crate::bindings::static_key = ::core::ptr::addr_of!((*_key).$field); - $crate::bindings::static_key_count(_key.cast_mut()) > 0 + #[cfg(not(CONFIG_JUMP_LABEL))] + { + $crate::bindings::static_key_count(_key.cast_mut()) > 0 + } + + #[cfg(CONFIG_JUMP_LABEL)] + $crate::jump_label::arch_static_branch! { $key, $keytyp, $field, false } }}; } pub use static_key_false; + +/// Assert that the assembly block evaluates to a string literal. +#[cfg(CONFIG_JUMP_LABEL)] +const _: &str = include!("arch_static_branch_asm.rs"); + +#[macro_export] +#[doc(hidden)] +#[cfg(CONFIG_JUMP_LABEL)] +#[cfg(not(CONFIG_HAVE_JUMP_LABEL_HACK))] +macro_rules! arch_static_branch { + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: { + $crate::asm!( + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs")); + l_yes = label { + break 'my_label true; + }, + symb = sym $key, + off = const ::core::mem::offset_of!($keytyp, $field), + branch = const $crate::jump_label::bool_to_int($branch), + ); + + break 'my_label false; + }}; +} + +#[macro_export] +#[doc(hidden)] +#[cfg(CONFIG_JUMP_LABEL)] +#[cfg(CONFIG_HAVE_JUMP_LABEL_HACK)] +macro_rules! arch_static_branch { + ($key:path, $keytyp:ty, $field:ident, $branch:expr) => {'my_label: { + $crate::asm!( + include!(concat!(env!("SRCTREE"), "/rust/kernel/arch_static_branch_asm.rs")); + l_yes = label { + break 'my_label true; + }, + symb = sym $key, + off = const ::core::mem::offset_of!($keytyp, $field), + branch = const 2 | $crate::jump_label::bool_to_int($branch), + ); + + break 'my_label false; + }}; +} + +#[cfg(CONFIG_JUMP_LABEL)] +pub use arch_static_branch; + +/// A helper used by inline assembly to pass a boolean to as a `const` parameter. +/// +/// Using this function instead of a cast lets you assert that the input is a boolean, and not some +/// other type that can also be cast to an integer. +#[doc(hidden)] +pub const fn bool_to_int(b: bool) -> i32 { + b as i32 +} diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index d00a44b000b6..9e9b95ab6966 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -145,3 +145,33 @@ macro_rules! container_of { ptr.sub(offset) as *const $type }} } + +/// Helper for `.rs.S` files. +#[doc(hidden)] +#[macro_export] +macro_rules! concat_literals { + ($( $asm:literal )* ) => { + ::core::concat!($($asm),*) + }; +} + +/// Wrapper around `asm!` that uses at&t syntax on x86. +// Uses a semicolon to avoid parsing ambiguities, even though this does not match native `asm!` +// syntax. +#[cfg(target_arch = "x86_64")] +#[macro_export] +macro_rules! asm { + ($($asm:expr),* ; $($rest:tt)*) => { + ::core::arch::asm!( $($asm)*, options(att_syntax), $($rest)* ) + }; +} + +/// Wrapper around `asm!` that uses at&t syntax on x86. +// For non-x86 arches we just pass through to `asm!`. +#[cfg(not(target_arch = "x86_64"))] +#[macro_export] +macro_rules! asm { + ($($asm:expr),* ; $($rest:tt)*) => { + ::core::arch::asm!( $($asm)*, $($rest)* ) + }; +} diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 72b1232b1f7d..59fe83fba647 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -263,12 +263,13 @@ $(obj)/%.lst: $(obj)/%.c FORCE # Compile Rust sources (.rs) # --------------------------------------------------------------------------- -rust_allowed_features := new_uninit +rust_allowed_features := asm_const,asm_goto,new_uninit # `--out-dir` is required to avoid temporaries being created by `rustc` in the # current working directory, which may be not accessible in the out-of-tree # modules case. rust_common_cmd = \ + SRCTREE=$(abspath $(srctree)) \ RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \ -Zallow-features=$(rust_allowed_features) \ -Zcrate-attr=no_std \ @@ -318,6 +319,12 @@ quiet_cmd_rustc_ll_rs = $(RUSTC_OR_CLIPPY_QUIET) $(quiet_modtag) $@ $(obj)/%.ll: $(obj)/%.rs FORCE +$(call if_changed_dep,rustc_ll_rs) +quiet_cmd_rustc_rs_rs_S = RSCPP $(quiet_modtag) $@ + cmd_rustc_rs_rs_S = $(CPP) $(c_flags) -xc -C -P $< | sed '1,/^\/\/ Cut here.$$/d' >$@ + +$(obj)/%.rs: $(obj)/%.rs.S FORCE + +$(call if_changed_dep,rustc_rs_rs_S) + # Compile assembler sources (.S) # ---------------------------------------------------------------------------