forked from Minki/linux
parisc architecture fixes for kernel v5.18-rc6
Some reverts of existing patches, which were necessary because of boot issues due to wrong CPU clock handling and cache issues which led to userspace segfaults with 32bit kernels. Other than that just small updates and fixes, e.g. defconfig updates, spelling fixes, a clocksource fix, boot topology fixes and a fix for /proc/cpuinfo output to satisfy lscpu. -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQS86RI+GtKfB8BJu973ErUQojoPXwUCYngOJAAKCRD3ErUQojoP X2+vAPwPf5JbrOkK9z7OM2xmRpfp1f0vuD5k6fxhc11+F5xpLQEAnxkLOX5//jGK FmPVDub53u5+Wje+WFJQoqzJ4zyDQQQ= =4UHA -----END PGP SIGNATURE----- Merge tag 'for-5.18/parisc-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux Pull parisc architecture fixes from Helge Deller: "Some reverts of existing patches, which were necessary because of boot issues due to wrong CPU clock handling and cache issues which led to userspace segfaults with 32bit kernels. Dave has a whole bunch of upcoming cache fixes which I then plan to push in the next merge window. Other than that just small updates and fixes, e.g. defconfig updates, spelling fixes, a clocksource fix, boot topology fixes and a fix for /proc/cpuinfo output to satisfy lscpu" * tag 'for-5.18/parisc-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: Revert "parisc: Increase parisc_cache_flush_threshold setting" parisc: Mark cr16 clock unstable on all SMP machines parisc: Fix typos in comments parisc: Change MAX_ADDRESS to become unsigned long long parisc: Merge model and model name into one line in /proc/cpuinfo parisc: Re-enable GENERIC_CPU_DEVICES for !SMP parisc: Update 32- and 64-bit defconfigs parisc: Only list existing CPUs in cpu_possible_mask Revert "parisc: Fix patch code locking and flushing" Revert "parisc: Mark sched_clock unstable only if clocks are not syncronized" Revert "parisc: Mark cr16 CPU clocksource unstable on all SMP machines"
This commit is contained in:
commit
f002488d80
@ -38,6 +38,7 @@ config PARISC
|
|||||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select GENERIC_ARCH_TOPOLOGY if SMP
|
select GENERIC_ARCH_TOPOLOGY if SMP
|
||||||
|
select GENERIC_CPU_DEVICES if !SMP
|
||||||
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
select GENERIC_LIB_DEVMEM_IS_ALLOWED
|
||||||
select SYSCTL_ARCH_UNALIGN_ALLOW
|
select SYSCTL_ARCH_UNALIGN_ALLOW
|
||||||
select SYSCTL_EXCEPTION_TRACE
|
select SYSCTL_EXCEPTION_TRACE
|
||||||
|
@ -6,6 +6,9 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
CONFIG_IKCONFIG_PROC=y
|
CONFIG_IKCONFIG_PROC=y
|
||||||
CONFIG_LOG_BUF_SHIFT=16
|
CONFIG_LOG_BUF_SHIFT=16
|
||||||
|
CONFIG_CGROUPS=y
|
||||||
|
CONFIG_NAMESPACES=y
|
||||||
|
CONFIG_USER_NS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
@ -47,7 +50,6 @@ CONFIG_PARPORT=y
|
|||||||
CONFIG_PARPORT_PC=m
|
CONFIG_PARPORT_PC=m
|
||||||
CONFIG_PARPORT_1284=y
|
CONFIG_PARPORT_1284=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=6144
|
CONFIG_BLK_DEV_RAM_SIZE=6144
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
|
@ -16,6 +16,7 @@ CONFIG_CGROUPS=y
|
|||||||
CONFIG_MEMCG=y
|
CONFIG_MEMCG=y
|
||||||
CONFIG_CGROUP_PIDS=y
|
CONFIG_CGROUP_PIDS=y
|
||||||
CONFIG_CPUSETS=y
|
CONFIG_CPUSETS=y
|
||||||
|
CONFIG_USER_NS=y
|
||||||
CONFIG_RELAY=y
|
CONFIG_RELAY=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
@ -267,9 +268,9 @@ CONFIG_CRYPTO_DEFLATE=m
|
|||||||
CONFIG_CRC_CCITT=m
|
CONFIG_CRC_CCITT=m
|
||||||
CONFIG_LIBCRC32C=y
|
CONFIG_LIBCRC32C=y
|
||||||
CONFIG_PRINTK_TIME=y
|
CONFIG_PRINTK_TIME=y
|
||||||
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_STRIP_ASM_SYMS=y
|
CONFIG_STRIP_ASM_SYMS=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_FS=y
|
CONFIG_DEBUG_FS=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
|
||||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
# CONFIG_SCHED_DEBUG is not set
|
# CONFIG_SCHED_DEBUG is not set
|
||||||
|
@ -160,7 +160,7 @@ extern void __update_cache(pte_t pte);
|
|||||||
#define SPACEID_SHIFT (MAX_ADDRBITS - 32)
|
#define SPACEID_SHIFT (MAX_ADDRBITS - 32)
|
||||||
#else
|
#else
|
||||||
#define MAX_ADDRBITS (BITS_PER_LONG)
|
#define MAX_ADDRBITS (BITS_PER_LONG)
|
||||||
#define MAX_ADDRESS (1UL << MAX_ADDRBITS)
|
#define MAX_ADDRESS (1ULL << MAX_ADDRBITS)
|
||||||
#define SPACEID_SHIFT 0
|
#define SPACEID_SHIFT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -403,7 +403,7 @@ void __init parisc_setup_cache_timing(void)
|
|||||||
{
|
{
|
||||||
unsigned long rangetime, alltime;
|
unsigned long rangetime, alltime;
|
||||||
unsigned long size;
|
unsigned long size;
|
||||||
unsigned long threshold, threshold2;
|
unsigned long threshold;
|
||||||
|
|
||||||
alltime = mfctl(16);
|
alltime = mfctl(16);
|
||||||
flush_data_cache();
|
flush_data_cache();
|
||||||
@ -418,20 +418,8 @@ void __init parisc_setup_cache_timing(void)
|
|||||||
alltime, size, rangetime);
|
alltime, size, rangetime);
|
||||||
|
|
||||||
threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
|
threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
|
||||||
|
if (threshold > cache_info.dc_size)
|
||||||
/*
|
threshold = cache_info.dc_size;
|
||||||
* The threshold computed above isn't very reliable since the
|
|
||||||
* flush times depend greatly on the percentage of dirty lines
|
|
||||||
* in the flush range. Further, the whole cache time doesn't
|
|
||||||
* include the time to refill lines that aren't in the mm/vma
|
|
||||||
* being flushed. By timing glibc build and checks on mako cpus,
|
|
||||||
* the following formula seems to work reasonably well. The
|
|
||||||
* value from the timing calculation is too small, and increases
|
|
||||||
* build and check times by almost a factor two.
|
|
||||||
*/
|
|
||||||
threshold2 = cache_info.dc_size * num_online_cpus();
|
|
||||||
if (threshold2 > threshold)
|
|
||||||
threshold = threshold2;
|
|
||||||
if (threshold)
|
if (threshold)
|
||||||
parisc_cache_flush_threshold = threshold;
|
parisc_cache_flush_threshold = threshold;
|
||||||
printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
|
printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
|
||||||
|
@ -152,7 +152,7 @@ int __kprobes parisc_kprobe_ss_handler(struct pt_regs *regs)
|
|||||||
/* for absolute branch instructions we can copy iaoq_b. for relative
|
/* for absolute branch instructions we can copy iaoq_b. for relative
|
||||||
* branch instructions we need to calculate the new address based on the
|
* branch instructions we need to calculate the new address based on the
|
||||||
* difference between iaoq_f and iaoq_b. We cannot use iaoq_b without
|
* difference between iaoq_f and iaoq_b. We cannot use iaoq_b without
|
||||||
* modificationt because it's based on our ainsn.insn address.
|
* modifications because it's based on our ainsn.insn address.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (p->post_handler)
|
if (p->post_handler)
|
||||||
|
@ -40,7 +40,10 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags,
|
|||||||
|
|
||||||
*need_unmap = 1;
|
*need_unmap = 1;
|
||||||
set_fixmap(fixmap, page_to_phys(page));
|
set_fixmap(fixmap, page_to_phys(page));
|
||||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
if (flags)
|
||||||
|
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||||
|
else
|
||||||
|
__acquire(&patch_lock);
|
||||||
|
|
||||||
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
return (void *) (__fix_to_virt(fixmap) + (uintaddr & ~PAGE_MASK));
|
||||||
}
|
}
|
||||||
@ -49,7 +52,10 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
|||||||
{
|
{
|
||||||
clear_fixmap(fixmap);
|
clear_fixmap(fixmap);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
if (flags)
|
||||||
|
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||||
|
else
|
||||||
|
__release(&patch_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
||||||
@ -61,9 +67,8 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
int mapped;
|
int mapped;
|
||||||
|
|
||||||
/* Make sure we don't have any aliases in cache */
|
/* Make sure we don't have any aliases in cache */
|
||||||
flush_kernel_dcache_range_asm(start, end);
|
flush_kernel_vmap_range(addr, len);
|
||||||
flush_kernel_icache_range_asm(start, end);
|
flush_icache_range(start, end);
|
||||||
flush_tlb_kernel_range(start, end);
|
|
||||||
|
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags, &mapped);
|
||||||
|
|
||||||
@ -76,10 +81,8 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
* We're crossing a page boundary, so
|
* We're crossing a page boundary, so
|
||||||
* need to remap
|
* need to remap
|
||||||
*/
|
*/
|
||||||
flush_kernel_dcache_range_asm((unsigned long)fixmap,
|
flush_kernel_vmap_range((void *)fixmap,
|
||||||
(unsigned long)p);
|
(p-fixmap) * sizeof(*p));
|
||||||
flush_tlb_kernel_range((unsigned long)fixmap,
|
|
||||||
(unsigned long)p);
|
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
p = fixmap = patch_map(addr, FIX_TEXT_POKE0, &flags,
|
||||||
@ -87,10 +90,10 @@ void __kprobes __patch_text_multiple(void *addr, u32 *insn, unsigned int len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
flush_kernel_dcache_range_asm((unsigned long)fixmap, (unsigned long)p);
|
flush_kernel_vmap_range((void *)fixmap, (p-fixmap) * sizeof(*p));
|
||||||
flush_tlb_kernel_range((unsigned long)fixmap, (unsigned long)p);
|
|
||||||
if (mapped)
|
if (mapped)
|
||||||
patch_unmap(FIX_TEXT_POKE0, &flags);
|
patch_unmap(FIX_TEXT_POKE0, &flags);
|
||||||
|
flush_icache_range(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __kprobes __patch_text(void *addr, u32 insn)
|
void __kprobes __patch_text(void *addr, u32 insn)
|
||||||
|
@ -171,6 +171,7 @@ static int __init processor_probe(struct parisc_device *dev)
|
|||||||
p->cpu_num = cpu_info.cpu_num;
|
p->cpu_num = cpu_info.cpu_num;
|
||||||
p->cpu_loc = cpu_info.cpu_loc;
|
p->cpu_loc = cpu_info.cpu_loc;
|
||||||
|
|
||||||
|
set_cpu_possible(cpuid, true);
|
||||||
store_cpu_topology(cpuid);
|
store_cpu_topology(cpuid);
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
@ -419,8 +420,7 @@ show_cpuinfo (struct seq_file *m, void *v)
|
|||||||
}
|
}
|
||||||
seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
|
seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
|
||||||
|
|
||||||
seq_printf(m, "model\t\t: %s\n"
|
seq_printf(m, "model\t\t: %s - %s\n",
|
||||||
"model name\t: %s\n",
|
|
||||||
boot_cpu_data.pdc.sys_model_name,
|
boot_cpu_data.pdc.sys_model_name,
|
||||||
cpuinfo->dev ?
|
cpuinfo->dev ?
|
||||||
cpuinfo->dev->name : "Unknown");
|
cpuinfo->dev->name : "Unknown");
|
||||||
@ -461,6 +461,13 @@ static struct parisc_driver cpu_driver __refdata = {
|
|||||||
*/
|
*/
|
||||||
void __init processor_init(void)
|
void __init processor_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned int cpu;
|
||||||
|
|
||||||
reset_cpu_topology();
|
reset_cpu_topology();
|
||||||
|
|
||||||
|
/* reset possible mask. We will mark those which are possible. */
|
||||||
|
for_each_possible_cpu(cpu)
|
||||||
|
set_cpu_possible(cpu, false);
|
||||||
|
|
||||||
register_parisc_driver(&cpu_driver);
|
register_parisc_driver(&cpu_driver);
|
||||||
}
|
}
|
||||||
|
@ -161,6 +161,8 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
#ifdef CONFIG_PA11
|
#ifdef CONFIG_PA11
|
||||||
dma_ops_init();
|
dma_ops_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
clear_sched_clock_stable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -251,13 +251,9 @@ void __init time_init(void)
|
|||||||
static int __init init_cr16_clocksource(void)
|
static int __init init_cr16_clocksource(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* The cr16 interval timers are not syncronized across CPUs, even if
|
* The cr16 interval timers are not synchronized across CPUs.
|
||||||
* they share the same socket.
|
|
||||||
*/
|
*/
|
||||||
if (num_online_cpus() > 1 && !running_on_qemu) {
|
if (num_online_cpus() > 1 && !running_on_qemu) {
|
||||||
/* mark sched_clock unstable */
|
|
||||||
clear_sched_clock_stable();
|
|
||||||
|
|
||||||
clocksource_cr16.name = "cr16_unstable";
|
clocksource_cr16.name = "cr16_unstable";
|
||||||
clocksource_cr16.flags = CLOCK_SOURCE_UNSTABLE;
|
clocksource_cr16.flags = CLOCK_SOURCE_UNSTABLE;
|
||||||
clocksource_cr16.rating = 0;
|
clocksource_cr16.rating = 0;
|
||||||
|
@ -469,7 +469,7 @@ void parisc_terminate(char *msg, struct pt_regs *regs, int code, unsigned long o
|
|||||||
* panic notifiers, and we should call panic
|
* panic notifiers, and we should call panic
|
||||||
* directly from the location that we wish.
|
* directly from the location that we wish.
|
||||||
* e.g. We should not call panic from
|
* e.g. We should not call panic from
|
||||||
* parisc_terminate, but rather the oter way around.
|
* parisc_terminate, but rather the other way around.
|
||||||
* This hack works, prints the panic message twice,
|
* This hack works, prints the panic message twice,
|
||||||
* and it enables reboot timers!
|
* and it enables reboot timers!
|
||||||
*/
|
*/
|
||||||
|
@ -253,7 +253,7 @@ dbl_fadd(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -256,7 +256,7 @@ dbl_fsub(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -249,7 +249,7 @@ sgl_fadd(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -252,7 +252,7 @@ sgl_fsub(
|
|||||||
return(NOEXCEPTION);
|
return(NOEXCEPTION);
|
||||||
}
|
}
|
||||||
right_exponent = 1; /* Set exponent to reflect different bias
|
right_exponent = 1; /* Set exponent to reflect different bias
|
||||||
* with denomalized numbers. */
|
* with denormalized numbers. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user