From mboxrd@z Thu Jan 1 00:00:00 1970 From: Avi Kivity Subject: Re: [patch 02/13] KVM: MMU: switch to get_user_pages_fast Date: Mon, 08 Sep 2008 17:53:00 +0300 Message-ID: <48C53C4C.6040208@qumranet.com> References: <20080906184822.560099087@localhost.localdomain> <20080906192430.598327536@localhost.localdomain> <48C394B5.20706@qumranet.com> <20080907204415.GA14479@dmt.cnet> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: kvm@vger.kernel.org, Andrea Arcangeli To: Marcelo Tosatti Return-path: Received: from il.qumranet.com ([212.179.150.194]:25564 "EHLO il.qumranet.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750820AbYIHOxC (ORCPT ); Mon, 8 Sep 2008 10:53:02 -0400 In-Reply-To: <20080907204415.GA14479@dmt.cnet> Sender: kvm-owner@vger.kernel.org List-ID: Marcelo Tosatti wrote: >> >>> static int kvm_vm_fault(struct vm_area_struct *vma, struct vm_fault >>> *vmf) >>> { >>> + struct page *page[1]; >>> + unsigned long addr; >>> + int npages; >>> + gfn_t gfn = vmf->pgoff; >>> struct kvm *kvm = vma->vm_file->private_data; >>> - struct page *page; >>> - if (!kvm_is_visible_gfn(kvm, vmf->pgoff)) >>> + addr = gfn_to_hva(kvm, gfn); >>> + if (kvm_is_error_hva(addr)) >>> return VM_FAULT_SIGBUS; >>> - page = gfn_to_page(kvm, vmf->pgoff); >>> - if (is_error_page(page)) { >>> - kvm_release_page_clean(page); >>> + >>> + npages = get_user_pages(current, current->mm, addr, 1, 1, 0, page, >>> + NULL); >>> + if (unlikely(npages != 1)) >>> return VM_FAULT_SIGBUS; >>> - } >>> - vmf->page = page; >>> + >>> + vmf->page = page[0]; >>> return 0; >>> } >>> >>> >> Why this change? >> > > Because get_user_pages_fast grabs mmap_sem if necessary, but ->vm_fault > already holds it. > > Right. I think it merits its own patch (and changelog entry) since it differs in spirit from the rest. -- error compiling committee.c: too many arguments to function