Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc

Pull sparc updates from David Miller:

1) Add a proper .exit.data section.

2) Fix ipc64_perm type definition, from Arnd Bergmann.

3) Support folded p4d page tables on sparc64, from Mike Rapport.

4) Remove uses of struct timex, also from Arnd Bergmann.

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc:
y2038: sparc: remove use of struct timex
sparc64: add support for folded p4d page tables
sparc/console: kill off obsolete declarations
sparc32: fix struct ipc64_perm type definition
sparc32, leon: Stop adding vendor and device id to prom ambapp path components
sparc: Add .exit.data section.
sparc: remove unneeded uapi/asm/statfs.h

+103 -68
+3 -3
arch/sparc/include/asm/pgalloc_64.h
··· 16 16 17 17 extern struct kmem_cache *pgtable_cache; 18 18 19 - static inline void __pgd_populate(pgd_t *pgd, pud_t *pud) 19 + static inline void __p4d_populate(p4d_t *p4d, pud_t *pud) 20 20 { 21 - pgd_set(pgd, pud); 21 + p4d_set(p4d, pud); 22 22 } 23 23 24 - #define pgd_populate(MM, PGD, PUD) __pgd_populate(PGD, PUD) 24 + #define p4d_populate(MM, P4D, PUD) __p4d_populate(P4D, PUD) 25 25 26 26 static inline pgd_t *pgd_alloc(struct mm_struct *mm) 27 27 {
+12 -12
arch/sparc/include/asm/pgtable_64.h
··· 13 13 * the SpitFire page tables. 14 14 */ 15 15 16 - #include <asm-generic/5level-fixup.h> 16 + #include <asm-generic/pgtable-nop4d.h> 17 17 #include <linux/compiler.h> 18 18 #include <linux/const.h> 19 19 #include <asm/types.h> ··· 810 810 811 811 #define pud_bad(pud) (pud_val(pud) & ~PAGE_MASK) 812 812 813 - #define pgd_none(pgd) (!pgd_val(pgd)) 813 + #define p4d_none(p4d) (!p4d_val(p4d)) 814 814 815 - #define pgd_bad(pgd) (pgd_val(pgd) & ~PAGE_MASK) 815 + #define p4d_bad(p4d) (p4d_val(p4d) & ~PAGE_MASK) 816 816 817 817 #ifdef CONFIG_TRANSPARENT_HUGEPAGE 818 818 void set_pmd_at(struct mm_struct *mm, unsigned long addr, ··· 859 859 #define pmd_clear(pmdp) (pmd_val(*(pmdp)) = 0UL) 860 860 #define pud_present(pud) (pud_val(pud) != 0U) 861 861 #define pud_clear(pudp) (pud_val(*(pudp)) = 0UL) 862 - #define pgd_page_vaddr(pgd) \ 863 - ((unsigned long) __va(pgd_val(pgd))) 864 - #define pgd_present(pgd) (pgd_val(pgd) != 0U) 865 - #define pgd_clear(pgdp) (pgd_val(*(pgdp)) = 0UL) 862 + #define p4d_page_vaddr(p4d) \ 863 + ((unsigned long) __va(p4d_val(p4d))) 864 + #define p4d_present(p4d) (p4d_val(p4d) != 0U) 865 + #define p4d_clear(p4dp) (p4d_val(*(p4dp)) = 0UL) 866 866 867 867 /* only used by the stubbed out hugetlb gup code, should never be called */ 868 - #define pgd_page(pgd) NULL 868 + #define p4d_page(p4d) NULL 869 869 870 870 static inline unsigned long pud_large(pud_t pud) 871 871 { ··· 884 884 /* Same in both SUN4V and SUN4U. */ 885 885 #define pte_none(pte) (!pte_val(pte)) 886 886 887 - #define pgd_set(pgdp, pudp) \ 888 - (pgd_val(*(pgdp)) = (__pa((unsigned long) (pudp)))) 887 + #define p4d_set(p4dp, pudp) \ 888 + (p4d_val(*(p4dp)) = (__pa((unsigned long) (pudp)))) 889 889 890 890 /* to find an entry in a page-table-directory. */ 891 891 #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) ··· 896 896 897 897 /* Find an entry in the third-level page table.. */ 898 898 #define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)) 899 - #define pud_offset(pgdp, address) \ 900 - ((pud_t *) pgd_page_vaddr(*(pgdp)) + pud_index(address)) 899 + #define pud_offset(p4dp, address) \ 900 + ((pud_t *) p4d_page_vaddr(*(p4dp)) + pud_index(address)) 901 901 902 902 /* Find an entry in the second-level page table.. */ 903 903 #define pmd_offset(pudp, address) \
+11 -11
arch/sparc/include/uapi/asm/ipcbuf.h
··· 17 17 18 18 struct ipc64_perm 19 19 { 20 - __kernel_key_t key; 21 - __kernel_uid_t uid; 22 - __kernel_gid_t gid; 23 - __kernel_uid_t cuid; 24 - __kernel_gid_t cgid; 20 + __kernel_key_t key; 21 + __kernel_uid32_t uid; 22 + __kernel_gid32_t gid; 23 + __kernel_uid32_t cuid; 24 + __kernel_gid32_t cgid; 25 25 #ifndef __arch64__ 26 - unsigned short __pad0; 26 + unsigned short __pad0; 27 27 #endif 28 - __kernel_mode_t mode; 29 - unsigned short __pad1; 30 - unsigned short seq; 31 - unsigned long long __unused1; 32 - unsigned long long __unused2; 28 + __kernel_mode_t mode; 29 + unsigned short __pad1; 30 + unsigned short seq; 31 + unsigned long long __unused1; 32 + unsigned long long __unused2; 33 33 }; 34 34 35 35 #endif /* __SPARC_IPCBUF_H */
-7
arch/sparc/include/uapi/asm/statfs.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 - #ifndef ___ASM_SPARC_STATFS_H 3 - #define ___ASM_SPARC_STATFS_H 4 - 5 - #include <asm-generic/statfs.h> 6 - 7 - #endif
+4 -14
arch/sparc/kernel/prom_32.c
··· 132 132 regs->which_io, regs->phys_addr); 133 133 } 134 134 135 - /* "name:vendor:device@irq,addrlo" */ 135 + /* "name@irq,addrlo" */ 136 136 static void __init ambapp_path_component(struct device_node *dp, char *tmp_buf) 137 137 { 138 138 const char *name = of_get_property(dp, "name", NULL); 139 139 struct amba_prom_registers *regs; 140 - unsigned int *intr, *device, *vendor, reg0; 140 + unsigned int *intr; 141 + unsigned int reg0; 141 142 struct property *prop; 142 143 int interrupt = 0; 143 144 ··· 160 159 else 161 160 intr = prop->value; 162 161 163 - prop = of_find_property(dp, "vendor", NULL); 164 - if (!prop) 165 - return; 166 - vendor = prop->value; 167 - prop = of_find_property(dp, "device", NULL); 168 - if (!prop) 169 - return; 170 - device = prop->value; 171 - 172 - sprintf(tmp_buf, "%s:%d:%d@%x,%x", 173 - name, *vendor, *device, 174 - *intr, reg0); 162 + sprintf(tmp_buf, "%s@%x,%x", name, *intr, reg0); 175 163 } 176 164 177 165 static void __init __build_path_component(struct device_node *dp, char *tmp_buf)
+5 -1
arch/sparc/kernel/signal32.c
··· 299 299 unsigned long pstate, paddr; 300 300 pte_t *ptep, pte; 301 301 pgd_t *pgdp; 302 + p4d_t *p4dp; 302 303 pud_t *pudp; 303 304 pmd_t *pmdp; 304 305 ··· 319 318 pgdp = pgd_offset(current->mm, address); 320 319 if (pgd_none(*pgdp)) 321 320 goto out_irqs_on; 322 - pudp = pud_offset(pgdp, address); 321 + p4dp = p4d_offset(pgdp, address); 322 + if (p4d_none(*p4dp)) 323 + goto out_irqs_on; 324 + pudp = pud_offset(p4dp, address); 323 325 if (pud_none(*pudp)) 324 326 goto out_irqs_on; 325 327 pmdp = pmd_offset(pudp, address);
+12 -1
arch/sparc/kernel/smp_64.c
··· 1621 1621 static void __init pcpu_populate_pte(unsigned long addr) 1622 1622 { 1623 1623 pgd_t *pgd = pgd_offset_k(addr); 1624 + p4d_t *p4d; 1624 1625 pud_t *pud; 1625 1626 pmd_t *pmd; 1626 1627 ··· 1634 1633 pgd_populate(&init_mm, pgd, new); 1635 1634 } 1636 1635 1637 - pud = pud_offset(pgd, addr); 1636 + p4d = p4d_offset(pgd, addr); 1637 + if (p4d_none(*p4d)) { 1638 + pud_t *new; 1639 + 1640 + new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE); 1641 + if (!new) 1642 + goto err_alloc; 1643 + p4d_populate(&init_mm, p4d, new); 1644 + } 1645 + 1646 + pud = pud_offset(p4d, addr); 1638 1647 if (pud_none(*pud)) { 1639 1648 pmd_t *new; 1640 1649
+4 -2
arch/sparc/kernel/vmlinux.lds.S
··· 171 171 } 172 172 PERCPU_SECTION(SMP_CACHE_BYTES) 173 173 174 - #ifdef CONFIG_JUMP_LABEL 175 174 . = ALIGN(PAGE_SIZE); 176 175 .exit.text : { 177 176 EXIT_TEXT 178 177 } 179 - #endif 178 + 179 + .exit.data : { 180 + EXIT_DATA 181 + } 180 182 181 183 . = ALIGN(PAGE_SIZE); 182 184 __init_end = .;
+5 -1
arch/sparc/mm/fault_64.c
··· 80 80 static unsigned int get_user_insn(unsigned long tpc) 81 81 { 82 82 pgd_t *pgdp = pgd_offset(current->mm, tpc); 83 + p4d_t *p4dp; 83 84 pud_t *pudp; 84 85 pmd_t *pmdp; 85 86 pte_t *ptep, pte; ··· 89 88 90 89 if (pgd_none(*pgdp) || unlikely(pgd_bad(*pgdp))) 91 90 goto out; 92 - pudp = pud_offset(pgdp, tpc); 91 + p4dp = p4d_offset(pgdp, tpc); 92 + if (p4d_none(*p4dp) || unlikely(p4d_bad(*p4dp))) 93 + goto out; 94 + pudp = pud_offset(p4dp, tpc); 93 95 if (pud_none(*pudp) || unlikely(pud_bad(*pudp))) 94 96 goto out; 95 97
+18 -10
arch/sparc/mm/hugetlbpage.c
··· 277 277 unsigned long addr, unsigned long sz) 278 278 { 279 279 pgd_t *pgd; 280 + p4d_t *p4d; 280 281 pud_t *pud; 281 282 pmd_t *pmd; 282 283 283 284 pgd = pgd_offset(mm, addr); 284 - pud = pud_alloc(mm, pgd, addr); 285 + p4d = p4d_offset(pgd, addr); 286 + pud = pud_alloc(mm, p4d, addr); 285 287 if (!pud) 286 288 return NULL; 287 289 if (sz >= PUD_SIZE) ··· 300 298 unsigned long addr, unsigned long sz) 301 299 { 302 300 pgd_t *pgd; 301 + p4d_t *p4d; 303 302 pud_t *pud; 304 303 pmd_t *pmd; 305 304 306 305 pgd = pgd_offset(mm, addr); 307 306 if (pgd_none(*pgd)) 308 307 return NULL; 309 - pud = pud_offset(pgd, addr); 308 + p4d = p4d_offset(pgd, addr); 309 + if (p4d_none(*p4d)) 310 + return NULL; 311 + pud = pud_offset(p4d, addr); 310 312 if (pud_none(*pud)) 311 313 return NULL; 312 314 if (is_hugetlb_pud(*pud)) ··· 455 449 mm_dec_nr_pmds(tlb->mm); 456 450 } 457 451 458 - static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd, 452 + static void hugetlb_free_pud_range(struct mmu_gather *tlb, p4d_t *p4d, 459 453 unsigned long addr, unsigned long end, 460 454 unsigned long floor, unsigned long ceiling) 461 455 { ··· 464 458 unsigned long start; 465 459 466 460 start = addr; 467 - pud = pud_offset(pgd, addr); 461 + pud = pud_offset(p4d, addr); 468 462 do { 469 463 next = pud_addr_end(addr, end); 470 464 if (pud_none_or_clear_bad(pud)) ··· 487 481 if (end - 1 > ceiling - 1) 488 482 return; 489 483 490 - pud = pud_offset(pgd, start); 491 - pgd_clear(pgd); 484 + pud = pud_offset(p4d, start); 485 + p4d_clear(p4d); 492 486 pud_free_tlb(tlb, pud, start); 493 487 mm_dec_nr_puds(tlb->mm); 494 488 } ··· 498 492 unsigned long floor, unsigned long ceiling) 499 493 { 500 494 pgd_t *pgd; 495 + p4d_t *p4d; 501 496 unsigned long next; 502 497 503 498 addr &= PMD_MASK; ··· 518 511 return; 519 512 520 513 pgd = pgd_offset(tlb->mm, addr); 514 + p4d = p4d_offset(pgd, addr); 521 515 do { 522 - next = pgd_addr_end(addr, end); 523 - if (pgd_none_or_clear_bad(pgd)) 516 + next = p4d_addr_end(addr, end); 517 + if (p4d_none_or_clear_bad(p4d)) 524 518 continue; 525 - hugetlb_free_pud_range(tlb, pgd, addr, next, floor, ceiling); 526 - } while (pgd++, addr = next, addr != end); 519 + hugetlb_free_pud_range(tlb, p4d, addr, next, floor, ceiling); 520 + } while (p4d++, addr = next, addr != end); 527 521 }
+29 -4
arch/sparc/mm/init_64.c
··· 530 530 paddr = kaddr & mask; 531 531 else { 532 532 pgd_t *pgdp = pgd_offset_k(kaddr); 533 - pud_t *pudp = pud_offset(pgdp, kaddr); 533 + p4d_t *p4dp = p4d_offset(pgdp, kaddr); 534 + pud_t *pudp = pud_offset(p4dp, kaddr); 534 535 pmd_t *pmdp = pmd_offset(pudp, kaddr); 535 536 pte_t *ptep = pte_offset_kernel(pmdp, kaddr); 536 537 ··· 1654 1653 bool kern_addr_valid(unsigned long addr) 1655 1654 { 1656 1655 pgd_t *pgd; 1656 + p4d_t *p4d; 1657 1657 pud_t *pud; 1658 1658 pmd_t *pmd; 1659 1659 pte_t *pte; ··· 1676 1674 if (pgd_none(*pgd)) 1677 1675 return 0; 1678 1676 1679 - pud = pud_offset(pgd, addr); 1677 + p4d = p4d_offset(pgd, addr); 1678 + if (p4d_none(*p4d)) 1679 + return 0; 1680 + 1681 + pud = pud_offset(p4d, addr); 1680 1682 if (pud_none(*pud)) 1681 1683 return 0; 1682 1684 ··· 1806 1800 while (vstart < vend) { 1807 1801 unsigned long this_end, paddr = __pa(vstart); 1808 1802 pgd_t *pgd = pgd_offset_k(vstart); 1803 + p4d_t *p4d; 1809 1804 pud_t *pud; 1810 1805 pmd_t *pmd; 1811 1806 pte_t *pte; ··· 1821 1814 alloc_bytes += PAGE_SIZE; 1822 1815 pgd_populate(&init_mm, pgd, new); 1823 1816 } 1824 - pud = pud_offset(pgd, vstart); 1817 + 1818 + p4d = p4d_offset(pgd, vstart); 1819 + if (p4d_none(*p4d)) { 1820 + pud_t *new; 1821 + 1822 + new = memblock_alloc_from(PAGE_SIZE, PAGE_SIZE, 1823 + PAGE_SIZE); 1824 + if (!new) 1825 + goto err_alloc; 1826 + alloc_bytes += PAGE_SIZE; 1827 + p4d_populate(&init_mm, p4d, new); 1828 + } 1829 + 1830 + pud = pud_offset(p4d, vstart); 1825 1831 if (pud_none(*pud)) { 1826 1832 pmd_t *new; 1827 1833 ··· 2632 2612 for (; vstart < vend; vstart += PMD_SIZE) { 2633 2613 pgd_t *pgd = vmemmap_pgd_populate(vstart, node); 2634 2614 unsigned long pte; 2615 + p4d_t *p4d; 2635 2616 pud_t *pud; 2636 2617 pmd_t *pmd; 2637 2618 2638 2619 if (!pgd) 2639 2620 return -ENOMEM; 2640 2621 2641 - pud = vmemmap_pud_populate(pgd, vstart, node); 2622 + p4d = vmemmap_p4d_populate(pgd, vstart, node); 2623 + if (!p4d) 2624 + return -ENOMEM; 2625 + 2626 + pud = vmemmap_pud_populate(p4d, vstart, node); 2642 2627 if (!pud) 2643 2628 return -ENOMEM; 2644 2629
-2
include/linux/console.h
··· 101 101 extern const struct consw dummy_con; /* dummy console buffer */ 102 102 extern const struct consw vga_con; /* VGA text console */ 103 103 extern const struct consw newport_con; /* SGI Newport console */ 104 - extern const struct consw prom_con; /* SPARC PROM console */ 105 104 106 105 int con_is_bound(const struct consw *csw); 107 106 int do_unregister_con_driver(const struct consw *csw); ··· 200 201 extern void resume_console(void); 201 202 202 203 int mda_console_init(void); 203 - void prom_con_init(void); 204 204 205 205 void vcs_make_sysfs(int index); 206 206 void vcs_remove_sysfs(int index);