From: "Alexandre Courbot" <acourbot@nvidia.com>
To: "Abdiel Janulgue" <abdiel.janulgue@gmail.com>,
"Lyude Paul" <lyude@redhat.com>, "Jason Gunthorpe" <jgg@ziepe.ca>
Cc: dakr@kernel.org, "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <benno.lossin@proton.me>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Valentin Obst" <kernel@valentinobst.de>,
"open list" <linux-kernel@vger.kernel.org>,
"Marek Szyprowski" <m.szyprowski@samsung.com>,
"Robin Murphy" <robin.murphy@arm.com>,
airlied@redhat.com, rust-for-linux@vger.kernel.org,
"open list:DMA MAPPING HELPERS" <iommu@lists.linux.dev>,
"Petr Tesarik" <petr@tesarici.cz>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Herbert Xu" <herbert@gondor.apana.org.au>,
"Sui Jingfeng" <sui.jingfeng@linux.dev>,
"Randy Dunlap" <rdunlap@infradead.org>,
"Michael Kelley" <mhklinux@outlook.com>
Subject: Re: [PATCH 1/2] rust: add initial scatterlist bindings
Date: Sat, 28 Jun 2025 20:07:34 +0900 [thread overview]
Message-ID: <DAY4A657OJJF.3GE3LBCFXU6SI@nvidia.com> (raw)
In-Reply-To: <e2677c26-1c25-4a34-b666-9dcfa9642fd1@gmail.com>
On Fri Jun 27, 2025 at 5:31 AM JST, Abdiel Janulgue wrote:
>
>
> On 18/06/2025 04:03, Alexandre Courbot wrote:
>> Hi Lyude, sorry for taking so long to come back to this!
>>
>> On Tue Jun 10, 2025 at 2:44 AM JST, Lyude Paul wrote:
>>> On Thu, 2025-06-05 at 22:56 +0900, Alexandre Courbot wrote:
>>>> On Thu Jun 5, 2025 at 10:30 PM JST, Abdiel Janulgue wrote:
>>>>>
>>>>>
>>>>> On 05/06/2025 08:51, Alexandre Courbot wrote:
>>>>>> Maybe I need more context to understand your problem, but the point of
>>>>>> this design is precisely that it doesn't make any assumption about the
>>>>>> memory layout - all `P` needs to do is provide the pages describing the
>>>>>> memory backing.
>>>>>>
>>>>>> Assuming that `_owner` here is the owner of the memory, couldn't you
>>>>>> flip your data layout and pass `_owner` (or rather a newtype wrapping
>>>>>> it) to `SGTable`, thus removing the need for a custom type?
>>>>>
>>>>> I think what Lyude has in mind here (Lyude, correct me if I'm wrong) is
>>>>> for cases where we need to have a rust SGTable instances for those
>>>>> struct sg_table that we didn't allocate ourselves for instance in the
>>>>> gem shmem bindings. So memory layout needs to match for
>>>>> #[repr(transparent)] to work
>>>>
>>>> Thanks, I think I am starting to understand and this is a problem
>>>> indeed. I should probably take a look at the DRM code to get my answers,
>>>> but IIUC in `OwnedSGTable`, `sg_table` is already provided by the C side
>>>> and is backed by `_owner`?
>>>
>>> Correct. You generally create a gem shmem object, and then you can call a
>>> function to ask gem to create an sg_table and hand it back to you. I should
>>> note my priorities have shifted a bit from trying to get shmem bindings
>>> upstream, but currently it's still the best example I have of this usecase.
>>>
>>> So, for gem shmem this means we can operate with an SGTable in two ways:
>>>
>>> * gem_shmem_object.sg_table() -> Result<&kernel::scatterlist::SGTable>
>>> * gem_shmem_object.owned_sg_table() ->
>>> Result<kernel::drm::gem::shmem::OwnedSGTable<T: DriverObject>
>>>
>>> I'm going to call the first return type SGTable and the second one
>>> OwnedSGTable, just so I can type a bit less.
>>>
>>> The first, sg_table(), quite literally just calls drm_gem_shmem_get_pages_sgt
>>> which attempts to allocate the table and return a pointer to it on success. We
>>> then cast that to &SGTable and return it to the user. This can be good for
>>
>> Mmm but if you cast the returned C pointer into a `&SGTable`, then who
>> owns (and is responsible for freeing) the `SGTable` it refers to? If the
>> pointer is just turned into a reference then this might leak the `struct
>> sg_table`.
>>
>
> Just commenting on this bit. From what I've seen, we don't actually leak
> anything. The cast only creates a reference to the original C `struct
> sg_table` object which was allocated and owned by whichever kernel
> subsystem called sg_alloc_table(). Rust doesn't even allow us to take
> ownership or to dereference the value, so this one is safe. Destructors
> are not called on those "casted" objects.
Looks like I was confused about how `sg_table()` worked. This
method is introduced in [1] and calls `drm_gem_shmem_get_pages_sgt`. I
assumed that it did a `sg_alloc_table*` somewhere and returned the
result, leaving the caller responsible for releasing it - which would
indeed introduce a leak if we just converted that pointer into a
reference.
But instead it appears that the SG table is allocated once, mapped and
stored into `shmem->sgt`, and that's the pointer that is returned. Thus
`shmem` is the owner of the table and the semantics are indeed safe.
Thanks for the clarification.
[1] https://lore.kernel.org/rust-for-linux/20250521204654.1610607-8-lyude@redhat.com/
next prev parent reply other threads:[~2025-06-28 11:07 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-28 22:14 [PATCH 0/2] rust: add initial scatterlist abstraction Abdiel Janulgue
2025-05-28 22:14 ` [PATCH 1/2] rust: add initial scatterlist bindings Abdiel Janulgue
2025-05-29 0:45 ` Jason Gunthorpe
2025-05-29 14:14 ` Petr Tesařík
2025-05-29 14:36 ` Jason Gunthorpe
2025-05-30 14:02 ` Alexandre Courbot
2025-05-30 14:14 ` Jason Gunthorpe
2025-05-30 14:44 ` Alexandre Courbot
2025-05-30 14:50 ` Jason Gunthorpe
2025-05-30 15:18 ` Danilo Krummrich
2025-05-31 12:54 ` Alexandre Courbot
2025-06-02 11:40 ` Jason Gunthorpe
2025-06-02 12:25 ` Abdiel Janulgue
2025-06-02 12:41 ` Alexandre Courbot
2025-06-04 18:21 ` Lyude Paul
2025-06-05 5:51 ` Alexandre Courbot
2025-06-05 13:30 ` Abdiel Janulgue
2025-06-05 13:56 ` Alexandre Courbot
2025-06-09 17:44 ` Lyude Paul
2025-06-18 1:03 ` Alexandre Courbot
2025-06-26 20:31 ` Abdiel Janulgue
2025-06-26 22:43 ` Jason Gunthorpe
2025-06-26 23:44 ` Danilo Krummrich
2025-06-28 11:07 ` Alexandre Courbot [this message]
2025-06-05 13:22 ` Abdiel Janulgue
2025-06-28 11:18 ` Alexandre Courbot
2025-06-30 7:11 ` Abdiel Janulgue
2025-06-05 15:35 ` Boqun Feng
2025-06-05 16:02 ` Jason Gunthorpe
2025-06-05 16:18 ` Boqun Feng
2025-05-30 11:04 ` Alexandre Courbot
2025-05-28 22:14 ` [PATCH 2/2] samples: rust: add sample code for " Abdiel Janulgue
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=DAY4A657OJJF.3GE3LBCFXU6SI@nvidia.com \
--to=acourbot@nvidia.com \
--cc=a.hindborg@kernel.org \
--cc=abdiel.janulgue@gmail.com \
--cc=airlied@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=benno.lossin@proton.me \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=dakr@kernel.org \
--cc=gary@garyguo.net \
--cc=herbert@gondor.apana.org.au \
--cc=iommu@lists.linux.dev \
--cc=jgg@ziepe.ca \
--cc=kernel@valentinobst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=lyude@redhat.com \
--cc=m.szyprowski@samsung.com \
--cc=mhklinux@outlook.com \
--cc=ojeda@kernel.org \
--cc=petr@tesarici.cz \
--cc=rdunlap@infradead.org \
--cc=robin.murphy@arm.com \
--cc=rust-for-linux@vger.kernel.org \
--cc=sui.jingfeng@linux.dev \
--cc=tmgross@umich.edu \
/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.