Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Jul 2015 21:46:03 -0700
From:      John-Mark Gurney <jmg@funkthat.com>
To:        Laurie Jennings <laurie_jennings_1977@yahoo.com>
Cc:        John Baldwin <jhb@freebsd.org>, freebsd-net@freebsd.org
Subject:   Re: Locking Memory Question
Message-ID:  <20150730044603.GQ78154@funkthat.com>
In-Reply-To: <1438217542.41867.YahooMailBasic@web141502.mail.bf1.yahoo.com>
References:  <20150729232522.GN78154@funkthat.com> <1438217542.41867.YahooMailBasic@web141502.mail.bf1.yahoo.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Laurie Jennings wrote this message on Wed, Jul 29, 2015 at 17:52 -0700:
> --------------------------------------------
> On Wed, 7/29/15, John-Mark Gurney <jmg@funkthat.com> wrote:
> 
>  Subject: Re: Locking Memory Question
>  To: "Laurie Jennings" <laurie_jennings_1977@yahoo.com>
>  Cc: "John Baldwin" <jhb@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?

Correct, you can pass along the size, and if it's not large enough
try again... Less than ideal...

> Is there a way to malloc user space memory from within an ioctl call?

Well, it is possible that you could do the equivalent of mmap, and pass
the address back along w/ a length, and leave it up to the user to
munmap it...  This is probably the nicest method if you the size is
really largely variable, and it's expensive if the userland process
allocated too much memory...  The down side is that this is more
complex to code...

> Or
> would I just have to pass down a pointer to a huge buffer large enough for the largest possible answer?

This is probably the easiest...  This is similar to what sysctl does...
As part of sysctl, if the program didn't allocate enough space for the
buffer, it will return the require space, so that the next call it will
be correct (assuming size doesn't change regularly)...

Good luck!

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20150730044603.GQ78154>