svn commit: r327676 - head/sys/compat/linuxkpi/common/include/linux
Kristof Provost
kp at FreeBSD.org
Sun Jan 7 18:53:03 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
More information about the svn-src-head
mailing list