rust-for-linux.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Question on Box<T> smart pointer
@ 2021-04-27 15:20 Fabio Aiuto
  2021-04-27 15:22 ` Alex Gaynor
  0 siblings, 1 reply; 4+ messages in thread
From: Fabio Aiuto @ 2021-04-27 15:20 UTC (permalink / raw)
  To: rust-for-linux

Hi all,

I have a question. There's one thing I miss.

If Box<T> smart pointer allows allocating space on the heap,
how is this behaviour overridden in linux kernel Rust?

I mean, in c we have all API's to allocate heap space,
but using "pure" Box<T> in kernel space what kind of
allocation provides?

If this question is stupid I apologize in advance,

thank you,

fabio

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Question on Box<T> smart pointer
  2021-04-27 15:20 Question on Box<T> smart pointer Fabio Aiuto
@ 2021-04-27 15:22 ` Alex Gaynor
  2021-04-27 15:33   ` Fabio Aiuto
  0 siblings, 1 reply; 4+ messages in thread
From: Alex Gaynor @ 2021-04-27 15:22 UTC (permalink / raw)
  To: Fabio Aiuto; +Cc: rust-for-linux

Box<T> in the kernel allocates on the kernel heap, via kmalloc. This
is done by providing a Rust GlobalAllocator:
https://github.com/Rust-for-Linux/linux/blob/rust/rust/kernel/allocator.rs#L11

Alex

On Tue, Apr 27, 2021 at 11:20 AM Fabio Aiuto <fabioaiuto83@gmail.com> wrote:
>
> Hi all,
>
> I have a question. There's one thing I miss.
>
> If Box<T> smart pointer allows allocating space on the heap,
> how is this behaviour overridden in linux kernel Rust?
>
> I mean, in c we have all API's to allocate heap space,
> but using "pure" Box<T> in kernel space what kind of
> allocation provides?
>
> If this question is stupid I apologize in advance,
>
> thank you,
>
> fabio



-- 
All that is necessary for evil to succeed is for good people to do nothing.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Question on Box<T> smart pointer
  2021-04-27 15:22 ` Alex Gaynor
@ 2021-04-27 15:33   ` Fabio Aiuto
  2021-04-27 15:35     ` Alex Gaynor
  0 siblings, 1 reply; 4+ messages in thread
From: Fabio Aiuto @ 2021-04-27 15:33 UTC (permalink / raw)
  To: Alex Gaynor; +Cc: rust-for-linux

On Tue, Apr 27, 2021 at 11:22:23AM -0400, Alex Gaynor wrote:
> Box<T> in the kernel allocates on the kernel heap, via kmalloc. This
> is done by providing a Rust GlobalAllocator:
> https://github.com/Rust-for-Linux/linux/blob/rust/rust/kernel/allocator.rs#L11

so this code:

pub struct KernelAllocator;

unsafe impl GlobalAlloc for KernelAllocator {
    unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
        // `krealloc()` is used instead of `kmalloc()` because the latter is
        // an inline function and cannot be bound to as a result.
        bindings::krealloc(ptr::null(), layout.size(), bindings::GFP_KERNEL) as *mut u8
    }

    unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
        bindings::kfree(ptr as *const c_types::c_void);
    }
}

overrides the default behaviour of Box<T> defined
in core::alloc::GlobalAlloc, doesn't it?

So this code overrides the general heap allocation
facility, not just Box<T>, right?

thank you,

fabio

> 
> Alex
> 
> On Tue, Apr 27, 2021 at 11:20 AM Fabio Aiuto <fabioaiuto83@gmail.com> wrote:
> >
> > Hi all,
> >
> > I have a question. There's one thing I miss.
> >
> > If Box<T> smart pointer allows allocating space on the heap,
> > how is this behaviour overridden in linux kernel Rust?
> >
> > I mean, in c we have all API's to allocate heap space,
> > but using "pure" Box<T> in kernel space what kind of
> > allocation provides?
> >
> > If this question is stupid I apologize in advance,
> >
> > thank you,
> >
> > fabio
> 
> 
> 
> -- 
> All that is necessary for evil to succeed is for good people to do nothing.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Question on Box<T> smart pointer
  2021-04-27 15:33   ` Fabio Aiuto
@ 2021-04-27 15:35     ` Alex Gaynor
  0 siblings, 0 replies; 4+ messages in thread
From: Alex Gaynor @ 2021-04-27 15:35 UTC (permalink / raw)
  To: Fabio Aiuto; +Cc: rust-for-linux

Yes, it overrides it for any APIs in the alloc crate that allocate
memory (Arc, Rc, Vec, String, etc.).

Technically https://github.com/Rust-for-Linux/linux/blob/rust/rust/kernel/lib.rs#L203-L204
is where the overriding really happens. The previous code I linked is
where the implementation is.

Alex

On Tue, Apr 27, 2021 at 11:33 AM Fabio Aiuto <fabioaiuto83@gmail.com> wrote:
>
> On Tue, Apr 27, 2021 at 11:22:23AM -0400, Alex Gaynor wrote:
> > Box<T> in the kernel allocates on the kernel heap, via kmalloc. This
> > is done by providing a Rust GlobalAllocator:
> > https://github.com/Rust-for-Linux/linux/blob/rust/rust/kernel/allocator.rs#L11
>
> so this code:
>
> pub struct KernelAllocator;
>
> unsafe impl GlobalAlloc for KernelAllocator {
>     unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
>         // `krealloc()` is used instead of `kmalloc()` because the latter is
>         // an inline function and cannot be bound to as a result.
>         bindings::krealloc(ptr::null(), layout.size(), bindings::GFP_KERNEL) as *mut u8
>     }
>
>     unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
>         bindings::kfree(ptr as *const c_types::c_void);
>     }
> }
>
> overrides the default behaviour of Box<T> defined
> in core::alloc::GlobalAlloc, doesn't it?
>
> So this code overrides the general heap allocation
> facility, not just Box<T>, right?
>
> thank you,
>
> fabio
>
> >
> > Alex
> >
> > On Tue, Apr 27, 2021 at 11:20 AM Fabio Aiuto <fabioaiuto83@gmail.com> wrote:
> > >
> > > Hi all,
> > >
> > > I have a question. There's one thing I miss.
> > >
> > > If Box<T> smart pointer allows allocating space on the heap,
> > > how is this behaviour overridden in linux kernel Rust?
> > >
> > > I mean, in c we have all API's to allocate heap space,
> > > but using "pure" Box<T> in kernel space what kind of
> > > allocation provides?
> > >
> > > If this question is stupid I apologize in advance,
> > >
> > > thank you,
> > >
> > > fabio
> >
> >
> >
> > --
> > All that is necessary for evil to succeed is for good people to do nothing.



-- 
All that is necessary for evil to succeed is for good people to do nothing.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-04-27 15:35 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-04-27 15:20 Question on Box<T> smart pointer Fabio Aiuto
2021-04-27 15:22 ` Alex Gaynor
2021-04-27 15:33   ` Fabio Aiuto
2021-04-27 15:35     ` Alex Gaynor

This is a public inbox, see mirroring instructions
on how to clone and mirror all data and code used for this inbox