[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2026020315-conch-trickle-2d84@gregkh>
Date: Tue, 3 Feb 2026 17:28:55 +0100
From: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
To: Matthew Maurer <mmaurer@...gle.com>
Cc: Bjorn Andersson <andersson@...nel.org>,
Konrad Dybcio <konradybcio@...nel.org>,
Satya Durga Srinivasu Prabhala <satyap@...cinc.com>,
Miguel Ojeda <ojeda@...nel.org>, Boqun Feng <boqun.feng@...il.com>,
Gary Guo <gary@...yguo.net>,
Björn Roy Baron <bjorn3_gh@...tonmail.com>,
Benno Lossin <lossin@...nel.org>,
Andreas Hindborg <a.hindborg@...nel.org>,
Alice Ryhl <aliceryhl@...gle.com>, Trevor Gross <tmgross@...ch.edu>,
Danilo Krummrich <dakr@...nel.org>,
Daniel Almeida <daniel.almeida@...labora.com>,
"Rafael J. Wysocki" <rafael@...nel.org>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Michal Wilczynski <m.wilczynski@...sung.com>,
Dave Ertman <david.m.ertman@...el.com>,
Ira Weiny <ira.weiny@...el.com>, Leon Romanovsky <leon@...nel.org>,
Trilok Soni <tsoni@...cinc.com>, linux-kernel@...r.kernel.org,
linux-arm-msm@...r.kernel.org, rust-for-linux@...r.kernel.org,
driver-core@...ts.linux.dev, dri-devel@...ts.freedesktop.org,
linux-pwm@...r.kernel.org
Subject: Re: [PATCH v2 6/6] soc: qcom: socinfo: Convert to Rust
On Tue, Feb 03, 2026 at 03:46:35PM +0000, Matthew Maurer wrote:
> Convert the socinfo driver to Rust for a number of improvements:
> * Accessing IO mapped regions through the IO subsystem, rather than
> through regular memory accesses.
That's good, but the C code could also be "fixed" to do this, right?
> * Binds the device as an auxiliary device rather than a platform device,
> ensuring the mapped IO regions cannot be accessed after the smem
> device is removed.
I'm all for this, but is this really an aux device? What is the
"parent" device of this aux device? Where are the "siblings"? What
does sysfs look like before/after this?
> * Adds bounds-checking to all accesses, hardening against a repeat of
> CVE-2024-58007
How do you now "know" that the bounds checking is correct? The C
version also had this, it was just "not correct" :)
And which accesses are you referring to? From userspace? From the
kernel? That CVE looks very odd, it's probably not even a real one and
should be revoked, right?
> diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c
> index fef840b5457407a85051ded0e835430dbebfe8bb..dcea2d7f37067b0b6f801b3d2b457422ad9f342c 100644
> --- a/drivers/soc/qcom/smem.c
> +++ b/drivers/soc/qcom/smem.c
> @@ -4,6 +4,7 @@
> * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
> */
>
> +#include <linux/auxiliary_bus.h>
> #include <linux/hwspinlock.h>
> #include <linux/io.h>
> #include <linux/module.h>
> @@ -279,7 +280,6 @@ struct qcom_smem {
> struct hwspinlock *hwlock;
>
> u32 item_count;
> - struct platform_device *socinfo;
> struct smem_ptable *ptable;
> struct smem_partition global_partition;
> struct smem_partition partitions[SMEM_HOST_COUNT];
> @@ -675,6 +675,32 @@ static void *qcom_smem_get_private(struct qcom_smem *smem,
> return ERR_PTR(-EINVAL);
> }
>
> +/**
> + * qcom_smem_get_aux() - resolve ptr of size of a smem item
> + * @aux: an aux device that should be our child
> + * @host: the remote processor, or -1
> + * @item: smem item handle
> + * @size: pointer to be filled out with size of the item
> + *
> + * Looks up smem item and returns pointer to it. Size of smem
> + * item is returned in @size.
> + *
> + * The caller may take the loaded state of the provided aux device as
> + * an acceptable proxy for this memory being valid.
> + *
> + * Return: a pointer to an SMEM item on success, ERR_PTR() on failure.
> + */
> +void *qcom_smem_get_aux(struct auxiliary_device *aux, unsigned int host,
> + unsigned int item, size_t *size)
> +{
> + if (IS_ERR(__smem))
> + return __smem;
> + if (aux->dev.parent != __smem->dev)
> + return ERR_PTR(-EINVAL);
> + return qcom_smem_get(host, item, size);
So you are returning a void pointer? But don't you really know the
"type" of what is being asked here? It's a memory chunk, so u8? Or
something else? void * feels "rough" here.
> +}
> +EXPORT_SYMBOL_GPL(qcom_smem_get_aux);
> +
> /**
> * qcom_smem_get() - resolve ptr of size of a smem item
> * @host: the remote processor, or -1
> @@ -684,6 +710,9 @@ static void *qcom_smem_get_private(struct qcom_smem *smem,
> * Looks up smem item and returns pointer to it. Size of smem
> * item is returned in @size.
> *
> + * It is up to the caller to ensure that the qcom_smem device remains
> + * loaded by some mechanism when accessing returned memory.
What do you mean by "loaded"? You are saying that the caller needs to
rely on this driver remaining in memory for that memory to be "valid"?
If this is the case, why not take a reference count?
> +impl Smem {
> + pub(crate) fn access<'a>(&'a self, dev: &'a Device<Bound>) -> Option<&'a Mmio> {
> + if *dev != *self.dev {
How can this ever happen?
thanks,
greg k-h
Powered by blists - more mailing lists