svn commit: r327676 - head/sys/compat/linuxkpi/common/include/linux
Rodney W. Grimes
freebsd at pdx.rh.CN85.dnsmgr.net
Sun Jan 7 19:07:54 UTC 2018
> On 7 Jan 2018, at 19:37, Rodney W. Grimes wrote:
> >> On 7 Jan 2018, at 19:02, Rodney W. Grimes wrote:
> >>>> Author: kp
> >>>> Date: Sun Jan 7 13:39:12 2018
> >>>> New Revision: 327676
> >>>> URL: https://svnweb.freebsd.org/changeset/base/327676
> >>>>
> >>>> Log:
> >>>> linuxkpi: Implement kcalloc() based on mallocarray()
> >>>>
> >>>> This means we now get integer overflow protection, which Linux
> >>>> code
> >>>> might expect as it is also provided by kcalloc() in Linux.
> >>>>
> >>>> Modified:
> >>>> head/sys/compat/linuxkpi/common/include/linux/slab.h
> >>>>
> >>>> Modified: head/sys/compat/linuxkpi/common/include/linux/slab.h
> >>>> ==============================================================================
> >>>> --- head/sys/compat/linuxkpi/common/include/linux/slab.h Sun Jan 7
> >>>> 13:35:15 2018 (r327675)
> >>>> +++ head/sys/compat/linuxkpi/common/include/linux/slab.h Sun Jan 7
> >>>> 13:39:12 2018 (r327676)
> >>>> @@ -46,7 +46,6 @@ MALLOC_DECLARE(M_KMALLOC);
> >>>> #define kzalloc(size, flags) kmalloc(size, (flags) | __GFP_ZERO)
> >>>> #define kzalloc_node(size, flags, node) kmalloc(size, (flags) |
> >>>> __GFP_ZERO)
> >>>> #define kfree_const(ptr) kfree(ptr)
> >>>> -#define kcalloc(n, size, flags) kmalloc((n) * (size),
> >>>> (flags) | __GFP_ZERO)
> >>>
> >>> Would not:
> >>> #define kcalloc(n, size, flags) mallocarray(mallocarray((n),
> >>> (size), M_KMALLOC, linux_check_m_flags((flags | __GFP_ZERO))
> >>> work just fine, saving a call and stack use of about framesize + 32
> >>> bytes?
> >>>
> >>>
> >> It would also work, but it?d have to be split up into multiple lines
> >> then.
> >
> > But it would retain the direct macro form, your change changes it
> > from a #define which is evaluated at pre proc time to a function
> > call that is evaluated at compile time. The resulting code from
> > a -O0 well be different because of this.
> >
> Indeed. It?s not something I?d worry about as anyone who cares about
> it being fast (as opposed to easier to debug for example) would build it
> as -O2/-O3.
>
> >> I thought it?d be more readable as a function.
> >
> > If that is the only reason I would rather see it retain the
> > same form as all the other allocs.
> >
> How does this look?
>
> diff --git a/sys/compat/linuxkpi/common/include/linux/slab.h
> b/sys/compat/linuxkpi/common/include/linux/slab.h
> index 1f8ec82db98..5551211c281 100644
> --- a/sys/compat/linuxkpi/common/include/linux/slab.h
> +++ b/sys/compat/linuxkpi/common/include/linux/slab.h
> @@ -46,6 +46,9 @@ MALLOC_DECLARE(M_KMALLOC);
> #define kzalloc(size, flags) kmalloc(size, (flags) | __GFP_ZERO)
> #define kzalloc_node(size, flags, node) kmalloc(size, (flags) |
> __GFP_ZERO)
> #define kfree_const(ptr) kfree(ptr)
> +#define kcalloc(n, size, flags) mallocarray((n), (size), \
> + M_KMALLOC, \
> + linux_check_m_flags((flags | __GFP_ZERO)))
> #define vzalloc(size) __vmalloc(size, GFP_KERNEL | __GFP_NOWARN |
> __GFP_ZERO, 0)
> #define vfree(arg) kfree(arg)
> #define kvfree(arg) kfree(arg)
> @@ -99,13 +102,6 @@ kmalloc(size_t size, gfp_t flags)
> return (malloc(size, M_KMALLOC, linux_check_m_flags(flags)));
> }
>
> -static inline void *
> -kcalloc(size_t n, size_t size, gfp_t flags)
> -{
> - flags |= __GFP_ZERO;
> - return (mallocarray(n, size, M_KMALLOC, linux_check_m_flags(flags)));
> -}
> -
> static inline void *
> __vmalloc(size_t size, gfp_t flags, int other)
> {
>
> Regards,
> Kristof
Should probably revert and go through review,
I would at least wait for comments from others.
--
Rod Grimes rgrimes at freebsd.org
More information about the svn-src-all
mailing list