Thread (5 messages) 5 messages, 2 authors, 2014-11-19

Re: [PATCH] powerpc: Remove more traces of bootmem

From: Michael Ellerman <mpe@ellerman.id.au>
Date: 2014-11-19 05:29:18

On Tue, 2014-11-18 at 10:26 +0000, David Laight wrote:
From: Michael Ellerman
quoted
Although we are now selecting NO_BOOTMEM, we still have some traces of
bootmem lying around. That is because even with NO_BOOTMEM there is
still a shim that converts bootmem calls into memblock calls, but
ultimately we want to remove all traces of bootmem.

Most of the patch is conversions from alloc_bootmem() to
memblock_alloc(). In general a call such as:

  p = (struct foo *)alloc_bootmem(x);

Becomes:

  p = __va(memblock_alloc(x, 0));

We need __va() because memblock returns a physical address. We don't
need the cast because __va() returns a void *. The alignment value of
zero tells memblock to use the default alignment, which is
SMP_CACHE_BYTES, the same value alloc_bootmem() uses.
It doesn't seem right to me to replicate __va(memblock_alloc(x, 0))
that many times. I can imagine that the required code will change
again at to future time, and then all the same places would need changing.
Yeah it's a bit ugly. Actually most of that code has never changed, which is
the problem, no one has bothered to update it.
Wouldn't it be better to use:
#define alloc_bootmem(x) __va(memblock_alloc(x, 0))
possibly with a rename, or as a static inline.
Well that's essentially what the existing shim does. So we can't use that name.

My plan is to add a memblock_alloc_virt() which does the __va() for you. But I
didn't want the powerpc changes to get backed up behind that.
If __va() is non-trivial you want a real function.
It can't be a function because we use it on void * as well as unsigned long,
phys_addr_t etc.

phys_to_virt() is the nicer version, though it only takes unsigned long.

cheers
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help