Messages in this thread | | | Date | Tue, 06 Oct 2009 18:23:42 +0200 | From | Avi Kivity <> | Subject | Re: [PATCH v2 2/4] KVM: introduce "xinterface" API for external interaction with guests |
| |
On 10/06/2009 04:22 PM, Gregory Haskins wrote: >>>>>> + >>>>>> +static inline void >>>>>> +_kvm_xinterface_release(struct kref *kref) >>>>>> +{ >>>>>> + struct kvm_xinterface *intf; >>>>>> + struct module *owner; >>>>>> + >>>>>> + intf = container_of(kref, struct kvm_xinterface, kref); >>>>>> + >>>>>> + owner = intf->owner; >>>>>> + rmb(); >>>>>> >>>>>> >>>>>> >>>>> Why rmb? >>>>> >>>>> >>>> the intf->ops->release() line may invalidate the intf pointer, so we >>>> want to ensure that the read completes before the release() is called. >>>> >>>> TBH: I'm not 100% its needed, but I was being conservative. >>>> >>>> >>> rmb()s are only needed if an external agent can issue writes, otherwise >>> you'd need one after every statement. >>> >> I was following lessons learned here: >> >> http://lkml.org/lkml/2009/7/7/175 >> >> Perhaps mb() or barrier() are more appropriate than rmb()? I'm CC'ing >> David Howells in case he has more insight. >> > BTW: In case it is not clear, the rationale as I understand it is we > worry about the case where one cpu reorders the read to be after the > ->release(), and another cpu might grab the memory that was kfree()'d > within the ->release() and scribble something else on it before the read > completes. > > I know rmb() typically needs to be paired with wmb() to be correct, so > you are probably right to say that the rmb() itself is not appropriate. > This problem in general makes my head hurt, which is why I said I am > not 100% sure of what is required. As David mentions, perhaps > "smp_mb()" is more appropriate for this application. I also speculate > barrier() may be all that we need. >
barrier() is the operation for a compiler barrier. But it's unneeded here - unless the compiler can prove that ->release(intf) will not modify intf->owner it is not allowed to move the access afterwards. An indirect function call is generally a barrier() since the compiler can't assume memory has not been modified.
-- error compiling committee.c: too many arguments to function
| |