Fixes krealloc()
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 30 Jan 2014 23:57:46 +0000 (15:57 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 31 Jan 2014 00:05:00 +0000 (16:05 -0800)
commit6a0d3c17d9f5115f6ea624ad43c345b021726a69
treec99b94a6374148f18e1194a347ac3ac462f5c5f9
parent32ed1de33428a7acf4e334345c9097fcbfe03072
Fixes krealloc()

Two things:

1) It was assuming the memory of buf was from a slab.  For large
regions, it's from contiguous memory.

2) It was assuming that the size of the memory from whatever source
(slab or pages) was for the entire buffer.  We need room for the kmalloc
tag.

Something like this happened: a krealloc to 8192 thought that it had
8192 already, even though it was just shy of 8192.  The memmove
(probably) clobbered the slab allocator bufctl of the object, which is
stored right after the slab object.  Random bytes then were interpreted
as a pointer, which caused a GPF (the address was non-canonical).

Man, krealloc for large regions has to be terribly slow.  The only thing
worse than our contiguous page allocator is calling the contiguous page
allocator repeatedly.
kern/src/kmalloc.c