xref: /kvmtool/include/kvm/brlock.h (revision 20b65266ce86e6253eac5813e285e3c30713fe2a)
10b907ed2SSasha Levin #ifndef KVM__BRLOCK_H
20b907ed2SSasha Levin #define KVM__BRLOCK_H
30b907ed2SSasha Levin 
40b907ed2SSasha Levin #include "kvm/kvm.h"
50b907ed2SSasha Levin #include "kvm/barrier.h"
60b907ed2SSasha Levin 
70b907ed2SSasha Levin /*
80b907ed2SSasha Levin  * brlock is a lock which is very cheap for reads, but very expensive
90b907ed2SSasha Levin  * for writes.
100b907ed2SSasha Levin  * This lock will be used when updates are very rare and reads are common.
110b907ed2SSasha Levin  * This lock is currently implemented by stopping the guest while
120b907ed2SSasha Levin  * performing the updates. We assume that the only threads whichread from
130b907ed2SSasha Levin  * the locked data are VCPU threads, and the only writer isn't a VCPU thread.
140b907ed2SSasha Levin  */
150b907ed2SSasha Levin 
160b907ed2SSasha Levin #ifndef barrier
170b907ed2SSasha Levin #define barrier()		__asm__ __volatile__("": : :"memory")
180b907ed2SSasha Levin #endif
190b907ed2SSasha Levin 
2051247815SSasha Levin #ifdef KVM_BRLOCK_DEBUG
2151247815SSasha Levin 
2251247815SSasha Levin #include "kvm/rwsem.h"
2351247815SSasha Levin 
24*20b65266SJulien Thierry #define br_read_lock(kvm)	down_read(&(kvm)->brlock_sem);
25*20b65266SJulien Thierry #define br_read_unlock(kvm)	up_read(&(kvm)->brlock_sem);
2651247815SSasha Levin 
27*20b65266SJulien Thierry #define br_write_lock(kvm)	down_write(&(kvm)->brlock_sem);
28*20b65266SJulien Thierry #define br_write_unlock(kvm)	up_write(&(kvm)->brlock_sem);
2951247815SSasha Levin 
3051247815SSasha Levin #else
3151247815SSasha Levin 
324346fd8fSSasha Levin #define br_read_lock(kvm)	barrier()
334346fd8fSSasha Levin #define br_read_unlock(kvm)	barrier()
340b907ed2SSasha Levin 
354346fd8fSSasha Levin #define br_write_lock(kvm)	kvm__pause(kvm)
364346fd8fSSasha Levin #define br_write_unlock(kvm)	kvm__continue(kvm)
370b907ed2SSasha Levin #endif
3851247815SSasha Levin 
3951247815SSasha Levin #endif
40