Il 12/04/2013 10:38, Stefan Hajnoczi ha scritto: >> > Yes, protect. Supposed we have HostMem A, and it will become B. Then >> > hostmem_lookup will either see A or B. If it see A, it should use A >> > refcnt agaist hostmem_listener_commit to drop A. This refcnt has no >> > relation with mr's object's refcnt. > My question is why you are accessing cur_hostmem outside hostmem_lock > but then assigning it inside the lock on the next line... > >>>> > >> + cur_hostmem = next_hostmem; > ...here. > > If you want an atomic exchange then tmp = cur_hostmem should be inside > the lock.
It will work because readers will grab either the hostmem_lock or the BQL, while writers will grab both. A kind of local/global lock, but I'm not sure it was intentional. :) It's simpler to just move the read inside the lock. Paolo