Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
Pull sparc fixes from David Miller: - block interrupts properly across the entire MMU context change (both the hw MMU context change and the TSB table change) so that we don't get a perf event interrupt in the middle. From Rob Gardner. - be sure to register hugepages early enough, from Nitin Gupta. - UltraSPARC-III user copy exception handling would return garbage for the copied length in some circumstances. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc: sparc64: Fix exception handling in UltraSPARC-III memcpy. sbus: Convert to using %pOF instead of full_name sparc: defconfig: Cleanup from old Kconfig options sparc64: Register hugepages during arch init sparc64: Prevent perf from running during super critical sections
This commit is contained in:
commit
0a23ea65ce
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
|
@ -23,7 +22,6 @@ CONFIG_IP_PNP_DHCP=y
|
||||||
CONFIG_INET_AH=y
|
CONFIG_INET_AH=y
|
||||||
CONFIG_INET_ESP=y
|
CONFIG_INET_ESP=y
|
||||||
CONFIG_INET_IPCOMP=y
|
CONFIG_INET_IPCOMP=y
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
CONFIG_INET6_AH=m
|
CONFIG_INET6_AH=m
|
||||||
CONFIG_INET6_ESP=m
|
CONFIG_INET6_ESP=m
|
||||||
CONFIG_INET6_IPCOMP=m
|
CONFIG_INET6_IPCOMP=m
|
||||||
|
@ -69,7 +67,6 @@ CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT2_FS_XATTR=y
|
CONFIG_EXT2_FS_XATTR=y
|
||||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||||
CONFIG_EXT2_FS_SECURITY=y
|
CONFIG_EXT2_FS_SECURITY=y
|
||||||
CONFIG_AUTOFS_FS=m
|
|
||||||
CONFIG_AUTOFS4_FS=m
|
CONFIG_AUTOFS4_FS=m
|
||||||
CONFIG_ISO9660_FS=m
|
CONFIG_ISO9660_FS=m
|
||||||
CONFIG_PROC_KCORE=y
|
CONFIG_PROC_KCORE=y
|
||||||
|
@ -82,7 +79,6 @@ CONFIG_NLS=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DETECT_HUNG_TASK=y
|
CONFIG_DETECT_HUNG_TASK=y
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
|
||||||
CONFIG_KGDB=y
|
CONFIG_KGDB=y
|
||||||
CONFIG_KGDB_TESTS=y
|
CONFIG_KGDB_TESTS=y
|
||||||
CONFIG_CRYPTO_NULL=m
|
CONFIG_CRYPTO_NULL=m
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
CONFIG_64BIT=y
|
CONFIG_64BIT=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -184,7 +183,6 @@ CONFIG_HID_TOPSEED=y
|
||||||
CONFIG_HID_THRUSTMASTER=y
|
CONFIG_HID_THRUSTMASTER=y
|
||||||
CONFIG_HID_ZEROPLUS=y
|
CONFIG_HID_ZEROPLUS=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
# CONFIG_USB_DEVICE_CLASS is not set
|
|
||||||
CONFIG_USB_EHCI_HCD=m
|
CONFIG_USB_EHCI_HCD=m
|
||||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
@ -210,8 +208,6 @@ CONFIG_LOCKUP_DETECTOR=y
|
||||||
CONFIG_DETECT_HUNG_TASK=y
|
CONFIG_DETECT_HUNG_TASK=y
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
CONFIG_SCHEDSTATS=y
|
CONFIG_SCHEDSTATS=y
|
||||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
|
||||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
|
||||||
CONFIG_BLK_DEV_IO_TRACE=y
|
CONFIG_BLK_DEV_IO_TRACE=y
|
||||||
CONFIG_UPROBE_EVENTS=y
|
CONFIG_UPROBE_EVENTS=y
|
||||||
CONFIG_KEYS=y
|
CONFIG_KEYS=y
|
||||||
|
|
|
@ -27,9 +27,11 @@ void destroy_context(struct mm_struct *mm);
|
||||||
void __tsb_context_switch(unsigned long pgd_pa,
|
void __tsb_context_switch(unsigned long pgd_pa,
|
||||||
struct tsb_config *tsb_base,
|
struct tsb_config *tsb_base,
|
||||||
struct tsb_config *tsb_huge,
|
struct tsb_config *tsb_huge,
|
||||||
unsigned long tsb_descr_pa);
|
unsigned long tsb_descr_pa,
|
||||||
|
unsigned long secondary_ctx);
|
||||||
|
|
||||||
static inline void tsb_context_switch(struct mm_struct *mm)
|
static inline void tsb_context_switch_ctx(struct mm_struct *mm,
|
||||||
|
unsigned long ctx)
|
||||||
{
|
{
|
||||||
__tsb_context_switch(__pa(mm->pgd),
|
__tsb_context_switch(__pa(mm->pgd),
|
||||||
&mm->context.tsb_block[MM_TSB_BASE],
|
&mm->context.tsb_block[MM_TSB_BASE],
|
||||||
|
@ -40,9 +42,12 @@ static inline void tsb_context_switch(struct mm_struct *mm)
|
||||||
#else
|
#else
|
||||||
NULL
|
NULL
|
||||||
#endif
|
#endif
|
||||||
, __pa(&mm->context.tsb_descr[MM_TSB_BASE]));
|
, __pa(&mm->context.tsb_descr[MM_TSB_BASE]),
|
||||||
|
ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define tsb_context_switch(X) tsb_context_switch_ctx(X, 0)
|
||||||
|
|
||||||
void tsb_grow(struct mm_struct *mm,
|
void tsb_grow(struct mm_struct *mm,
|
||||||
unsigned long tsb_index,
|
unsigned long tsb_index,
|
||||||
unsigned long mm_rss);
|
unsigned long mm_rss);
|
||||||
|
@ -112,8 +117,7 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
|
||||||
* cpu0 to update it's TSB because at that point the cpu_vm_mask
|
* cpu0 to update it's TSB because at that point the cpu_vm_mask
|
||||||
* only had cpu1 set in it.
|
* only had cpu1 set in it.
|
||||||
*/
|
*/
|
||||||
load_secondary_context(mm);
|
tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context));
|
||||||
tsb_context_switch(mm);
|
|
||||||
|
|
||||||
/* Any time a processor runs a context on an address space
|
/* Any time a processor runs a context on an address space
|
||||||
* for the first time, we must flush that context out of the
|
* for the first time, we must flush that context out of the
|
||||||
|
|
|
@ -360,6 +360,7 @@ tsb_flush:
|
||||||
* %o1: TSB base config pointer
|
* %o1: TSB base config pointer
|
||||||
* %o2: TSB huge config pointer, or NULL if none
|
* %o2: TSB huge config pointer, or NULL if none
|
||||||
* %o3: Hypervisor TSB descriptor physical address
|
* %o3: Hypervisor TSB descriptor physical address
|
||||||
|
* %o4: Secondary context to load, if non-zero
|
||||||
*
|
*
|
||||||
* We have to run this whole thing with interrupts
|
* We have to run this whole thing with interrupts
|
||||||
* disabled so that the current cpu doesn't change
|
* disabled so that the current cpu doesn't change
|
||||||
|
@ -372,6 +373,17 @@ __tsb_context_switch:
|
||||||
rdpr %pstate, %g1
|
rdpr %pstate, %g1
|
||||||
wrpr %g1, PSTATE_IE, %pstate
|
wrpr %g1, PSTATE_IE, %pstate
|
||||||
|
|
||||||
|
brz,pn %o4, 1f
|
||||||
|
mov SECONDARY_CONTEXT, %o5
|
||||||
|
|
||||||
|
661: stxa %o4, [%o5] ASI_DMMU
|
||||||
|
.section .sun4v_1insn_patch, "ax"
|
||||||
|
.word 661b
|
||||||
|
stxa %o4, [%o5] ASI_MMU
|
||||||
|
.previous
|
||||||
|
flush %g6
|
||||||
|
|
||||||
|
1:
|
||||||
TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
|
TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
|
||||||
|
|
||||||
stx %o0, [%g2 + TRAP_PER_CPU_PGD_PADDR]
|
stx %o0, [%g2 + TRAP_PER_CPU_PGD_PADDR]
|
||||||
|
|
|
@ -145,13 +145,13 @@ ENDPROC(U3_retl_o2_plus_GS_plus_0x08)
|
||||||
ENTRY(U3_retl_o2_and_7_plus_GS)
|
ENTRY(U3_retl_o2_and_7_plus_GS)
|
||||||
and %o2, 7, %o2
|
and %o2, 7, %o2
|
||||||
retl
|
retl
|
||||||
add %o2, GLOBAL_SPARE, %o2
|
add %o2, GLOBAL_SPARE, %o0
|
||||||
ENDPROC(U3_retl_o2_and_7_plus_GS)
|
ENDPROC(U3_retl_o2_and_7_plus_GS)
|
||||||
ENTRY(U3_retl_o2_and_7_plus_GS_plus_8)
|
ENTRY(U3_retl_o2_and_7_plus_GS_plus_8)
|
||||||
add GLOBAL_SPARE, 8, GLOBAL_SPARE
|
add GLOBAL_SPARE, 8, GLOBAL_SPARE
|
||||||
and %o2, 7, %o2
|
and %o2, 7, %o2
|
||||||
retl
|
retl
|
||||||
add %o2, GLOBAL_SPARE, %o2
|
add %o2, GLOBAL_SPARE, %o0
|
||||||
ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8)
|
ENDPROC(U3_retl_o2_and_7_plus_GS_plus_8)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -325,6 +325,29 @@ static void __update_mmu_tsb_insert(struct mm_struct *mm, unsigned long tsb_inde
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
|
static void __init add_huge_page_size(unsigned long size)
|
||||||
|
{
|
||||||
|
unsigned int order;
|
||||||
|
|
||||||
|
if (size_to_hstate(size))
|
||||||
|
return;
|
||||||
|
|
||||||
|
order = ilog2(size) - PAGE_SHIFT;
|
||||||
|
hugetlb_add_hstate(order);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int __init hugetlbpage_init(void)
|
||||||
|
{
|
||||||
|
add_huge_page_size(1UL << HPAGE_64K_SHIFT);
|
||||||
|
add_huge_page_size(1UL << HPAGE_SHIFT);
|
||||||
|
add_huge_page_size(1UL << HPAGE_256MB_SHIFT);
|
||||||
|
add_huge_page_size(1UL << HPAGE_2GB_SHIFT);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(hugetlbpage_init);
|
||||||
|
|
||||||
static int __init setup_hugepagesz(char *string)
|
static int __init setup_hugepagesz(char *string)
|
||||||
{
|
{
|
||||||
unsigned long long hugepage_size;
|
unsigned long long hugepage_size;
|
||||||
|
@ -364,7 +387,7 @@ static int __init setup_hugepagesz(char *string)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
hugetlb_add_hstate(hugepage_shift - PAGE_SHIFT);
|
add_huge_page_size(hugepage_size);
|
||||||
rc = 1;
|
rc = 1;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
|
@ -35,6 +35,5 @@ void restore_processor_state(void)
|
||||||
{
|
{
|
||||||
struct mm_struct *mm = current->active_mm;
|
struct mm_struct *mm = current->active_mm;
|
||||||
|
|
||||||
load_secondary_context(mm);
|
tsb_context_switch_ctx(mm, CTX_HWBITS(mm->context));
|
||||||
tsb_context_switch(mm);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,8 +212,8 @@ static int d7s_probe(struct platform_device *op)
|
||||||
|
|
||||||
writeb(regs, p->regs);
|
writeb(regs, p->regs);
|
||||||
|
|
||||||
printk(KERN_INFO PFX "7-Segment Display%s at [%s:0x%llx] %s\n",
|
printk(KERN_INFO PFX "7-Segment Display%pOF at [%s:0x%llx] %s\n",
|
||||||
op->dev.of_node->full_name,
|
op->dev.of_node,
|
||||||
(regs & D7S_FLIP) ? " (FLIPPED)" : "",
|
(regs & D7S_FLIP) ? " (FLIPPED)" : "",
|
||||||
op->resource[0].start,
|
op->resource[0].start,
|
||||||
sol_compat ? "in sol_compat mode" : "");
|
sol_compat ? "in sol_compat mode" : "");
|
||||||
|
|
|
@ -181,8 +181,8 @@ static int flash_probe(struct platform_device *op)
|
||||||
}
|
}
|
||||||
flash.busy = 0;
|
flash.busy = 0;
|
||||||
|
|
||||||
printk(KERN_INFO "%s: OBP Flash, RD %lx[%lx] WR %lx[%lx]\n",
|
printk(KERN_INFO "%pOF: OBP Flash, RD %lx[%lx] WR %lx[%lx]\n",
|
||||||
op->dev.of_node->full_name,
|
op->dev.of_node,
|
||||||
flash.read_base, flash.read_size,
|
flash.read_base, flash.read_size,
|
||||||
flash.write_base, flash.write_size);
|
flash.write_base, flash.write_size);
|
||||||
|
|
||||||
|
|
|
@ -379,8 +379,8 @@ static int uctrl_probe(struct platform_device *op)
|
||||||
}
|
}
|
||||||
|
|
||||||
sbus_writel(UCTRL_INTR_RXNE_REQ|UCTRL_INTR_RXNE_MSK, &p->regs->uctrl_intr);
|
sbus_writel(UCTRL_INTR_RXNE_REQ|UCTRL_INTR_RXNE_MSK, &p->regs->uctrl_intr);
|
||||||
printk(KERN_INFO "%s: uctrl regs[0x%p] (irq %d)\n",
|
printk(KERN_INFO "%pOF: uctrl regs[0x%p] (irq %d)\n",
|
||||||
op->dev.of_node->full_name, p->regs, p->irq);
|
op->dev.of_node, p->regs, p->irq);
|
||||||
uctrl_get_event_status(p);
|
uctrl_get_event_status(p);
|
||||||
uctrl_get_external_status(p);
|
uctrl_get_external_status(p);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue