02 May, 2007

1 commit

  • Currently, all 32-bit powerpc platforms use asm-ppc/pgtable.h and
    asm-ppc/pgalloc.h, even when otherwise compiled with ARCH=powerpc.
    Those asm-ppc files are a fairly nasty tangle of #ifdefs including a
    bunch of things which shouldn't be necessary any more in arch/powerpc.

    Cleaning up that mess is going to take a while, but this patch is a
    first step. It separates the asm-powerpc/pg{alloc,table}.h into 64
    bit and 32 bit versions in asm-powerpc, which the basic .h files in
    asm-powerpc select based on config. We make a few tiny tweaks to the
    innards of the files along the way, making the outermost ifdefs
    (double-inclusion protection and __KERNEL__) a little cleaner, and
    #including asm-generic/pgtable.h from the top-level
    asm-powerpc/pgtable.h (since both the old 32-bit and 64-bit versions
    ended with such an #include).

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

24 Apr, 2007

1 commit

  • BenH's commit a741e67969577163a4cfc78d7fd2753219087ef1 in powerpc.git,
    although (AFAICT) only intended to affect ppc64, also has side-effects
    which break 44x. I think 40x, 8xx and Freescale Book E are also
    affected, though I haven't tested them.

    The problem lies in unconditionally removing flush_tlb_pending() from
    the versions of flush_tlb_mm(), flush_tlb_range() and
    flush_tlb_kernel_range() used on ppc64 - which are also used the
    embedded platforms mentioned above.

    The patch below cleans up the convoluted #ifdef logic in tlbflush.h,
    in the process restoring the necessary flushes for the software TLB
    platforms. There are three sets of definitions for the flushing
    hooks: the software TLB versions (revised to avoid using names which
    appear to related to TLB batching), the 32-bit hash based versions
    (external functions) amd the 64-bit hash based versions (which
    implement batching).

    It also moves the declaration of update_mmu_cache() to always be in
    tlbflush.h (previously it was in tlbflush.h except for PPC64, where it
    was in pgtable.h).

    Booted on Ebony (440GP) and compiled for 64-bit and 32-bit
    multiplatform.

    Signed-off-by: David Gibson
    Acked-by: Benjamin Herrenschmidt
    Signed-off-by: Paul Mackerras

    David Gibson
     

13 Apr, 2007

1 commit

  • The current tlb flush code on powerpc 64 bits has a subtle race since we
    lost the page table lock due to the possible faulting in of new PTEs
    after a previous one has been removed but before the corresponding hash
    entry has been evicted, which can leads to all sort of fatal problems.

    This patch reworks the batch code completely. It doesn't use the mmu_gather
    stuff anymore. Instead, we use the lazy mmu hooks that were added by the
    paravirt code. They have the nice property that the enter/leave lazy mmu
    mode pair is always fully contained by the PTE lock for a given range
    of PTEs. Thus we can guarantee that all batches are flushed on a given
    CPU before it drops that lock.

    We also generalize batching for any PTE update that require a flush.

    Batching is now enabled on a CPU by arch_enter_lazy_mmu_mode() and
    disabled by arch_leave_lazy_mmu_mode(). The code epects that this is
    always contained within a PTE lock section so no preemption can happen
    and no PTE insertion in that range from another CPU. When batching
    is enabled on a CPU, every PTE updates that need a hash flush will
    use the batch for that flush.

    Signed-off-by: Benjamin Herrenschmidt
    Signed-off-by: Paul Mackerras

    Benjamin Herrenschmidt
     

26 Sep, 2006

1 commit

  • One of the changes necessary for shared page tables is to standardize the
    pxx_page macros. pte_page and pmd_page have always returned the struct
    page associated with their entry, while pte_page_kernel and pmd_page_kernel
    have returned the kernel virtual address. pud_page and pgd_page, on the
    other hand, return the kernel virtual address.

    Shared page tables needs pud_page and pgd_page to return the actual page
    structures. There are very few actual users of these functions, so it is
    simple to standardize their usage.

    Since this is basic cleanup, I am submitting these changes as a standalone
    patch. Per Hugh Dickins' comments about it, I am also changing the
    pxx_page_kernel macros to pxx_page_vaddr to clarify their meaning.

    Signed-off-by: Dave McCracken
    Cc: Hugh Dickins
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dave McCracken
     

23 Jun, 2006

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (139 commits)
    [POWERPC] re-enable OProfile for iSeries, using timer interrupt
    [POWERPC] support ibm,extended-*-frequency properties
    [POWERPC] Extra sanity check in EEH code
    [POWERPC] Dont look for class-code in pci children
    [POWERPC] Fix mdelay badness on shared processor partitions
    [POWERPC] disable floating point exceptions for init
    [POWERPC] Unify ppc syscall tables
    [POWERPC] mpic: add support for serial mode interrupts
    [POWERPC] pseries: Print PCI slot location code on failure
    [POWERPC] spufs: one more fix for 64k pages
    [POWERPC] spufs: fail spu_create with invalid flags
    [POWERPC] spufs: clear class2 interrupt status before wakeup
    [POWERPC] spufs: fix Makefile for "make clean"
    [POWERPC] spufs: remove stop_code from struct spu
    [POWERPC] spufs: fix spu irq affinity setting
    [POWERPC] spufs: further abstract priv1 register access
    [POWERPC] spufs: split the Cell BE support into generic and platform dependant parts
    [POWERPC] spufs: dont try to access SPE channel 1 count
    [POWERPC] spufs: use kzalloc in create_spu
    [POWERPC] spufs: fix initial state of wbox file
    ...

    Manually resolved conflicts in:
    drivers/net/phy/Makefile
    include/asm-powerpc/spu.h

    Linus Torvalds
     

15 Jun, 2006

1 commit

  • Some POWER5+ machines can do 64k hardware pages for normal memory but
    not for cache-inhibited pages. This patch lets us use 64k hardware
    pages for most user processes on such machines (assuming the kernel
    has been configured with CONFIG_PPC_64K_PAGES=y). User processes
    start out using 64k pages and get switched to 4k pages if they use any
    non-cacheable mappings.

    With this, we use 64k pages for the vmalloc region and 4k pages for
    the imalloc region. If anything creates a non-cacheable mapping in
    the vmalloc region, the vmalloc region will get switched to 4k pages.
    I don't know of any driver other than the DRM that would do this,
    though, and these machines don't have AGP.

    When a region gets switched from 64k pages to 4k pages, we do not have
    to clear out all the 64k HPTEs from the hash table immediately. We
    use the _PAGE_COMBO bit in the Linux PTE to indicate whether the page
    was hashed in as a 64k page or a set of 4k pages. If hash_page is
    trying to insert a 4k page for a Linux PTE and it sees that it has
    already been inserted as a 64k page, it first invalidates the 64k HPTE
    before inserting the 4k HPTE. The hash invalidation routines also use
    the _PAGE_COMBO bit, to determine whether to look for a 64k HPTE or a
    set of 4k HPTEs to remove. With those two changes, we can tolerate a
    mix of 4k and 64k HPTEs in the hash table, and they will all get
    removed when the address space is torn down.

    Signed-off-by: Paul Mackerras

    Paul Mackerras
     

26 Apr, 2006

1 commit


23 Mar, 2006

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (78 commits)
    [PATCH] powerpc: Add FSL SEC node to documentation
    [PATCH] macintosh: tidy-up driver_register() return values
    [PATCH] powerpc: tidy-up of_register_driver()/driver_register() return values
    [PATCH] powerpc: via-pmu warning fix
    [PATCH] macintosh: cleanup the use of i2c headers
    [PATCH] powerpc: dont allow old RTC to be selected
    [PATCH] powerpc: make powerbook_sleep_grackle static
    [PATCH] powerpc: Fix warning in add_memory
    [PATCH] powerpc: update mailing list addresses
    [PATCH] powerpc: Remove calculation of io hole
    [PATCH] powerpc: iseries: Add bootargs to /chosen
    [PATCH] powerpc: iseries: Add /system-id, /model and /compatible
    [PATCH] powerpc: Add strne2a() to convert a string from EBCDIC to ASCII
    [PATCH] powerpc: iseries: Make more stuff static in platforms/iseries/mf.c
    [PATCH] powerpc: iseries: Remove pointless iSeries_(restart|power_off|halt)
    [PATCH] powerpc: iseries: mf related cleanups
    [PATCH] powerpc: Replace platform_is_lpar() with a firmware feature
    [PATCH] powerpc: trivial: Cleanup whitespace in cputable.h
    [PATCH] powerpc: Remove unused iommu_off logic from pSeries_init_early()
    [PATCH] powerpc: Unconfuse htab_bolt_mapping() callers
    ...

    Linus Torvalds
     

22 Mar, 2006

1 commit

  • free_pgtables() has special logic to call hugetlb_free_pgd_range() instead
    of the normal free_pgd_range() on hugepage VMAs. However, the test it uses
    to do so is incorrect: it calls is_hugepage_only_range on a hugepage sized
    range at the start of the vma. is_hugepage_only_range() will return true
    if the given range has any intersection with a hugepage address region, and
    in this case the given region need not be hugepage aligned. So, for
    example, this test can return true if called on, say, a 4k VMA immediately
    preceding a (nicely aligned) hugepage VMA.

    At present we get away with this because the powerpc version of
    hugetlb_free_pgd_range() is just a call to free_pgd_range(). On ia64 (the
    only other arch with a non-trivial is_hugepage_only_range()) we get away
    with it for a different reason; the hugepage area is not contiguous with
    the rest of the user address space, and VMAs are not permitted in between,
    so the test can't return a false positive there.

    Nonetheless this should be fixed. We do that in the patch below by
    replacing the is_hugepage_only_range() test with an explicit test of the
    VMA using is_vm_hugetlb_page().

    This in turn changes behaviour for platforms where is_hugepage_only_range()
    returns false always (everything except powerpc and ia64). We address this
    by ensuring that hugetlb_free_pgd_range() is defined to be identical to
    free_pgd_range() (instead of a no-op) on everything except ia64. Even so,
    it will prevent some otherwise possible coalescing of calls down to
    free_pgd_range(). Since this only happens for hugepage VMAs, removing this
    small optimization seems unlikely to cause any trouble.

    This patch causes no regressions on the libhugetlbfs testsuite - ppc64
    POWER5 (8-way), ppc64 G5 (2-way) and i386 Pentium M (UP).

    Signed-off-by: David Gibson
    Cc: William Lee Irwin III
    Acked-by: Hugh Dickins
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    David Gibson
     

17 Mar, 2006

1 commit

  • At present, the powerpc pmd_bad() and pud_bad() macros return false
    unless the given pmd or pud is zero. This patch makes these tests
    more thorough, checking if the given pmd or pud looks like a plausible
    pte page or pmd page pointer respectively. This can result in helpful
    error messages when messing with the pagetable code.

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

09 Jan, 2006

2 commits

  • include/asm-ppc/ had #ifdef __KERNEL__ in all header files that
    are not meant for use by user space, include/asm-powerpc does
    not have this yet.

    This patch gets us a lot closer there. There are a few cases
    where I was not sure, so I left them out. I have verified
    that no CONFIG_* symbols are used outside of __KERNEL__
    any more and that there are no obvious compile errors when
    including any of the headers in user space libraries.

    Signed-off-by: Arnd Bergmann
    Signed-off-by: Paul Mackerras

    Arnd Bergmann
     
  • On ppc64, we independently define VMALLOCBASE and VMALLOC_START to be
    the same thing: the start of the vmalloc() area at 0xd000000000000000.
    VMALLOC_START is used much more widely, including in generic code, so
    this patch gets rid of the extraneous VMALLOCBASE.

    This does require moving the definitions of region IDs from page_64.h
    to pgtable.h, but they don't clearly belong in the former rather than
    the latter, anyway. While we're moving them, clean up the definitions
    of the REGION_IDs:
    - Abolish REGION_SIZE, it was only used once, to define
    REGION_MASK anyway
    - Define the specific region ids in terms of the REGION_ID()
    macro.
    - Define KERNEL_REGION_ID in terms of PAGE_OFFSET rather than
    KERNELBASE. It amounts to the same thing, but conceptually this is
    about the region of the linear mapping (which starts at PAGE_OFFSET)
    rather than of the kernel text itself (which is at KERNELBASE).

    Signed-off-by: David Gibson
    Signed-off-by: Paul Mackerras

    David Gibson
     

19 Nov, 2005

1 commit