|
@@ -2902,18 +2902,14 @@ static void free_loc_track(struct loc_track *t)
|
|
|
get_order(sizeof(struct location) * t->max));
|
|
|
}
|
|
|
|
|
|
-static int alloc_loc_track(struct loc_track *t, unsigned long max)
|
|
|
+static int alloc_loc_track(struct loc_track *t, unsigned long max, gfp_t flags)
|
|
|
{
|
|
|
struct location *l;
|
|
|
int order;
|
|
|
|
|
|
- if (!max)
|
|
|
- max = PAGE_SIZE / sizeof(struct location);
|
|
|
-
|
|
|
order = get_order(sizeof(struct location) * max);
|
|
|
|
|
|
- l = (void *)__get_free_pages(GFP_ATOMIC, order);
|
|
|
-
|
|
|
+ l = (void *)__get_free_pages(flags, order);
|
|
|
if (!l)
|
|
|
return 0;
|
|
|
|
|
@@ -2979,7 +2975,7 @@ static int add_location(struct loc_track *t, struct kmem_cache *s,
|
|
|
/*
|
|
|
* Not found. Insert new tracking element.
|
|
|
*/
|
|
|
- if (t->count >= t->max && !alloc_loc_track(t, 2 * t->max))
|
|
|
+ if (t->count >= t->max && !alloc_loc_track(t, 2 * t->max, GFP_ATOMIC))
|
|
|
return 0;
|
|
|
|
|
|
l = t->loc + pos;
|
|
@@ -3022,11 +3018,12 @@ static int list_locations(struct kmem_cache *s, char *buf,
|
|
|
{
|
|
|
int n = 0;
|
|
|
unsigned long i;
|
|
|
- struct loc_track t;
|
|
|
+ struct loc_track t = { 0, 0, NULL };
|
|
|
int node;
|
|
|
|
|
|
- t.count = 0;
|
|
|
- t.max = 0;
|
|
|
+ if (!alloc_loc_track(&t, PAGE_SIZE / sizeof(struct location),
|
|
|
+ GFP_KERNEL))
|
|
|
+ return sprintf(buf, "Out of memory\n");
|
|
|
|
|
|
/* Push back cpu slabs */
|
|
|
flush_all(s);
|