From: Pan Xinhui <hidden> Date: 2016-09-19 05:26:13
Hi All,
this is the fairlock patchset. You can apply them and build successfully.
patches are based on 4.8-rc4.
qspinlock can avoid waiter starved issue. It has about the same speed in
single-thread and it can be much faster in high contention situations
especially when the spinlock is embedded within the data structure to be
protected.
v6 -> v7:
rebase onto 4.8-rc4
no changelog anymore, sorry for that. I hope there is a very careful review.
Todo:
we can save one function call overhead. As we can use feature-fixup to patch
the binary code. Currently there is pv_lock_ops->lock(lock) and ->unlock(lock) to acquire/release the lock.
some benchmark result below
perf bench
these numbers are ops per sec, So the higher the better.
*******************************************
on pSeries with 32 vcpus, 32Gb memory, pHyp.
------------------------------------------------------------------------------------
test case | pv-qspinlock | qspinlock | current-spinlock
------------------------------------------------------------------------------------
futex hash | 618572 | 552332 | 553788
futex lock-pi | 364 | 364 | 364
sched pipe | 78984 | 76060 | 81454
------------------------------------------------------------------------------------
unix bench:
these numbers are scores, So the higher the better.
************************************************
on PowerNV with 16 cores(cpus) (smt off), 32Gb memory:
-------------
pv-qspinlock and qspinlock have very similar results because pv-qspinlock use native version
which is only having one callback overhead
------------------------------------------------------------------------------------
test case | pv-qspinlock and qspinlock | current-spinlock
------------------------------------------------------------------------------------
Execl Throughput 761.1 761.4
File Copy 1024 bufsize 2000 maxblocks 1259.8 1286.6
File Copy 256 bufsize 500 maxblocks 782.2 790.3
File Copy 4096 bufsize 8000 maxblocks 2741.5 2817.4
Pipe Throughput 1063.2 1036.7
Pipe-based Context Switching 284.7 281.1
Process Creation 679.6 649.1
Shell Scripts (1 concurrent) 1933.2 1922.9
Shell Scripts (8 concurrent) 5003.3 4899.8
System Call Overhead 900.6 896.8
==========================
System Benchmarks Index Score 1139.3 1133.0
--------------------------------------------------------------------------- ---------
*******************************************
on pSeries with 32 vcpus, 32Gb memory, pHyp.
------------------------------------------------------------------------------------
test case | pv-qspinlock | qspinlock | current-spinlock
------------------------------------------------------------------------------------
Execl Throughput 877.1 891.2 872.8
File Copy 1024 bufsize 2000 maxblocks 1390.4 1399.2 1395.0
File Copy 256 bufsize 500 maxblocks 882.4 889.5 881.8
File Copy 4096 bufsize 8000 maxblocks 3112.3 3113.4 3121.7
Pipe Throughput 1095.8 1162.6 1158.5
Pipe-based Context Switching 194.9 192.7 200.7
Process Creation 518.4 526.4 509.1
Shell Scripts (1 concurrent) 1401.9 1413.9 1402.2
Shell Scripts (8 concurrent) 3215.6 3246.6 3229.1
System Call Overhead 833.2 892.4 888.1
====================================
System Benchmarks Index Score 1033.7 1052.5 1047.8
------------------------------------------------------------------------------------
******************************************
on pSeries with 32 vcpus, 16Gb memory, KVM.
------------------------------------------------------------------------------------
test case | pv-qspinlock | qspinlock | current-spinlock
------------------------------------------------------------------------------------
Execl Throughput 497.4 518.7 497.8
File Copy 1024 bufsize 2000 maxblocks 1368.8 1390.1 1343.3
File Copy 256 bufsize 500 maxblocks 857.7 859.8 831.4
File Copy 4096 bufsize 8000 maxblocks 2851.7 2838.1 2785.5
Pipe Throughput 1221.9 1265.3 1250.4
Pipe-based Context Switching 529.8 578.1 564.2
Process Creation 408.4 421.6 287.6
Shell Scripts (1 concurrent) 1201.8 1215.3 1185.8
Shell Scripts (8 concurrent) 3758.4 3799.3 3878.9
System Call Overhead 1008.3 1122.6 1134.2
=====================================
System Benchmarks Index Score 1072.0 1108.9 1050.6
------------------------------------------------------------------------------------
Pan Xinhui (6):
pv-qspinlock: use cmpxchg_release in __pv_queued_spin_unlock
powerpc/qspinlock: powerpc support qspinlock
powerpc: pseries/Kconfig: Add qspinlock build config
powerpc: lib/locks.c: Add cpu yield/wake helper function
powerpc/pv-qspinlock: powerpc support pv-qspinlock
powerpc: pSeries: Add pv-qspinlock build config/make
arch/powerpc/include/asm/qspinlock.h | 93 +++++++++++++
arch/powerpc/include/asm/qspinlock_paravirt.h | 36 +++++
.../powerpc/include/asm/qspinlock_paravirt_types.h | 13 ++
arch/powerpc/include/asm/spinlock.h | 35 +++--
arch/powerpc/include/asm/spinlock_types.h | 4 +
arch/powerpc/kernel/Makefile | 1 +
arch/powerpc/kernel/paravirt.c | 153 +++++++++++++++++++++
arch/powerpc/lib/locks.c | 122 ++++++++++++++++
arch/powerpc/platforms/pseries/Kconfig | 9 ++
arch/powerpc/platforms/pseries/setup.c | 5 +
kernel/locking/qspinlock_paravirt.h | 2 +-
11 files changed, 459 insertions(+), 14 deletions(-)
create mode 100644 arch/powerpc/include/asm/qspinlock.h
create mode 100644 arch/powerpc/include/asm/qspinlock_paravirt.h
create mode 100644 arch/powerpc/include/asm/qspinlock_paravirt_types.h
create mode 100644 arch/powerpc/kernel/paravirt.c
--
2.4.11
From: Pan Xinhui <hidden> Date: 2016-09-19 05:26:23
This patch add basic code to enable qspinlock on powerpc. qspinlock is
one kind of fairlock implemention. And seen some performance improvement
under some scenarios.
queued_spin_unlock() release the lock by just one write of NULL to the
->locked field which sits at different places in the two endianness
system.
We override some arch_spin_xxx as powerpc has io_sync stuff which makes
sure the io operations are protected by the lock correctly.
There is another special case, see commit
2c610022711 ("locking/qspinlock: Fix spin_unlock_wait() some more")
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/include/asm/qspinlock.h | 66 +++++++++++++++++++++++++++++++
arch/powerpc/include/asm/spinlock.h | 31 +++++++++------
arch/powerpc/include/asm/spinlock_types.h | 4 ++
arch/powerpc/lib/locks.c | 59 +++++++++++++++++++++++++++
4 files changed, 147 insertions(+), 13 deletions(-)
create mode 100644 arch/powerpc/include/asm/qspinlock.h
@@ -52,6 +52,23 @@#define SYNC_IO#endif+#if defined(CONFIG_PPC_SPLPAR)+/* We only yield to the hypervisor if we are in shared processor mode */+#define SHARED_PROCESSOR (lppaca_shared_proc(local_paca->lppaca_ptr))+externvoid__spin_yield(arch_spinlock_t*lock);+externvoid__rw_yield(arch_rwlock_t*lock);+#else /* SPLPAR */+#define __spin_yield(x) barrier()+#define __rw_yield(x) barrier()+#define SHARED_PROCESSOR 0+#endif++#ifdef CONFIG_QUEUED_SPINLOCKS+#include<asm/qspinlock.h>+#else++#define arch_spin_relax(lock) __spin_yield(lock)+static__always_inlineintarch_spin_value_unlocked(arch_spinlock_tlock){returnlock.slock==0;
@@ -106,18 +123,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)*held.Conveniently,wehaveawordinthepacathatholdsthis*value.*/--#if defined(CONFIG_PPC_SPLPAR)-/* We only yield to the hypervisor if we are in shared processor mode */-#define SHARED_PROCESSOR (lppaca_shared_proc(local_paca->lppaca_ptr))-externvoid__spin_yield(arch_spinlock_t*lock);-externvoid__rw_yield(arch_rwlock_t*lock);-#else /* SPLPAR */-#define __spin_yield(x) barrier()-#define __rw_yield(x) barrier()-#define SHARED_PROCESSOR 0-#endif-staticinlinevoidarch_spin_lock(arch_spinlock_t*lock){CLEAR_IO_SYNC;
@@ -68,3 +70,60 @@ void __rw_yield(arch_rwlock_t *rw)get_hard_smp_processor_id(holder_cpu),yield_count);}#endif++#ifdef CONFIG_QUEUED_SPINLOCKS+/*+*ThisforbidweloadanoldvalueinanotherLL/SC.BecausetheSChereforce+*anotherLL/SCrepeat.SoweguaranteeallloadsinanotherLLandSCwill+*readcorrectvalue.+*/+staticinlineu32atomic_read_sync(atomic_t*v)+{+u32val;++__asm____volatile__(+"1: "PPC_LWARX(%0,0,%2,0)"\n"+" stwcx. %0, 0, %2\n"+" bne- 1b\n"+:"=&r"(val),"+m"(*v)+:"r"(v)+:"cr0","xer");++returnval;+}++voidqueued_spin_unlock_wait(structqspinlock*lock)+{++u32val;++smp_mb();++/*+*copiedfromgenericqueue_spin_unlock_waitwithlittlemodification+*/+for(;;){+/* need _sync, as we might race with another LL/SC in lock()*/+val=atomic_read_sync(&lock->val);++if(!val)/* not locked, we're done */+gotodone;++if(val&_Q_LOCKED_MASK)/* locked, go wait for unlock */+break;++/* not locked, but pending, wait until we observe the lock */+cpu_relax();+}++/*+*anyunlockisgood.Andneednot_sync,as->valissetbytheSCin+*unlock(),anyloadsinlock()mustseethecorrectvalue.+*/+while(atomic_read(&lock->val)&_Q_LOCKED_MASK)+cpu_relax();+done:+smp_mb();+}+EXPORT_SYMBOL(queued_spin_unlock_wait);+#endif
From: Pan Xinhui <hidden> Date: 2016-09-19 05:26:36
Add two corresponding helper functions to support pv-qspinlock.
For normal use, __spin_yield_cpu will confer current vcpu slices to the
target vcpu(say, a lock holder). If target vcpu is not specified or it
is in running state, such conferging to lpar happens or not depends.
Because hcall itself will introduce latency and a little overhead. And
we do NOT want to suffer any latency on some cases, e.g. in interrupt handler.
The second parameter *confer* can indicate such case.
__spin_wake_cpu is simpiler, it will wake up one vcpu regardless of its
current vcpu state.
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/include/asm/spinlock.h | 4 +++
arch/powerpc/lib/locks.c | 59 +++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
@@ -56,9 +56,13 @@/* We only yield to the hypervisor if we are in shared processor mode */#define SHARED_PROCESSOR (lppaca_shared_proc(local_paca->lppaca_ptr))externvoid__spin_yield(arch_spinlock_t*lock);+externvoid__spin_yield_cpu(intcpu,intconfer);+externvoid__spin_wake_cpu(intcpu);externvoid__rw_yield(arch_rwlock_t*lock);#else /* SPLPAR */#define __spin_yield(x) barrier()+#define __spin_yield_cpu(x,y) barrier()+#define __spin_wake_cpu(x) barrier()#define __rw_yield(x) barrier()#define SHARED_PROCESSOR 0#endif
@@ -23,6 +23,65 @@#include<asm/hvcall.h>#include<asm/smp.h>+/*+*conferourslicestoaspecifiedcpuandreturn.Ifitisalreadyrunningor+*cpuis-1,thenwewillcheckconfer.IfconferisNULL,wewillreturn+*otherwiseweconferourslicestolpar.+*/+void__spin_yield_cpu(intcpu,intconfer)+{+unsignedintholder_cpu=cpu,yield_count;++if(cpu==-1)+gotoyield_to_lpar;++BUG_ON(holder_cpu>=nr_cpu_ids);+yield_count=be32_to_cpu(lppaca_of(holder_cpu).yield_count);++/* if cpu is running, confer slices to lpar conditionally*/+if((yield_count&1)==0)+gotoyield_to_lpar;++plpar_hcall_norets(H_CONFER,+get_hard_smp_processor_id(holder_cpu),yield_count);+return;++yield_to_lpar:+if(confer)+plpar_hcall_norets(H_CONFER,-1,0);+}+EXPORT_SYMBOL_GPL(__spin_yield_cpu);++void__spin_wake_cpu(intcpu)+{+unsignedintholder_cpu=cpu;++BUG_ON(holder_cpu>=nr_cpu_ids);+/*+*NOTE:weshouldalwaysdothishcallregardlessof+*theyield_countoftheholder_cpu.+*asthersmightbeacaselikebelow;+*CPU12+*yielded=true+*if(yielded)+*__spin_wake_cpu()+*__spin_yield_cpu()+*+*Sowemightloseawakeifwechecktheyield_countand+*returndirectlyiftheholder_cpuisrunning.+*IOW.doNOTcodelikebelow.+*yield_count=be32_to_cpu(lppaca_of(holder_cpu).yield_count);+*if((yield_count&1)==0)+*return;+*+*aPRODhcallmarksthetarget_cpuproded,whichcausethenextcedeorconfer+*calledonthetarget_cpuinvalid.+*/+plpar_hcall_norets(H_PROD,+get_hard_smp_processor_id(holder_cpu));+}+EXPORT_SYMBOL_GPL(__spin_wake_cpu);+#ifndef CONFIG_QUEUED_SPINLOCKSvoid__spin_yield(arch_spinlock_t*lock){
From: Pan Xinhui <hidden> Date: 2016-09-19 05:26:49
pseries will use qspinlock by default.
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/platforms/pseries/Kconfig | 1 +
1 file changed, 1 insertion(+)
From: Pan Xinhui <hidden> Date: 2016-09-19 05:27:00
The default pv-qspinlock uses qspinlock(native version of pv-qspinlock).
pv_lock initialization should be done in bootstage with irq disabled.
And if we run as a guest with powerKVM/pHyp shared_processor mode,
restore pv_lock_ops callbacks to pv-qspinlock(pv version) which makes
full use of virtualization.
There is a hash table, we store cpu number into it and the key is lock.
So everytime pv_wait can know who is the lock holder by searching the
lock. Also store the lock in a per_cpu struct, and remove it when we own
the lock. Then pv_wait can know which lock we are spinning on. But the
cpu in the hash table might not be the correct lock holder, as for
performace issue, we does not take care of hash conflict.
Also introduce spin_lock_holder, which tells who owns the lock now.
currently the only user is spin_unlock_wait.
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/include/asm/qspinlock.h | 29 +++-
arch/powerpc/include/asm/qspinlock_paravirt.h | 36 +++++
.../powerpc/include/asm/qspinlock_paravirt_types.h | 13 ++
arch/powerpc/kernel/paravirt.c | 153 +++++++++++++++++++++
arch/powerpc/lib/locks.c | 8 +-
arch/powerpc/platforms/pseries/setup.c | 5 +
6 files changed, 241 insertions(+), 3 deletions(-)
create mode 100644 arch/powerpc/include/asm/qspinlock_paravirt.h
create mode 100644 arch/powerpc/include/asm/qspinlock_paravirt_types.h
create mode 100644 arch/powerpc/kernel/paravirt.c
@@ -27,6 +27,33 @@ static inline int queued_spin_is_locked(struct qspinlock *lock)returnatomic_read(&lock->val);}+#ifdef CONFIG_PARAVIRT_SPINLOCKS+#include<asm/qspinlock_paravirt.h>+/*+*trytoknowwhoisthelockholder,howeveritisnotalwaystrue+*Return:+*-1,wedidnotknowthelockholder.+*othervalue,likelyisthelockholder.+*/+externintspin_lock_holder(void*lock);++staticinlinevoidqueued_spin_lock_slowpath(structqspinlock*lock,u32val)+{+pv_queued_spin_lock(lock,val);+}++staticinlinevoidqueued_spin_unlock(structqspinlock*lock)+{+pv_queued_spin_unlock(lock);+}+#else+#define spin_lock_holder(l) (-1)+staticinlinevoidqueued_spin_unlock(structqspinlock*lock)+{+native_queued_spin_unlock(lock);+}+#endif+#include<asm-generic/qspinlock.h>/* we need override it as ppc has io_sync stuff */
@@ -0,0 +1,36 @@+#ifndef CONFIG_PARAVIRT_SPINLOCKS+#error "do not include this file"+#endif++#ifndef _ASM_QSPINLOCK_PARAVIRT_H+#define _ASM_QSPINLOCK_PARAVIRT_H++#include<asm/qspinlock_paravirt_types.h>++externvoidpv_lock_init(void);+externvoidnative_queued_spin_lock_slowpath(structqspinlock*lock,u32val);+externvoid__pv_init_lock_hash(void);+externvoid__pv_queued_spin_lock_slowpath(structqspinlock*lock,u32val);+externvoid__pv_queued_spin_unlock(structqspinlock*lock);++staticinlinevoidpv_queued_spin_lock(structqspinlock*lock,u32val)+{+pv_lock_op.lock(lock,val);+}++staticinlinevoidpv_queued_spin_unlock(structqspinlock*lock)+{+pv_lock_op.unlock(lock);+}++staticinlinevoidpv_wait(u8*ptr,u8val)+{+pv_lock_op.wait(ptr,val);+}++staticinlinevoidpv_kick(intcpu)+{+pv_lock_op.kick(cpu);+}++#endif
@@ -0,0 +1,153 @@+/*+*Thisprogramisfreesoftware;youcanredistributeitand/ormodify+*itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby+*theFreeSoftwareFoundation;eitherversion2oftheLicense,or+*(atyouroption)anylaterversion.+*/++#include<linux/spinlock.h>+#include<linux/smp.h>+#include<linux/hash.h>+#include<linux/bootmem.h>++/* +2 here is to make sure there is not many conflict*/+#define NUM_LOCK_CPU_ENTRY_SHIFT (order_base_2(NR_CPUS) + 2)+#define NUM_LOCK_CPU_ENTRY (1 << NUM_LOCK_CPU_ENTRY_SHIFT)+/* we can only spin on 4 locks at same time on same cpu*/+#define NUM_LOCKS_PER_CPU 4++staticu16*hash_lock_cpu_ptr;++structlocks_on_cpu{+void*l[NUM_LOCKS_PER_CPU];+intcount;+};++staticDEFINE_PER_CPU(structlocks_on_cpu,node);++staticu16*hash(void*l)+{+intval=hash_ptr(l,NUM_LOCK_CPU_ENTRY_SHIFT);++return&hash_lock_cpu_ptr[val];+}++staticvoid__initinit_hash(void)+{+intsize=NUM_LOCK_CPU_ENTRY*sizeof(*hash_lock_cpu_ptr);++hash_lock_cpu_ptr=memblock_virt_alloc(size,0);+memset(hash_lock_cpu_ptr,0,size);+}++#define lock_get_holder(l) \+((int)(*hash(l)-1))++#define lock_set_holder(l) \+(*hash(l)=raw_smp_processor_id()+1)++intspin_lock_holder(void*lock)+{+/* we might run on PowerNV, which has no hash table ptr*/+if(hash_lock_cpu_ptr)+returnlock_get_holder(lock);+return-1;+}+EXPORT_SYMBOL(spin_lock_holder);++staticvoid*this_cpu_lock(void)+{+structlocks_on_cpu*this_node=this_cpu_ptr(&node);+inti=this_node->count-1;++returnthis_node->l[i];+}++staticvoidcpu_save_lock(void*l)+{+structlocks_on_cpu*this_node=this_cpu_ptr(&node);+inti=this_node->count++;++this_node->l[i]=l;+}++staticvoidcpu_remove_lock(void*l)+{+__this_cpu_dec(node.count);+}++staticvoid__native_queued_spin_unlock(structqspinlock*lock)+{+native_queued_spin_unlock(lock);+}++staticvoid__pv_lock(structqspinlock*lock,u32val)+{+/*+*savethelockwearespinningon+*pv_waitneedknowthislock+*/+cpu_save_lock(lock);++__pv_queued_spin_lock_slowpath(lock,val);++/* as we win the lock, remove it*/+cpu_remove_lock(lock);++/*+*letotherspinnerknowwhoisthelockholder+*wedoesnotneedtounsetlockholderinunlock()+*/+lock_set_holder(lock);+}++staticvoid__pv_wait(u8*ptr,u8val)+{+void*l=this_cpu_lock();+intcpu;+intalways_confer=!in_interrupt();++while(READ_ONCE(*ptr)==val){+HMT_low();+/*+*thelockmightbeunlockedonceandlockedagain+*/+cpu=lock_get_holder(l);++/*+*thedefaultbehaviorof__spin_yield_cpuisyielding+*ourcpuslicestotargetvcpuorlpar(pHyporKVM).+*considerthelatencyofhcallitselfandthepriorityof+*currenttask,wecandoaoptimisation.+*IOW,ifweareininterrupt,andthetargetvcpuisrunning+*wedonotyieldourselftolpar.+*/+__spin_yield_cpu(cpu,always_confer);+}+HMT_medium();+}++staticvoid__pv_kick(intcpu)+{+__spin_wake_cpu(cpu);+}++structpv_lock_opspv_lock_op={+.lock=native_queued_spin_lock_slowpath,+.unlock=__native_queued_spin_unlock,+.wait=NULL,+.kick=NULL,+};+EXPORT_SYMBOL(pv_lock_op);++void__initpv_lock_init(void)+{+if(SHARED_PROCESSOR){+init_hash();+__pv_init_lock_hash();+pv_lock_op.lock=__pv_lock;+pv_lock_op.unlock=__pv_queued_spin_unlock;+pv_lock_op.wait=__pv_wait;+pv_lock_op.kick=__pv_kick;+}+}
From: Pan Xinhui <hidden> Date: 2016-09-19 05:27:13
pSeries run as a guest and might need pv-qspinlock.
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/kernel/Makefile | 1 +
arch/powerpc/platforms/pseries/Kconfig | 8 ++++++++
2 files changed, 9 insertions(+)
@@ -128,3 +128,11 @@ config HV_PERF_CTRSsystems.24x7isavailableonPower8systems.Ifunsure,selectY.++configPARAVIRT_SPINLOCKS+bool"Paravirtialization support for qspinlock"+depends onPPC_SPLPAR&&QUEUED_SPINLOCKS+defaulty+help+Ifplatformsupportsvirtualization,forexamplePowerVM,thisoption+canletguesthaveabetterperformace.
From: Pan Xinhui <hidden> Date: 2016-09-19 05:27:21
cmpxchg_release() is more lighweight than cmpxchg() on some archs(e.g.
PPC), moreover, in __pv_queued_spin_unlock() we only needs a RELEASE in
the fast path(pairing with *_try_lock() or *_lock()). And the slow path
has smp_store_release too. So it's safe to use cmpxchg_release here.
Suggested-by: Boqun Feng <redacted>
Signed-off-by: Pan Xinhui <redacted>
---
kernel/locking/qspinlock_paravirt.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: kbuild test robot <hidden> Date: 2016-09-19 08:42:35
Hi Pan,
[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.8-rc7 next-20160916]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]
url: https://github.com/0day-ci/linux/commits/Pan-Xinhui/Implement-qspinlock-pv-qspinlock-on-ppc/20160919-133130
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
In file included from include/uapi/linux/stddef.h:1:0,
from include/linux/stddef.h:4,
from include/uapi/linux/posix_types.h:4,
from include/uapi/linux/types.h:13,
from include/linux/types.h:5,
from include/linux/smp.h:10,
from kernel/locking/qspinlock.c:25:
In function '__xchg_relaxed',
inlined from 'queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:184:14:
quoted
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_113' declared with attribute error: Unsupported size for __xchg_local
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:113:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __xchg_local");
^~~~~~~~~~~~~~~~
vim +/__compiletime_assert_113 +491 include/linux/compiler.h
9a8ab1c3 Daniel Santos 2013-02-21 475 __compiletime_error_fallback(__cond); \
9a8ab1c3 Daniel Santos 2013-02-21 476 } while (0)
9a8ab1c3 Daniel Santos 2013-02-21 477
9a8ab1c3 Daniel Santos 2013-02-21 478 #define _compiletime_assert(condition, msg, prefix, suffix) \
9a8ab1c3 Daniel Santos 2013-02-21 479 __compiletime_assert(condition, msg, prefix, suffix)
9a8ab1c3 Daniel Santos 2013-02-21 480
9a8ab1c3 Daniel Santos 2013-02-21 481 /**
9a8ab1c3 Daniel Santos 2013-02-21 482 * compiletime_assert - break build and emit msg if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 483 * @condition: a compile-time constant condition to check
9a8ab1c3 Daniel Santos 2013-02-21 484 * @msg: a message to emit if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 485 *
9a8ab1c3 Daniel Santos 2013-02-21 486 * In tradition of POSIX assert, this macro will break the build if the
9a8ab1c3 Daniel Santos 2013-02-21 487 * supplied condition is *false*, emitting the supplied error message if the
9a8ab1c3 Daniel Santos 2013-02-21 488 * compiler has support to do so.
9a8ab1c3 Daniel Santos 2013-02-21 489 */
9a8ab1c3 Daniel Santos 2013-02-21 490 #define compiletime_assert(condition, msg) \
9a8ab1c3 Daniel Santos 2013-02-21 @491 _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
9a8ab1c3 Daniel Santos 2013-02-21 492
47933ad4 Peter Zijlstra 2013-11-06 493 #define compiletime_assert_atomic_type(t) \
47933ad4 Peter Zijlstra 2013-11-06 494 compiletime_assert(__native_word(t), \
47933ad4 Peter Zijlstra 2013-11-06 495 "Need native word sized stores/loads for atomicity.")
47933ad4 Peter Zijlstra 2013-11-06 496
9c3cdc1f Linus Torvalds 2008-05-10 497 /*
9c3cdc1f Linus Torvalds 2008-05-10 498 * Prevent the compiler from merging or refetching accesses. The compiler
9c3cdc1f Linus Torvalds 2008-05-10 499 * is also forbidden from reordering successive instances of ACCESS_ONCE(),
:::::: The code at line 491 was first introduced by commit
:::::: 9a8ab1c39970a4938a72d94e6fd13be88a797590 bug.h, compiler.h: introduce compiletime_assert & BUILD_BUG_ON_MSG
:::::: TO: Daniel Santos [off-list ref]
:::::: CC: Linus Torvalds [off-list ref]
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
From: kbuild test robot <hidden> Date: 2016-09-19 08:59:39
Hi Pan,
[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.8-rc7 next-20160916]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]
url: https://github.com/0day-ci/linux/commits/Pan-Xinhui/Implement-qspinlock-pv-qspinlock-on-ppc/20160919-133130
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_wait_node' at kernel/locking/qspinlock_paravirt.h:328:3,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:538:3:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_wait_head_or_lock' at kernel/locking/qspinlock_paravirt.h:109:10,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:573:5:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__xchg_relaxed',
inlined from 'pv_wait_head_or_lock' at kernel/locking/qspinlock_paravirt.h:442:8,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:573:5:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_113' declared with attribute error: Unsupported size for __xchg_local
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:113:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __xchg_local");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_kick_node' at kernel/locking/qspinlock_paravirt.h:366:6,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:616:2:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__xchg_relaxed',
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:184:14:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_113' declared with attribute error: Unsupported size for __xchg_local
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:113:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __xchg_local");
^~~~~~~~~~~~~~~~
In function '__cmpxchg_relaxed',
inlined from '__pv_queued_spin_unlock' at kernel/locking/qspinlock_paravirt.h:547:11:
quoted
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_358' declared with attribute error: Unsupported size for __cmpxchg_relaxed
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:358:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg_relaxed");
^~~~~~~~~~~~~~~~
vim +/__compiletime_assert_358 +491 include/linux/compiler.h
9a8ab1c3 Daniel Santos 2013-02-21 475 __compiletime_error_fallback(__cond); \
9a8ab1c3 Daniel Santos 2013-02-21 476 } while (0)
9a8ab1c3 Daniel Santos 2013-02-21 477
9a8ab1c3 Daniel Santos 2013-02-21 478 #define _compiletime_assert(condition, msg, prefix, suffix) \
9a8ab1c3 Daniel Santos 2013-02-21 479 __compiletime_assert(condition, msg, prefix, suffix)
9a8ab1c3 Daniel Santos 2013-02-21 480
9a8ab1c3 Daniel Santos 2013-02-21 481 /**
9a8ab1c3 Daniel Santos 2013-02-21 482 * compiletime_assert - break build and emit msg if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 483 * @condition: a compile-time constant condition to check
9a8ab1c3 Daniel Santos 2013-02-21 484 * @msg: a message to emit if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 485 *
9a8ab1c3 Daniel Santos 2013-02-21 486 * In tradition of POSIX assert, this macro will break the build if the
9a8ab1c3 Daniel Santos 2013-02-21 487 * supplied condition is *false*, emitting the supplied error message if the
9a8ab1c3 Daniel Santos 2013-02-21 488 * compiler has support to do so.
9a8ab1c3 Daniel Santos 2013-02-21 489 */
9a8ab1c3 Daniel Santos 2013-02-21 490 #define compiletime_assert(condition, msg) \
9a8ab1c3 Daniel Santos 2013-02-21 @491 _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
9a8ab1c3 Daniel Santos 2013-02-21 492
47933ad4 Peter Zijlstra 2013-11-06 493 #define compiletime_assert_atomic_type(t) \
47933ad4 Peter Zijlstra 2013-11-06 494 compiletime_assert(__native_word(t), \
47933ad4 Peter Zijlstra 2013-11-06 495 "Need native word sized stores/loads for atomicity.")
47933ad4 Peter Zijlstra 2013-11-06 496
9c3cdc1f Linus Torvalds 2008-05-10 497 /*
9c3cdc1f Linus Torvalds 2008-05-10 498 * Prevent the compiler from merging or refetching accesses. The compiler
9c3cdc1f Linus Torvalds 2008-05-10 499 * is also forbidden from reordering successive instances of ACCESS_ONCE(),
:::::: The code at line 491 was first introduced by commit
:::::: 9a8ab1c39970a4938a72d94e6fd13be88a797590 bug.h, compiler.h: introduce compiletime_assert & BUILD_BUG_ON_MSG
:::::: TO: Daniel Santos [off-list ref]
:::::: CC: Linus Torvalds [off-list ref]
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
hi, all
ok, this patch set depends on
https://patchwork.kernel.org/patch/8953981/ [V4] powerpc: Implement {cmp}xchg for u8 and u16
sorry.
On 2016年09月19日 16:58, kbuild test robot wrote:
Hi Pan,
[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.8-rc7 next-20160916]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
[Suggest to use git(>=2.9.0) format-patch --base=<commit> (or --base=auto for convenience) to record what (public, well-known) commit your patch series was built on]
[Check https://git-scm.com/docs/git-format-patch for more information]
url: https://github.com/0day-ci/linux/commits/Pan-Xinhui/Implement-qspinlock-pv-qspinlock-on-ppc/20160919-133130
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-allyesconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_wait_node' at kernel/locking/qspinlock_paravirt.h:328:3,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:538:3:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_wait_head_or_lock' at kernel/locking/qspinlock_paravirt.h:109:10,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:573:5:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__xchg_relaxed',
inlined from 'pv_wait_head_or_lock' at kernel/locking/qspinlock_paravirt.h:442:8,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:573:5:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_113' declared with attribute error: Unsupported size for __xchg_local
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:113:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __xchg_local");
^~~~~~~~~~~~~~~~
In function '__cmpxchg',
inlined from 'pv_kick_node' at kernel/locking/qspinlock_paravirt.h:366:6,
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:616:2:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_326' declared with attribute error: Unsupported size for __cmpxchg
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:326:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg");
^~~~~~~~~~~~~~~~
In function '__xchg_relaxed',
inlined from '__pv_queued_spin_lock_slowpath' at kernel/locking/qspinlock.c:184:14:
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_113' declared with attribute error: Unsupported size for __xchg_local
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:113:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __xchg_local");
^~~~~~~~~~~~~~~~
In function '__cmpxchg_relaxed',
inlined from '__pv_queued_spin_unlock' at kernel/locking/qspinlock_paravirt.h:547:11:
quoted
quoted
include/linux/compiler.h:491:38: error: call to '__compiletime_assert_358' declared with attribute error: Unsupported size for __cmpxchg_relaxed
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^
include/linux/compiler.h:474:4: note: in definition of macro '__compiletime_assert'
prefix ## suffix(); \
^~~~~~
include/linux/compiler.h:491:2: note: in expansion of macro '_compiletime_assert'
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
^~~~~~~~~~~~~~~~~~~
include/linux/bug.h:51:37: note: in expansion of macro 'compiletime_assert'
#define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
^~~~~~~~~~~~~~~~~~
arch/powerpc/include/asm/cmpxchg.h:358:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
BUILD_BUG_ON_MSG(1, "Unsupported size for __cmpxchg_relaxed");
^~~~~~~~~~~~~~~~
vim +/__compiletime_assert_358 +491 include/linux/compiler.h
9a8ab1c3 Daniel Santos 2013-02-21 475 __compiletime_error_fallback(__cond); \
9a8ab1c3 Daniel Santos 2013-02-21 476 } while (0)
9a8ab1c3 Daniel Santos 2013-02-21 477
9a8ab1c3 Daniel Santos 2013-02-21 478 #define _compiletime_assert(condition, msg, prefix, suffix) \
9a8ab1c3 Daniel Santos 2013-02-21 479 __compiletime_assert(condition, msg, prefix, suffix)
9a8ab1c3 Daniel Santos 2013-02-21 480
9a8ab1c3 Daniel Santos 2013-02-21 481 /**
9a8ab1c3 Daniel Santos 2013-02-21 482 * compiletime_assert - break build and emit msg if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 483 * @condition: a compile-time constant condition to check
9a8ab1c3 Daniel Santos 2013-02-21 484 * @msg: a message to emit if condition is false
9a8ab1c3 Daniel Santos 2013-02-21 485 *
9a8ab1c3 Daniel Santos 2013-02-21 486 * In tradition of POSIX assert, this macro will break the build if the
9a8ab1c3 Daniel Santos 2013-02-21 487 * supplied condition is *false*, emitting the supplied error message if the
9a8ab1c3 Daniel Santos 2013-02-21 488 * compiler has support to do so.
9a8ab1c3 Daniel Santos 2013-02-21 489 */
9a8ab1c3 Daniel Santos 2013-02-21 490 #define compiletime_assert(condition, msg) \
9a8ab1c3 Daniel Santos 2013-02-21 @491 _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
9a8ab1c3 Daniel Santos 2013-02-21 492
47933ad4 Peter Zijlstra 2013-11-06 493 #define compiletime_assert_atomic_type(t) \
47933ad4 Peter Zijlstra 2013-11-06 494 compiletime_assert(__native_word(t), \
47933ad4 Peter Zijlstra 2013-11-06 495 "Need native word sized stores/loads for atomicity.")
47933ad4 Peter Zijlstra 2013-11-06 496
9c3cdc1f Linus Torvalds 2008-05-10 497 /*
9c3cdc1f Linus Torvalds 2008-05-10 498 * Prevent the compiler from merging or refetching accesses. The compiler
9c3cdc1f Linus Torvalds 2008-05-10 499 * is also forbidden from reordering successive instances of ACCESS_ONCE(),
:::::: The code at line 491 was first introduced by commit
:::::: 9a8ab1c39970a4938a72d94e6fd13be88a797590 bug.h, compiler.h: introduce compiletime_assert & BUILD_BUG_ON_MSG
:::::: TO: Daniel Santos [off-list ref]
:::::: CC: Linus Torvalds [off-list ref]
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
AKA: https://patchwork.ozlabs.org/patch/615480/
Sorry I saw the discussion on that and thought there'd be a new version.
But now I read the whole thread it looks like it was OK in the end.
I'll try and get it merged.
cheers
Hi Xinhui,
On Mon, Sep 19, 2016 at 05:23:55AM -0400, Pan Xinhui wrote:
quoted hunk
Add two corresponding helper functions to support pv-qspinlock.
For normal use, __spin_yield_cpu will confer current vcpu slices to the
target vcpu(say, a lock holder). If target vcpu is not specified or it
is in running state, such conferging to lpar happens or not depends.
Because hcall itself will introduce latency and a little overhead. And
we do NOT want to suffer any latency on some cases, e.g. in interrupt handler.
The second parameter *confer* can indicate such case.
__spin_wake_cpu is simpiler, it will wake up one vcpu regardless of its
current vcpu state.
Signed-off-by: Pan Xinhui <redacted>
---
arch/powerpc/include/asm/spinlock.h | 4 +++
arch/powerpc/lib/locks.c | 59 +++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
@@ -56,9 +56,13 @@/* We only yield to the hypervisor if we are in shared processor mode */#define SHARED_PROCESSOR (lppaca_shared_proc(local_paca->lppaca_ptr))externvoid__spin_yield(arch_spinlock_t*lock);+externvoid__spin_yield_cpu(intcpu,intconfer);+externvoid__spin_wake_cpu(intcpu);externvoid__rw_yield(arch_rwlock_t*lock);#else /* SPLPAR */#define __spin_yield(x) barrier()+#define __spin_yield_cpu(x,y) barrier()+#define __spin_wake_cpu(x) barrier()#define __rw_yield(x) barrier()#define SHARED_PROCESSOR 0#endif
+ if (cpu == -1)
+ goto yield_to_lpar;
+
+ BUG_ON(holder_cpu >= nr_cpu_ids);
+ yield_count = be32_to_cpu(lppaca_of(holder_cpu).yield_count);
+
+ /* if cpu is running, confer slices to lpar conditionally*/
+ if ((yield_count & 1) == 0)
+ goto yield_to_lpar;
+
+ plpar_hcall_norets(H_CONFER,
+ get_hard_smp_processor_id(holder_cpu), yield_count);
+ return;
+
+yield_to_lpar:
+ if (confer)
+ plpar_hcall_norets(H_CONFER, -1, 0);
+}
+EXPORT_SYMBOL_GPL(__spin_yield_cpu);
+
+void __spin_wake_cpu(int cpu)
+{
+ unsigned int holder_cpu = cpu;
+
Ditto.
Regards,
Boqun
+ BUG_ON(holder_cpu >= nr_cpu_ids);
+ /*
+ * NOTE: we should always do this hcall regardless of
+ * the yield_count of the holder_cpu.
+ * as thers might be a case like below;
+ * CPU 1 2
+ * yielded = true
+ * if (yielded)
+ * __spin_wake_cpu()
+ * __spin_yield_cpu()
+ *
+ * So we might lose a wake if we check the yield_count and
+ * return directly if the holder_cpu is running.
+ * IOW. do NOT code like below.
+ * yield_count = be32_to_cpu(lppaca_of(holder_cpu).yield_count);
+ * if ((yield_count & 1) == 0)
+ * return;
+ *
+ * a PROD hcall marks the target_cpu proded, which cause the next cede or confer
+ * called on the target_cpu invalid.
+ */
+ plpar_hcall_norets(H_PROD,
+ get_hard_smp_processor_id(holder_cpu));
+}
+EXPORT_SYMBOL_GPL(__spin_wake_cpu);
+
#ifndef CONFIG_QUEUED_SPINLOCKS
void __spin_yield(arch_spinlock_t *lock)
{
--
2.4.11