Locking Memory Question
Laurie Jennings
laurie_jennings_1977 at yahoo.com
Thu Jul 30 19:37:59 UTC 2015
--------------------------------------------
On Thu, 7/30/15, Hooman Fazaeli <hoomanfazaeli at gmail.com> wrote:
Subject: Re: Locking Memory Question
To: "Laurie Jennings" <laurie_jennings_1977 at yahoo.com>
Cc: "freebsd-net at freebsd.org" <freebsd-net at freebsd.org>
Date: Thursday, July 30, 2015, 2:35 PM
On 7/30/2015 5:22 AM,
Laurie Jennings via freebsd-net wrote:
>
--------------------------------------------
> On Wed, 7/29/15, John-Mark Gurney <jmg at funkthat.com>
wrote:
>
> Subject: Re: Locking Memory
Question
> To: "Laurie
Jennings" <laurie_jennings_1977 at yahoo.com>
> Cc: "John Baldwin"
<jhb at freebsd.org>,
freebsd-net at freebsd.org
> Date: Wednesday, July 29,
2015, 7:25 PM
>
> Laurie Jennings via
> freebsd-net wrote this
message on Wed, Jul 29, 2015 at 15:26
> -0700:
> >
> > I have a problem and
> I can't quite figure out
where to look. This is what Im
> doing:
> >
> > I have an
> IOCTL to read a block of
data, but the data is too large to
> return via ioctl. So to get
the data,
> > I
> allocate a block in a kernel
module:
> >
>
> > foo =
> malloc(1024000,M_DEVBUF,M_WAITOK);
> >
> > I pass up a pointer
and in user space
> map it
using /dev/kmem:
>
> An easier solution would be
for your ioctl to
> pass in
a userland
> pointer and
then use
> copyout(9) to
push the data to userland... This
> means the userland process
doesn't have to
> have
/dev/kmem access...
>
> Is
> there a reason you need to
use kmem? The only reason you
> list above
> is that it's too large
via
> ioctl, but a copyout
is fine, and would
> handle
all page faults for you..
>
> __________________________________
> I'm using kmem because the only
options I could think of was to
>
> 1) use shared memory
>
2) use kmem
> 3) use a huge ioctl
structure.
>
> Im not
clear how I'd do that. the data being passed up from the
kernel is a variable size. To use copyout I'd have to
pass a
> pointer with a static buffer,
right? Is there a way to malloc user space memory from
within an ioctl call? Or
> would I just
have to pass down a pointer to a huge buffer large enough
for the largest possible answer?
>
> thanks
>
> Laurie
You can use two IOCTLs. Get the block size from
kernel module with the first ioctl,
and
malloc(3) a buffer in userland with that size. Then use a
second ioctl to pass the
address of
allocated buffer to kernel module. The module may use
copyout(9) to copy
in-kernel data to user
space buffer.
__________________
I sort of did that. I pass a buffer large enough for 99% of the cases, and if its too small I return the required
size and pass a bigger buffer. Its a low volume operation so I'm not too concerned about performance, but doing
2 IOCTLs every time would be particular inefficient. Its cleaner than kmem for sure.
Laurie
More information about the freebsd-net
mailing list