Commit f002488d authored by Linus Torvalds's avatar Linus Torvalds

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"
parents e3de3a1c ba0c0410
...@@ -38,6 +38,7 @@ config PARISC ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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));
if (flags)
raw_spin_lock_irqsave(&patch_lock, *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) ...@@ -49,7 +52,10 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
{ {
clear_fixmap(fixmap); clear_fixmap(fixmap);
if (flags)
raw_spin_unlock_irqrestore(&patch_lock, *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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 = { ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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( ...@@ -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
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment