Lines Matching refs:fa
39 static inline int elements_fit_in_base(struct flex_array *fa) in elements_fit_in_base() argument
41 int data_size = fa->element_size * fa->total_nr_elements; in elements_fit_in_base()
119 static int fa_element_to_part_nr(struct flex_array *fa, in fa_element_to_part_nr() argument
127 return reciprocal_divide(element_nr, fa->reciprocal_elems); in fa_element_to_part_nr()
137 void flex_array_free_parts(struct flex_array *fa) in flex_array_free_parts() argument
141 if (elements_fit_in_base(fa)) in flex_array_free_parts()
144 kfree(fa->parts[part_nr]); in flex_array_free_parts()
148 void flex_array_free(struct flex_array *fa) in flex_array_free() argument
150 flex_array_free_parts(fa); in flex_array_free()
151 kfree(fa); in flex_array_free()
155 static unsigned int index_inside_part(struct flex_array *fa, in index_inside_part() argument
161 part_offset = element_nr - part_nr * fa->elems_per_part; in index_inside_part()
162 return part_offset * fa->element_size; in index_inside_part()
166 __fa_get_part(struct flex_array *fa, int part_nr, gfp_t flags) in __fa_get_part() argument
168 struct flex_array_part *part = fa->parts[part_nr]; in __fa_get_part()
176 fa->parts[part_nr] = part; in __fa_get_part()
198 int flex_array_put(struct flex_array *fa, unsigned int element_nr, void *src, in flex_array_put() argument
205 if (element_nr >= fa->total_nr_elements) in flex_array_put()
207 if (!fa->element_size) in flex_array_put()
209 if (elements_fit_in_base(fa)) in flex_array_put()
210 part = (struct flex_array_part *)&fa->parts[0]; in flex_array_put()
212 part_nr = fa_element_to_part_nr(fa, element_nr); in flex_array_put()
213 part = __fa_get_part(fa, part_nr, flags); in flex_array_put()
217 dst = &part->elements[index_inside_part(fa, element_nr, part_nr)]; in flex_array_put()
218 memcpy(dst, src, fa->element_size); in flex_array_put()
230 int flex_array_clear(struct flex_array *fa, unsigned int element_nr) in flex_array_clear() argument
236 if (element_nr >= fa->total_nr_elements) in flex_array_clear()
238 if (!fa->element_size) in flex_array_clear()
240 if (elements_fit_in_base(fa)) in flex_array_clear()
241 part = (struct flex_array_part *)&fa->parts[0]; in flex_array_clear()
243 part_nr = fa_element_to_part_nr(fa, element_nr); in flex_array_clear()
244 part = fa->parts[part_nr]; in flex_array_clear()
248 dst = &part->elements[index_inside_part(fa, element_nr, part_nr)]; in flex_array_clear()
249 memset(dst, FLEX_ARRAY_FREE, fa->element_size); in flex_array_clear()
268 int flex_array_prealloc(struct flex_array *fa, unsigned int start, in flex_array_prealloc() argument
279 if (start >= fa->total_nr_elements) in flex_array_prealloc()
286 if (end >= fa->total_nr_elements) in flex_array_prealloc()
288 if (!fa->element_size) in flex_array_prealloc()
290 if (elements_fit_in_base(fa)) in flex_array_prealloc()
292 start_part = fa_element_to_part_nr(fa, start); in flex_array_prealloc()
293 end_part = fa_element_to_part_nr(fa, end); in flex_array_prealloc()
295 part = __fa_get_part(fa, part_nr, flags); in flex_array_prealloc()
315 void *flex_array_get(struct flex_array *fa, unsigned int element_nr) in flex_array_get() argument
320 if (!fa->element_size) in flex_array_get()
322 if (element_nr >= fa->total_nr_elements) in flex_array_get()
324 if (elements_fit_in_base(fa)) in flex_array_get()
325 part = (struct flex_array_part *)&fa->parts[0]; in flex_array_get()
327 part_nr = fa_element_to_part_nr(fa, element_nr); in flex_array_get()
328 part = fa->parts[part_nr]; in flex_array_get()
332 return &part->elements[index_inside_part(fa, element_nr, part_nr)]; in flex_array_get()
345 void *flex_array_get_ptr(struct flex_array *fa, unsigned int element_nr) in flex_array_get_ptr() argument
349 tmp = flex_array_get(fa, element_nr); in flex_array_get_ptr()
376 int flex_array_shrink(struct flex_array *fa) in flex_array_shrink() argument
382 if (!fa->total_nr_elements || !fa->element_size) in flex_array_shrink()
384 if (elements_fit_in_base(fa)) in flex_array_shrink()
387 part = fa->parts[part_nr]; in flex_array_shrink()
391 fa->parts[part_nr] = NULL; in flex_array_shrink()