Merge branch 'parisc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux
Pull parisc fixes from Helge Deller: "Three small important fixes for the parisc architecture: - Export __cmpxchg_u64() symbol on 32bit kernel too. This unbreaks building the kernel with ixgbe kernel module. From Guenter Roeck. - Fix 64-bit atomic cmpxchg kernel helper function for 32-bit kernel in LWS code for userspace. This unbreaks e.g. the 64-bit variant of the glibc function __sync_fetch_and_add() with a 32-bit parisc kernel. From John David Anglin, tagged for backport to v3.13+. - Detect nonsynchronous CPU-internal cr16 cycle counters more reliable. This avoids stalled CPU warnings by the kernel soft lockup detector. From me, tagged for backport to v4.13+" * 'parisc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux: parisc: Fix detection of nonsynchronous cr16 cycle counters parisc: Export __cmpxchg_u64 unconditionally parisc: Fix double-word compare and exchange in LWS code on 32-bit kernels
This commit is contained in:
commit
96f893abc8
|
@ -35,12 +35,12 @@ EXPORT_SYMBOL(memset);
|
||||||
EXPORT_SYMBOL(__xchg8);
|
EXPORT_SYMBOL(__xchg8);
|
||||||
EXPORT_SYMBOL(__xchg32);
|
EXPORT_SYMBOL(__xchg32);
|
||||||
EXPORT_SYMBOL(__cmpxchg_u32);
|
EXPORT_SYMBOL(__cmpxchg_u32);
|
||||||
|
EXPORT_SYMBOL(__cmpxchg_u64);
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
EXPORT_SYMBOL(__atomic_hash);
|
EXPORT_SYMBOL(__atomic_hash);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
EXPORT_SYMBOL(__xchg64);
|
EXPORT_SYMBOL(__xchg64);
|
||||||
EXPORT_SYMBOL(__cmpxchg_u64);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
|
@ -742,7 +742,7 @@ lws_compare_and_swap_2:
|
||||||
10: ldd 0(%r25), %r25
|
10: ldd 0(%r25), %r25
|
||||||
11: ldd 0(%r24), %r24
|
11: ldd 0(%r24), %r24
|
||||||
#else
|
#else
|
||||||
/* Load new value into r22/r23 - high/low */
|
/* Load old value into r22/r23 - high/low */
|
||||||
10: ldw 0(%r25), %r22
|
10: ldw 0(%r25), %r22
|
||||||
11: ldw 4(%r25), %r23
|
11: ldw 4(%r25), %r23
|
||||||
/* Load new value into fr4 for atomic store later */
|
/* Load new value into fr4 for atomic store later */
|
||||||
|
@ -834,11 +834,11 @@ cas2_action:
|
||||||
copy %r0, %r28
|
copy %r0, %r28
|
||||||
#else
|
#else
|
||||||
/* Compare first word */
|
/* Compare first word */
|
||||||
19: ldw,ma 0(%r26), %r29
|
19: ldw 0(%r26), %r29
|
||||||
sub,= %r29, %r22, %r0
|
sub,= %r29, %r22, %r0
|
||||||
b,n cas2_end
|
b,n cas2_end
|
||||||
/* Compare second word */
|
/* Compare second word */
|
||||||
20: ldw,ma 4(%r26), %r29
|
20: ldw 4(%r26), %r29
|
||||||
sub,= %r29, %r23, %r0
|
sub,= %r29, %r23, %r0
|
||||||
b,n cas2_end
|
b,n cas2_end
|
||||||
/* Perform the store */
|
/* Perform the store */
|
||||||
|
|
|
@ -253,7 +253,10 @@ static int __init init_cr16_clocksource(void)
|
||||||
cpu0_loc = per_cpu(cpu_data, 0).cpu_loc;
|
cpu0_loc = per_cpu(cpu_data, 0).cpu_loc;
|
||||||
|
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
if (cpu0_loc == per_cpu(cpu_data, cpu).cpu_loc)
|
if (cpu == 0)
|
||||||
|
continue;
|
||||||
|
if ((cpu0_loc != 0) &&
|
||||||
|
(cpu0_loc == per_cpu(cpu_data, cpu).cpu_loc))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
clocksource_cr16.name = "cr16_unstable";
|
clocksource_cr16.name = "cr16_unstable";
|
||||||
|
|
Loading…
Reference in a new issue