90 lines
2.7 KiB
Diff
90 lines
2.7 KiB
Diff
|
# HG changeset patch
|
||
|
# User Jan Beulich <jbeulich@suse.com>
|
||
|
# Date 1317730526 -7200
|
||
|
# Node ID e09ebf7a31f55bb26c3cce7695a435ed20adf05b
|
||
|
# Parent a99d75671a911f9c0d5d11e0fe88a0a65863cb44
|
||
|
introduce xzalloc() & Co
|
||
|
|
||
|
Rather than having to match a call to one of the xmalloc() flavors with
|
||
|
a subsequent memset(), introduce a zeroing variant of each of those
|
||
|
flavors.
|
||
|
|
||
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
||
|
Acked-by: Keir Fraser <keir@xen.org>
|
||
|
|
||
|
--- a/xen/common/xmalloc_tlsf.c
|
||
|
+++ b/xen/common/xmalloc_tlsf.c
|
||
|
@@ -585,6 +585,13 @@ void *_xmalloc(unsigned long size, unsig
|
||
|
return p;
|
||
|
}
|
||
|
|
||
|
+void *_xzalloc(unsigned long size, unsigned long align)
|
||
|
+{
|
||
|
+ void *p = _xmalloc(size, align);
|
||
|
+
|
||
|
+ return p ? memset(p, 0, size) : p;
|
||
|
+}
|
||
|
+
|
||
|
void xfree(void *p)
|
||
|
{
|
||
|
struct bhdr *b;
|
||
|
--- a/xen/include/acpi/platform/aclinux.h
|
||
|
+++ b/xen/include/acpi/platform/aclinux.h
|
||
|
@@ -77,10 +77,7 @@
|
||
|
#define acpi_thread_id struct vcpu *
|
||
|
|
||
|
#define ACPI_ALLOCATE(a) xmalloc_bytes(a)
|
||
|
-#define ACPI_ALLOCATE_ZEROED(a) ({ \
|
||
|
- void *p = xmalloc_bytes(a); \
|
||
|
- if ( p ) memset(p, 0, a); \
|
||
|
- p; })
|
||
|
+#define ACPI_ALLOCATE_ZEROED(a) xzalloc_bytes(a)
|
||
|
#define ACPI_FREE(a) xfree(a)
|
||
|
|
||
|
#endif /* __ACLINUX_H__ */
|
||
|
--- a/xen/include/xen/xmalloc.h
|
||
|
+++ b/xen/include/xen/xmalloc.h
|
||
|
@@ -8,19 +8,25 @@
|
||
|
|
||
|
/* Allocate space for typed object. */
|
||
|
#define xmalloc(_type) ((_type *)_xmalloc(sizeof(_type), __alignof__(_type)))
|
||
|
+#define xzalloc(_type) ((_type *)_xzalloc(sizeof(_type), __alignof__(_type)))
|
||
|
|
||
|
/* Allocate space for array of typed objects. */
|
||
|
#define xmalloc_array(_type, _num) \
|
||
|
((_type *)_xmalloc_array(sizeof(_type), __alignof__(_type), _num))
|
||
|
+#define xzalloc_array(_type, _num) \
|
||
|
+ ((_type *)_xzalloc_array(sizeof(_type), __alignof__(_type), _num))
|
||
|
|
||
|
/* Allocate untyped storage. */
|
||
|
-#define xmalloc_bytes(_bytes) (_xmalloc(_bytes, SMP_CACHE_BYTES))
|
||
|
+#define xmalloc_bytes(_bytes) _xmalloc(_bytes, SMP_CACHE_BYTES)
|
||
|
+#define xzalloc_bytes(_bytes) _xzalloc(_bytes, SMP_CACHE_BYTES)
|
||
|
|
||
|
/* Free any of the above. */
|
||
|
extern void xfree(void *);
|
||
|
|
||
|
/* Underlying functions */
|
||
|
extern void *_xmalloc(unsigned long size, unsigned long align);
|
||
|
+extern void *_xzalloc(unsigned long size, unsigned long align);
|
||
|
+
|
||
|
static inline void *_xmalloc_array(
|
||
|
unsigned long size, unsigned long align, unsigned long num)
|
||
|
{
|
||
|
@@ -30,6 +36,15 @@ static inline void *_xmalloc_array(
|
||
|
return _xmalloc(size * num, align);
|
||
|
}
|
||
|
|
||
|
+static inline void *_xzalloc_array(
|
||
|
+ unsigned long size, unsigned long align, unsigned long num)
|
||
|
+{
|
||
|
+ /* Check for overflow. */
|
||
|
+ if (size && num > UINT_MAX / size)
|
||
|
+ return NULL;
|
||
|
+ return _xzalloc(size * num, align);
|
||
|
+}
|
||
|
+
|
||
|
/*
|
||
|
* Pooled allocator interface.
|
||
|
*/
|