lkml.org 
[lkml]   [2008]   [Oct]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: GIT head no longer boots on x86-64


    On Wed, 15 Oct 2008, Linus Torvalds wrote:
    >
    > The code in question already does
    >
    > VIRTUAL_BUG_ON(!is_vmalloc_addr(vmalloc_addr) &&
    > !is_module_address(addr));
    >
    > and look at that thing and ask yourself: where was the bug again.

    Btw, I don't even know if this is a sparc64 issue too, but it sounds
    possible. Sparc64 seems similar to x86-64 in that there is a special range
    for module addresses.

    I'm too lazy to check everybody's "module_alloc()", and maybe others do
    too, but use a different symbol, so grepping for it doesn't trigger.

    But regardless, a much more correct fix appears to just screw this, and
    make it explicit on the symbol. And only do it if modules are even
    supported.

    And if you *really* want to change "is_vmalloc_addr()", then

    (a) do it right, not some crappy x86-64-specific sh*t
    (b) do it like I do it, and make it dependent on modules even being
    enabled
    (c) and rename it to match what it does.

    not the horrible patch I've seen.

    Oh, btw. This patch is *totally* untested. I don't even enable modules. So
    if it doesn't compile, it isn't perfect. But while it may not _work_, at
    least it's not _ugly_.

    (Quite frankly, I think an even more correct fix is to rename the whole
    "vmalloc_to_page()" function, since it's clearly used for other things
    than vmalloc. Maybe "kernel_virtual_to_page()". Whatever. This is trying
    to be minimal without being totally disgusting).

    Linus

    ---
    mm/vmalloc.c | 18 ++++++++++++++++--
    1 files changed, 16 insertions(+), 2 deletions(-)

    diff --git a/mm/vmalloc.c b/mm/vmalloc.c
    index bba06c4..f018d7e 100644
    --- a/mm/vmalloc.c
    +++ b/mm/vmalloc.c
    @@ -168,6 +168,21 @@ int map_vm_area(struct vm_struct *area, pgprot_t prot, struct page ***pages)
    }
    EXPORT_SYMBOL_GPL(map_vm_area);

    +static inline int is_vmalloc_or_module_addr(const void *x)
    +{
    + /*
    + * x86-64 and sparc64 put modules in a special place,
    + * and fall back on vmalloc() if that fails. Others
    + * just put it in the vmalloc space.
    + */
    +#if defined(CONFIG_MODULES) && defined(MODULES_VADDR)
    + unsigned long addr = (unsigned long)x;
    + if (addr >= MODULES_VADDR && addr < MODULES_END)
    + return 1;
    +#endif
    + return is_vmalloc_addr(x);
    +}
    +
    /*
    * Map a vmalloc()-space virtual address to the physical page.
    */
    @@ -184,8 +199,7 @@ struct page *vmalloc_to_page(const void *vmalloc_addr)
    * XXX we might need to change this if we add VIRTUAL_BUG_ON for
    * architectures that do not vmalloc module space
    */
    - VIRTUAL_BUG_ON(!is_vmalloc_addr(vmalloc_addr) &&
    - !is_module_address(addr));
    + VIRTUAL_BUG_ON(!is_vmalloc_or_module_addr(vmalloc_addr));

    if (!pgd_none(*pgd)) {
    pud = pud_offset(pgd, addr);

    \
     
     \ /
      Last update: 2008-10-15 17:39    [W:2.370 / U:0.144 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site