cleanups: - removes flex_array_shrink() as there is no caller. - add flex_array_init() - Add few 'const's.
Signed-off-by: Pravin B Shelar <pshe...@nicira.com> --- datapath/linux/compat/flex_array.c | 114 ++++++++-------------- datapath/linux/compat/include/linux/flex_array.h | 20 ++-- 2 files changed, 52 insertions(+), 82 deletions(-) diff --git a/datapath/linux/compat/flex_array.c b/datapath/linux/compat/flex_array.c index 1e6d9c1..f2d0cd2 100644 --- a/datapath/linux/compat/flex_array.c +++ b/datapath/linux/compat/flex_array.c @@ -1,7 +1,5 @@ #include <linux/version.h> -#if LINUX_VERSION_CODE < KERNEL_VERSION(3,0,0) - /* * Flexible array managed in PAGE_SIZE parts * @@ -40,7 +38,7 @@ struct flex_array_part { * flex_array->parts[] array to store the user * data. */ -static inline int elements_fit_in_base(struct flex_array *fa) +static inline int elements_fit_in_base(const struct flex_array *fa) { int data_size = fa->element_size * fa->total_nr_elements; if (data_size <= FLEX_ARRAY_BASE_BYTES_LEFT) @@ -49,7 +47,8 @@ static inline int elements_fit_in_base(struct flex_array *fa) } /** - * flex_array_alloc - allocate a new flexible array + * flex_array_init - initialize a new flexible array + * @array: flex array to initiaize * @element_size: the size of individual elements in the array * @total: total number of elements that this should hold * @flags: page allocation flags to use for base array @@ -89,10 +88,9 @@ static inline int elements_fit_in_base(struct flex_array *fa) * capacity in the base structure. Also note that no effort is made * to efficiently pack objects across page boundaries. */ -struct flex_array *flex_array_alloc(int element_size, unsigned int total, - gfp_t flags) +int flex_array_init(struct flex_array *array, int element_size, + unsigned int total, gfp_t flags) { - struct flex_array *ret; int elems_per_part = 0; int reciprocal_elems = 0; int max_size = 0; @@ -105,22 +103,38 @@ struct flex_array *flex_array_alloc(int element_size, unsigned int total, /* max_size will end up 0 if element_size > PAGE_SIZE */ if (total > max_size) - return NULL; + return -EINVAL; + + array->element_size = element_size; + array->total_nr_elements = total; + array->elems_per_part = elems_per_part; + array->reciprocal_elems = reciprocal_elems; + if (elements_fit_in_base(array) && !(flags & __GFP_ZERO)) + memset(&array->parts[0], 0, FLEX_ARRAY_BASE_BYTES_LEFT); + + return 0; +} + +struct flex_array *flex_array_alloc(int element_size, unsigned int total, + gfp_t flags) +{ + struct flex_array *ret; + int err; + ret = kzalloc(sizeof(struct flex_array), flags); if (!ret) return NULL; - ret->element_size = element_size; - ret->total_nr_elements = total; - ret->elems_per_part = elems_per_part; - ret->reciprocal_elems = reciprocal_elems; - if (elements_fit_in_base(ret) && !(flags & __GFP_ZERO)) - memset(&ret->parts[0], FLEX_ARRAY_FREE, - FLEX_ARRAY_BASE_BYTES_LEFT); + + err = flex_array_init(ret, element_size, total, flags); + if (err) { + kfree(ret); + ret = NULL; + } return ret; } -static int fa_element_to_part_nr(struct flex_array *fa, - unsigned int element_nr) +static int fa_element_to_part_nr(const struct flex_array *fa, + unsigned int element_nr) { return reciprocal_divide(element_nr, fa->reciprocal_elems); } @@ -132,7 +146,7 @@ static int fa_element_to_part_nr(struct flex_array *fa, * This is to be used in cases where the base 'struct flex_array' * has been statically allocated and should not be free. */ -void flex_array_free_parts(struct flex_array *fa) +void flex_array_free_parts(const struct flex_array *fa) { int part_nr; @@ -142,15 +156,15 @@ void flex_array_free_parts(struct flex_array *fa) kfree(fa->parts[part_nr]); } -void flex_array_free(struct flex_array *fa) +void flex_array_free(const struct flex_array *fa) { flex_array_free_parts(fa); kfree(fa); } -static unsigned int index_inside_part(struct flex_array *fa, - unsigned int element_nr, - unsigned int part_nr) +static unsigned int index_inside_part(const struct flex_array *fa, + unsigned int element_nr, + unsigned int part_nr) { unsigned int part_offset; @@ -167,8 +181,8 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags) if (!part) return NULL; if (!(flags & __GFP_ZERO)) - memset(part, FLEX_ARRAY_FREE, - sizeof(struct flex_array_part)); + memset(part, 0, sizeof(struct flex_array_part)); + fa->parts[part_nr] = part; } return part; @@ -192,7 +206,7 @@ __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags) * Locking must be provided by the caller. */ int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, - gfp_t flags) + gfp_t flags) { int part_nr = 0; struct flex_array_part *part; @@ -241,7 +255,7 @@ int flex_array_clear(struct flex_array *fa, unsigned int element_nr) return -EINVAL; } dst = &part->elements[index_inside_part(fa, element_nr, part_nr)]; - memset(dst, FLEX_ARRAY_FREE, fa->element_size); + memset(dst, 0, fa->element_size); return 0; } @@ -306,7 +320,7 @@ int flex_array_prealloc(struct flex_array *fa, unsigned int start, * * Locking must be provided by the caller. */ -void *flex_array_get(struct flex_array *fa, unsigned int element_nr) +void *flex_array_get(const struct flex_array *fa, unsigned int element_nr) { int part_nr = 0; struct flex_array_part *part; @@ -335,7 +349,7 @@ void *flex_array_get(struct flex_array *fa, unsigned int element_nr) * flex_array_put_ptr(). This function should not be called if the * element in question was not set using the _put_ptr() helper. */ -void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr) +void *flex_array_get_ptr(const struct flex_array *fa, unsigned int element_nr) { void **tmp; @@ -345,47 +359,3 @@ void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr) return *tmp; } - -static int part_is_free(struct flex_array_part *part) -{ - int i; - - for (i = 0; i < sizeof(struct flex_array_part); i++) - if (part->elements[i] != FLEX_ARRAY_FREE) - return 0; - return 1; -} - -/** - * flex_array_shrink - free unused second-level pages - * @fa: the flex array to shrink - * - * Frees all second-level pages that consist solely of unused - * elements. Returns the number of pages freed. - * - * Locking must be provided by the caller. - */ -int flex_array_shrink(struct flex_array *fa) -{ - struct flex_array_part *part; - int part_nr; - int ret = 0; - - if (!fa->total_nr_elements || !fa->element_size) - return 0; - if (elements_fit_in_base(fa)) - return ret; - for (part_nr = 0; part_nr < FLEX_ARRAY_NR_BASE_PTRS; part_nr++) { - part = fa->parts[part_nr]; - if (!part) - continue; - if (part_is_free(part)) { - fa->parts[part_nr] = NULL; - kfree(part); - ret++; - } - } - return ret; -} - -#endif /* Linux version < 3.0.0 */ diff --git a/datapath/linux/compat/include/linux/flex_array.h b/datapath/linux/compat/include/linux/flex_array.h index 1cc6648..6fdaef7 100644 --- a/datapath/linux/compat/include/linux/flex_array.h +++ b/datapath/linux/compat/include/linux/flex_array.h @@ -2,10 +2,6 @@ #define __LINUX_FLEX_ARRAY_WRAPPER_H #include <linux/version.h> -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) -#include_next <linux/flex_array.h> -#else - #include <linux/types.h> #include <asm/page.h> @@ -67,20 +63,24 @@ struct flex_array { struct flex_array *flex_array_alloc(int element_size, unsigned int total, gfp_t flags); +int flex_array_init(struct flex_array *array, int element_size, + unsigned int total, gfp_t flags); int flex_array_prealloc(struct flex_array *fa, unsigned int start, unsigned int nr_elements, gfp_t flags); -void flex_array_free(struct flex_array *fa); -void flex_array_free_parts(struct flex_array *fa); +#define flex_array_free rpl_flex_array_free +void flex_array_free(const struct flex_array *fa); +#define flex_array_free_parts rpl_flex_array_free_parts +void flex_array_free_parts(const struct flex_array *fa); int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, gfp_t flags); int flex_array_clear(struct flex_array *fa, unsigned int element_nr); -void *flex_array_get(struct flex_array *fa, unsigned int element_nr); -int flex_array_shrink(struct flex_array *fa); +#define flex_array_get rpl_flex_array_get +void *flex_array_get(const struct flex_array *fa, unsigned int element_nr); #define flex_array_put_ptr(fa, nr, src, gfp) \ flex_array_put(fa, nr, (void *)&(src), gfp) -void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr); +#define flex_array_get_ptr rpl_flex_array_get_ptr +void *flex_array_get_ptr(const struct flex_array *fa, unsigned int element_nr); -#endif /* Linux version < 3.0.0 */ #endif /* __LINUX_FLEX_ARRAY_WRAPPER_H */ -- 1.7.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev