On Thu, Jul 08, 2010 at 12:59:20PM -0300, Marcelo Tosatti wrote: > > +static int apf_put_user(struct kvm_vcpu *vcpu, u32 val) > > +{ > > + if (unlikely(vcpu->arch.apf_memslot_ver != > > + vcpu->kvm->memslot_version)) { > > + u64 gpa = vcpu->arch.apf_msr_val & ~0x3f; > > + unsigned long addr; > > + int offset = offset_in_page(gpa); > > + > > + addr = gfn_to_hva(vcpu->kvm, gpa >> PAGE_SHIFT); > > + vcpu->arch.apf_data = (u32 __user*)(addr + offset); > > + if (kvm_is_error_hva(addr)) { > > + vcpu->arch.apf_data = NULL; > > + return -EFAULT; > > + } > > + } > > + > > + return put_user(val, vcpu->arch.apf_data); > > +} > > Why not use kvm_write_guest? Because I want to cache gfn_to_hva() translation, so this code tracks memslot changes and does translation only when needed (almost never). > > > +int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, gfn_t gfn, > > + struct kvm_arch_async_pf *arch) > > +{ > > + struct kvm_async_pf *work; > > + > > + if (vcpu->async_pf_queued >= ASYNC_PF_PER_VCPU) > > + return 0; > > + > > + /* setup slow work */ > > + > > + /* do alloc atomic since if we are going to sleep anyway we > > + may as well sleep faulting in page */ > > + work = kmem_cache_zalloc(async_pf_cache, GFP_ATOMIC); > > + if (!work) > > + return 0; > > GFP_KERNEL is fine for this context. But it can sleep, no? The comment explains why I don't want to sleep here. -- Gleb. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>