--------------------------------------------
On Thu, 7/30/15, Hooman Fazaeli <hoomanfaza...@gmail.com> wrote:

 Subject: Re: Locking Memory Question
 To: "Laurie Jennings" <laurie_jennings_1...@yahoo.com>
 Cc: "freebsd-net@freebsd.org" <freebsd-net@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 <j...@funkthat.com>
 wrote:
 >
 >   Subject: Re: Locking Memory
 Question
 >   To: "Laurie
 Jennings" <laurie_jennings_1...@yahoo.com>
 >   Cc: "John Baldwin"
 <j...@freebsd.org>,
 freebsd-net@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
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"

Reply via email to