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-head mailing list