Avi Kivity wrote: > 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. > You're logic seems reasonable to me. I will defer to David, since he brought up the issue with the similar logic originally. Kind Regards, -Greg
Attachment:
signature.asc
Description: OpenPGP digital signature