All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Danilo Krummrich" <dakr@kernel.org>
To: "Timur Tabi" <ttabi@nvidia.com>
Cc: Matthew Maurer <mmaurer@google.com>, Gary Guo <gary@garyguo.net>,
	Joel Fernandes <joelagnelf@nvidia.com>,
	Alexandre Courbot <acourbot@nvidia.com>,
	nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v5 8/8] gpu: nova-core: create GSP-RM logging buffers debugfs entries
Date: Sat, 17 Jan 2026 13:21:02 +0100	[thread overview]
Message-ID: <DFQUZ0DA9LJ5.2194XUZDLF0T2@kernel.org> (raw)
In-Reply-To: <20260116214959.641032-9-ttabi@nvidia.com>

On Fri Jan 16, 2026 at 10:49 PM CET, Timur Tabi wrote:
> Create read-only debugfs entries for LOGINIT, LOGRM, and LOGINTR, which
> are the three primary printf logging buffers from GSP-RM.  LOGPMU will
> be added at a later date, as it requires it support for its RPC message
> first.
>
> This patch uses the `pin_init_scope` feature to create the entries.
> `pin_init_scope` solves the lifetime issue over the `DEBUGFS_ROOT`
> reference by delaying its acquisition until the time the entry is
> actually initialized.
>
> Co-developed-by: Alexandre Courbot <acourbot@nvidia.com>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>
> ---
>  drivers/gpu/nova-core/gsp.rs | 45 +++++++++++++++++++++++++++++-------
>  1 file changed, 37 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs
> index 273327c33aa7..4b194bb805b4 100644
> --- a/drivers/gpu/nova-core/gsp.rs
> +++ b/drivers/gpu/nova-core/gsp.rs
> @@ -3,6 +3,7 @@
>  mod boot;
>  
>  use kernel::{
> +    c_str,
>      debugfs,
>      device,
>      dma::{
> @@ -101,17 +102,24 @@ fn new(dev: &device::Device<device::Bound>) -> Result<Self> {
>      }
>  }
>  
> -/// GSP runtime data.
> -#[pin_data]
> -pub(crate) struct Gsp {
> -    /// Libos arguments.
> -    pub(crate) libos: CoherentAllocation<LibosMemoryRegionInitArgument>,
> +/// Log buffers used by GSP-RM for debug logging.
> +struct LogBuffers {
>      /// Init log buffer.
>      loginit: LogBuffer,
>      /// Interrupts log buffer.
>      logintr: LogBuffer,
>      /// RM log buffer.
>      logrm: LogBuffer,
> +}
> +
> +/// GSP runtime data.
> +#[pin_data]
> +pub(crate) struct Gsp {
> +    /// Libos arguments.
> +    pub(crate) libos: CoherentAllocation<LibosMemoryRegionInitArgument>,
> +    /// Log buffers, optionally exposed via debugfs.
> +    #[pin]
> +    logs: debugfs::Scope<LogBuffers>,
>      /// Command queue.
>      pub(crate) cmdq: Cmdq,
>      /// RM arguments.
> @@ -163,15 +171,17 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
>          pin_init::pin_init_scope(move || {
>              let dev = pdev.as_ref();
>  
> +            // Create log buffers before try_pin_init! so they're accessible throughout
> +            let loginit = LogBuffer::new(dev)?;
> +            let logintr = LogBuffer::new(dev)?;
> +            let logrm = LogBuffer::new(dev)?;
> +
>              Ok(try_pin_init!(Self {
>                  libos: CoherentAllocation::<LibosMemoryRegionInitArgument>::alloc_coherent(
>                      dev,
>                      GSP_PAGE_SIZE / size_of::<LibosMemoryRegionInitArgument>(),
>                      GFP_KERNEL | __GFP_ZERO,
>                  )?,
> -                loginit: LogBuffer::new(dev)?,
> -                logintr: LogBuffer::new(dev)?,
> -                logrm: LogBuffer::new(dev)?,
>                  cmdq: Cmdq::new(dev)?,
>                  rmargs: CoherentAllocation::<GspArgumentsCached>::alloc_coherent(
>                      dev,
> @@ -192,6 +202,25 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
>                      dma_write!(rmargs[0] = fw::GspArgumentsCached::new(cmdq))?;
>                      dma_write!(libos[3] = LibosMemoryRegionInitArgument::new("RMARGS", rmargs))?;
>                  },
> +                logs <- {
> +                    let log_buffers = LogBuffers {
> +                        loginit,
> +                        logintr,
> +                        logrm,
> +                    };
> +
> +                    #[allow(static_mut_refs)]
> +                    // SAFETY: `DEBUGFS_ROOT` is never modified after initialization, so it is
> +                    // safe to create a shared reference to it.

Well, it is modified in module_exit(), so you have to justify why this can't
race with module_exit(). I.e. because you drop the driver registration first.

You also have to say that the debugfs dir is created before the driver
registration.

> +                    let debugfs_root = unsafe { crate::DEBUGFS_ROOT.as_ref() }
> +                        .unwrap_or_else(|| debugfs::Dir::empty());
> +
> +                    debugfs_root.scope(log_buffers, dev.name(), |logs, dir| {
> +                        dir.read_binary_file(c_str!("loginit"), &logs.loginit);
> +                        dir.read_binary_file(c_str!("logintr"), &logs.logintr);
> +                        dir.read_binary_file(c_str!("logrm"), &logs.logrm);
> +                    })
> +                },
>              }))
>          })
>      }
> -- 
> 2.52.0


WARNING: multiple messages have this Message-ID (diff)
From: "Danilo Krummrich" <dakr@kernel.org>
To: "Timur Tabi" <ttabi@nvidia.com>
Cc: "Matthew Maurer" <mmaurer@google.com>,
	"Gary Guo" <gary@garyguo.net>,
	"John Hubbard" <jhubbard@nvidia.com>,
	"Joel Fernandes" <joelagnelf@nvidia.com>,
	"Alexandre Courbot" <acourbot@nvidia.com>,
	<nouveau@lists.freedesktop.org>, <rust-for-linux@vger.kernel.org>
Subject: Re: [PATCH v5 8/8] gpu: nova-core: create GSP-RM logging buffers debugfs entries
Date: Sat, 17 Jan 2026 13:21:02 +0100	[thread overview]
Message-ID: <DFQUZ0DA9LJ5.2194XUZDLF0T2@kernel.org> (raw)
In-Reply-To: <20260116214959.641032-9-ttabi@nvidia.com>

On Fri Jan 16, 2026 at 10:49 PM CET, Timur Tabi wrote:
> Create read-only debugfs entries for LOGINIT, LOGRM, and LOGINTR, which
> are the three primary printf logging buffers from GSP-RM.  LOGPMU will
> be added at a later date, as it requires it support for its RPC message
> first.
>
> This patch uses the `pin_init_scope` feature to create the entries.
> `pin_init_scope` solves the lifetime issue over the `DEBUGFS_ROOT`
> reference by delaying its acquisition until the time the entry is
> actually initialized.
>
> Co-developed-by: Alexandre Courbot <acourbot@nvidia.com>
> Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
> Signed-off-by: Timur Tabi <ttabi@nvidia.com>
> ---
>  drivers/gpu/nova-core/gsp.rs | 45 +++++++++++++++++++++++++++++-------
>  1 file changed, 37 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs
> index 273327c33aa7..4b194bb805b4 100644
> --- a/drivers/gpu/nova-core/gsp.rs
> +++ b/drivers/gpu/nova-core/gsp.rs
> @@ -3,6 +3,7 @@
>  mod boot;
>  
>  use kernel::{
> +    c_str,
>      debugfs,
>      device,
>      dma::{
> @@ -101,17 +102,24 @@ fn new(dev: &device::Device<device::Bound>) -> Result<Self> {
>      }
>  }
>  
> -/// GSP runtime data.
> -#[pin_data]
> -pub(crate) struct Gsp {
> -    /// Libos arguments.
> -    pub(crate) libos: CoherentAllocation<LibosMemoryRegionInitArgument>,
> +/// Log buffers used by GSP-RM for debug logging.
> +struct LogBuffers {
>      /// Init log buffer.
>      loginit: LogBuffer,
>      /// Interrupts log buffer.
>      logintr: LogBuffer,
>      /// RM log buffer.
>      logrm: LogBuffer,
> +}
> +
> +/// GSP runtime data.
> +#[pin_data]
> +pub(crate) struct Gsp {
> +    /// Libos arguments.
> +    pub(crate) libos: CoherentAllocation<LibosMemoryRegionInitArgument>,
> +    /// Log buffers, optionally exposed via debugfs.
> +    #[pin]
> +    logs: debugfs::Scope<LogBuffers>,
>      /// Command queue.
>      pub(crate) cmdq: Cmdq,
>      /// RM arguments.
> @@ -163,15 +171,17 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
>          pin_init::pin_init_scope(move || {
>              let dev = pdev.as_ref();
>  
> +            // Create log buffers before try_pin_init! so they're accessible throughout
> +            let loginit = LogBuffer::new(dev)?;
> +            let logintr = LogBuffer::new(dev)?;
> +            let logrm = LogBuffer::new(dev)?;
> +
>              Ok(try_pin_init!(Self {
>                  libos: CoherentAllocation::<LibosMemoryRegionInitArgument>::alloc_coherent(
>                      dev,
>                      GSP_PAGE_SIZE / size_of::<LibosMemoryRegionInitArgument>(),
>                      GFP_KERNEL | __GFP_ZERO,
>                  )?,
> -                loginit: LogBuffer::new(dev)?,
> -                logintr: LogBuffer::new(dev)?,
> -                logrm: LogBuffer::new(dev)?,
>                  cmdq: Cmdq::new(dev)?,
>                  rmargs: CoherentAllocation::<GspArgumentsCached>::alloc_coherent(
>                      dev,
> @@ -192,6 +202,25 @@ pub(crate) fn new(pdev: &pci::Device<device::Bound>) -> impl PinInit<Self, Error
>                      dma_write!(rmargs[0] = fw::GspArgumentsCached::new(cmdq))?;
>                      dma_write!(libos[3] = LibosMemoryRegionInitArgument::new("RMARGS", rmargs))?;
>                  },
> +                logs <- {
> +                    let log_buffers = LogBuffers {
> +                        loginit,
> +                        logintr,
> +                        logrm,
> +                    };
> +
> +                    #[allow(static_mut_refs)]
> +                    // SAFETY: `DEBUGFS_ROOT` is never modified after initialization, so it is
> +                    // safe to create a shared reference to it.

Well, it is modified in module_exit(), so you have to justify why this can't
race with module_exit(). I.e. because you drop the driver registration first.

You also have to say that the debugfs dir is created before the driver
registration.

> +                    let debugfs_root = unsafe { crate::DEBUGFS_ROOT.as_ref() }
> +                        .unwrap_or_else(|| debugfs::Dir::empty());
> +
> +                    debugfs_root.scope(log_buffers, dev.name(), |logs, dir| {
> +                        dir.read_binary_file(c_str!("loginit"), &logs.loginit);
> +                        dir.read_binary_file(c_str!("logintr"), &logs.logintr);
> +                        dir.read_binary_file(c_str!("logrm"), &logs.logrm);
> +                    })
> +                },
>              }))
>          })
>      }
> -- 
> 2.52.0


  reply	other threads:[~2026-01-17 12:21 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-01-16 21:49 [PATCH v5 0/8] gpu: nova-core: expose the logging buffers via debugfs Timur Tabi
2026-01-16 21:49 ` [PATCH v5 1/8] rust: pci: add device name method Timur Tabi
2026-01-17 11:09   ` Danilo Krummrich
2026-01-17 11:09     ` Danilo Krummrich
2026-01-27 21:04     ` Timur Tabi
2026-01-27 21:04       ` Timur Tabi
2026-01-27 21:07       ` Danilo Krummrich
2026-01-27 21:07         ` Danilo Krummrich
2026-01-16 21:49 ` [PATCH v5 2/8] rust: debugfs: add Dir::empty() for conditional debugfs usage Timur Tabi
2026-01-19 12:08   ` Gary Guo
2026-01-20 17:54   ` Matthew Maurer
2026-01-20 17:54     ` Matthew Maurer
2026-01-20 18:19     ` Danilo Krummrich
2026-01-20 18:19       ` Danilo Krummrich
2026-01-16 21:49 ` [PATCH v5 3/8] rust: uaccess: add UserSliceWriter::write_buffer() for raw pointer writes Timur Tabi
2026-01-17 11:18   ` Danilo Krummrich
2026-01-17 11:18     ` Danilo Krummrich
2026-01-17 11:19     ` Danilo Krummrich
2026-01-17 11:19       ` Danilo Krummrich
2026-01-17 13:23   ` Alice Ryhl
2026-01-17 13:23     ` Alice Ryhl
2026-01-17 14:23     ` Alice Ryhl
2026-01-17 14:23       ` Alice Ryhl
2026-01-17 14:35       ` Danilo Krummrich
2026-01-17 14:35         ` Danilo Krummrich
2026-01-19 12:13         ` Gary Guo
2026-01-19 12:13           ` Gary Guo
2026-01-19 12:38           ` Danilo Krummrich
2026-01-19 12:38             ` Danilo Krummrich
2026-01-16 21:49 ` [PATCH v5 4/8] gpu: nova-core: implement BinaryWriter for LogBuffer Timur Tabi
2026-01-17 11:22   ` Danilo Krummrich
2026-01-17 11:22     ` Danilo Krummrich
2026-01-19 12:17   ` Gary Guo
2026-01-28 20:20     ` Timur Tabi
2026-01-16 21:49 ` [PATCH v5 5/8] gpu: nova-core: Replace module_pci_driver! with explicit module init Timur Tabi
2026-01-17 11:24   ` Danilo Krummrich
2026-01-17 11:24     ` Danilo Krummrich
2026-01-28 20:52     ` Timur Tabi
2026-01-28 20:52       ` Timur Tabi
2026-01-16 21:49 ` [PATCH v5 6/8] gpu: nova-core: use pin projection in method boot() Timur Tabi
2026-01-16 21:49 ` [PATCH v5 7/8] gpu: nova-core: create debugfs root in module init Timur Tabi
2026-01-17 12:18   ` Danilo Krummrich
2026-01-17 12:18     ` Danilo Krummrich
2026-01-17 12:29   ` Danilo Krummrich
2026-01-17 12:29     ` Danilo Krummrich
2026-01-17 20:58     ` Timur Tabi
2026-01-17 20:58       ` Timur Tabi
2026-01-17 21:35       ` Danilo Krummrich
2026-01-17 21:35         ` Danilo Krummrich
2026-01-17 21:52         ` Timur Tabi
2026-01-17 21:52           ` Timur Tabi
2026-01-17 22:00           ` Danilo Krummrich
2026-01-17 22:00             ` Danilo Krummrich
2026-01-16 21:49 ` [PATCH v5 8/8] gpu: nova-core: create GSP-RM logging buffers debugfs entries Timur Tabi
2026-01-17 12:21   ` Danilo Krummrich [this message]
2026-01-17 12:21     ` Danilo Krummrich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DFQUZ0DA9LJ5.2194XUZDLF0T2@kernel.org \
    --to=dakr@kernel.org \
    --cc=acourbot@nvidia.com \
    --cc=gary@garyguo.net \
    --cc=joelagnelf@nvidia.com \
    --cc=mmaurer@google.com \
    --cc=nouveau@lists.freedesktop.org \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=ttabi@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.