svn commit: r274017 - head/sys/kern
Julian Elischer
julian at freebsd.org
Mon Nov 3 08:21:16 UTC 2014
On 11/3/14, 3:46 PM, Mateusz Guzik wrote:
> Author: mjg
> Date: Mon Nov 3 07:46:51 2014
> New Revision: 274017
> URL: https://svnweb.freebsd.org/changeset/base/274017
>
> Log:
> Provide an on-stack temporary buffer for small ioctl requests.
I'm not sure I like this. We don't know how many more levels
of stack may be needed.
I know that machines are getting faster with more memory,
but the current move towards bloating out the
worries me. we started out with a single page of stack (SHARED
with the U-area!). I think we are now at several pages.. I forget, is
it 8?
I'm open to being persuaded but I think we need to have a discussion
about stack usage. We used to say that anything greater that, say
64 bytes should probably be allocated.
> Modified:
> head/sys/kern/sys_generic.c
>
> Modified: head/sys/kern/sys_generic.c
> ==============================================================================
> --- head/sys/kern/sys_generic.c Mon Nov 3 07:18:42 2014 (r274016)
> +++ head/sys/kern/sys_generic.c Mon Nov 3 07:46:51 2014 (r274017)
> @@ -649,6 +649,7 @@ sys_ioctl(struct thread *td, struct ioct
> u_long com;
> int arg, error;
> u_int size;
> + u_char smalldata[128];
> caddr_t data;
>
> if (uap->com > 0xffffffff) {
> @@ -680,17 +681,18 @@ sys_ioctl(struct thread *td, struct ioct
> arg = (intptr_t)uap->data;
> data = (void *)&arg;
> size = 0;
> - } else
> - data = malloc((u_long)size, M_IOCTLOPS, M_WAITOK);
> + } else {
> + if (size <= sizeof(smalldata))
> + data = smalldata;
> + else
> + data = malloc((u_long)size, M_IOCTLOPS, M_WAITOK);
> + }
> } else
> data = (void *)&uap->data;
> if (com & IOC_IN) {
> error = copyin(uap->data, data, (u_int)size);
> - if (error) {
> - if (size > 0)
> - free(data, M_IOCTLOPS);
> - return (error);
> - }
> + if (error != 0)
> + goto out;
> } else if (com & IOC_OUT) {
> /*
> * Zero the buffer so the user always
> @@ -704,7 +706,8 @@ sys_ioctl(struct thread *td, struct ioct
> if (error == 0 && (com & IOC_OUT))
> error = copyout(data, uap->data, (u_int)size);
>
> - if (size > 0)
> +out:
> + if (size > 0 && data != (caddr_t)&smalldata)
> free(data, M_IOCTLOPS);
> return (error);
> }
>
>
>
More information about the svn-src-all
mailing list