Messages in this thread | | | Date | Fri, 29 Apr 2011 22:43:22 +0200 | Subject | Re: [git pull] m68k SLUB fix for 2.6.39 | From | Geert Uytterhoeven <> |
| |
On Thu, Apr 28, 2011 at 23:41, David Rientjes <rientjes@google.com> wrote: > On Thu, 28 Apr 2011, James Bottomley wrote: > >> > Since 4a5fa3590f09 ([PARISC] slub: fix panic with DISCONTIGMEM) from >> > 2.6.39-rc4, you can't actually select slub on m68k without CONFIG_ADVANCED >> > and CONFIG_SINGLE_MEMORY_CHUNK because it otherwises defaults to >> > discontigmem. >> > >> > James tested hppa64 with my N_NORMAL_MEMORY fix and found that it turned >> > an SMP box into UP. If you've tested slub on m68k without regressions, >> > then perhaps you'd like to add a "|| M68K" to CONFIG_SLUB? >> >> To be honest, I really don't see that fixing it. As soon as you >> allocate memory beyond range zero, you move onto a non-zero node as far >> as slub is concerned, and that will oops. >> > > Possible nodes are represented in slub with N_NORMAL_MEMORY, so the > kmem_cache_node structures are allocated and initialized based on this > nodemask. As long as the memory ranges map to nodes set in the nodemask, > this should be fine. > >> I think what the N_NORMAL_MEMORY patch did is just make it take a whiile >> before you start allocating from that range. Try executing a memory >> balloon on the platform; that was how we first demonstrated the problem >> on parisc. >> > > With parisc, you encountered an oops in add_partial() because the > kmem_cache_node structure for the memory range returned by page_to_nid() > was not allocated. init_kmem_cache_nodes() takes care of this for all > memory ranges set in N_NORMAL_MEMORY. > > Adding Christoph and Pekka to the cc if there is additional concerns about > slub on this architecture.
My ARAnyM instance has
System Memory: 276480K 14 MB at 0x00000000 (ST-RAM) 256 MB at 0x01000000 (alternate RAM)
and 137800KIB of swap, and survived the following program just fine:
#include <stdio.h> #include <stdlib.h> #include <string.h>
int main(int argc, char *argv[]) { size_t size = 1048576; size_t total = 0; void *p;
while (size) { p = malloc(size); if (!p) { printf("Failed to allocate %zu bytes\n", size); size /= 2; } memset(p, 0xaa, size); total += size; printf("Using %zu / 0x%zx bytes of memory\n", total, total); }
printf("Finished!\n"); return 0; }
i.e. the OOM-killer just killed the program after it consumed all available virtual memory:
Out of memory: Kill process 1727 (malloctest) score 854 or sacrifice child Killed process 1727 (malloctest) total-vm:361160kB, anon-rss:224164kB, file-rss:0kB malloctest: page allocation failure. order:0, mode:0x84d0
So SLUB really seems to work now.
Gr{oetje,eeting}s,
Geert
-- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |