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