Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 166515
b: refs/heads/master
c: f2badb0
h: refs/heads/master
i:
  166513: 1f62f42
  166511: c98c0e8
v: v3
  • Loading branch information
Tejun Heo committed Sep 29, 2009
1 parent 9f0a00a commit 188e334
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 635b75fc18858d3522e481c043de764766db923c
refs/heads/master: f2badb0c950ed308be9b321203b9c8d341690cd4
20 changes: 18 additions & 2 deletions trunk/mm/percpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1043,7 +1043,9 @@ static struct pcpu_chunk *alloc_pcpu_chunk(void)
*/
static void *pcpu_alloc(size_t size, size_t align, bool reserved)
{
static int warn_limit = 10;
struct pcpu_chunk *chunk;
const char *err;
int slot, off;

if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE)) {
Expand All @@ -1059,11 +1061,14 @@ static void *pcpu_alloc(size_t size, size_t align, bool reserved)
if (reserved && pcpu_reserved_chunk) {
chunk = pcpu_reserved_chunk;
if (size > chunk->contig_hint ||
pcpu_extend_area_map(chunk) < 0)
pcpu_extend_area_map(chunk) < 0) {
err = "failed to extend area map of reserved chunk";
goto fail_unlock;
}
off = pcpu_alloc_area(chunk, size, align);
if (off >= 0)
goto area_found;
err = "alloc from reserved chunk failed";
goto fail_unlock;
}

Expand All @@ -1080,6 +1085,7 @@ static void *pcpu_alloc(size_t size, size_t align, bool reserved)
case 1:
goto restart; /* pcpu_lock dropped, restart */
default:
err = "failed to extend area map";
goto fail_unlock;
}

Expand All @@ -1093,8 +1099,10 @@ static void *pcpu_alloc(size_t size, size_t align, bool reserved)
spin_unlock_irq(&pcpu_lock);

chunk = alloc_pcpu_chunk();
if (!chunk)
if (!chunk) {
err = "failed to allocate new chunk";
goto fail_unlock_mutex;
}

spin_lock_irq(&pcpu_lock);
pcpu_chunk_relocate(chunk, -1);
Expand All @@ -1107,6 +1115,7 @@ static void *pcpu_alloc(size_t size, size_t align, bool reserved)
if (pcpu_populate_chunk(chunk, off, size)) {
spin_lock_irq(&pcpu_lock);
pcpu_free_area(chunk, off);
err = "failed to populate";
goto fail_unlock;
}

Expand All @@ -1119,6 +1128,13 @@ static void *pcpu_alloc(size_t size, size_t align, bool reserved)
spin_unlock_irq(&pcpu_lock);
fail_unlock_mutex:
mutex_unlock(&pcpu_alloc_mutex);
if (warn_limit) {
pr_warning("PERCPU: allocation failed, size=%zu align=%zu, "
"%s\n", size, align, err);
dump_stack();
if (!--warn_limit)
pr_info("PERCPU: limit reached, disable warning\n");
}
return NULL;
}

Expand Down

0 comments on commit 188e334

Please sign in to comment.