lkml.org 
[lkml]   [2007]   [Dec]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 05/18] kvm: nopage
    Convert KVM from nopage to fault.

    Signed-off-by: Nick Piggin <npiggin@suse.de>
    Cc: kvm-devel@lists.sourceforge.net
    Cc: avi@qumranet.com
    Cc: linux-kernel@vger.kernel.org
    ---
    drivers/kvm/kvm_main.c | 38 +++++++++++++-------------------------
    1 file changed, 13 insertions(+), 25 deletions(-)

    Index: linux-2.6/drivers/kvm/kvm_main.c
    ===================================================================
    --- linux-2.6.orig/drivers/kvm/kvm_main.c
    +++ linux-2.6/drivers/kvm/kvm_main.c
    @@ -2533,30 +2533,24 @@ static int kvm_vcpu_ioctl_debug_guest(st
    return r;
    }

    -static struct page *kvm_vcpu_nopage(struct vm_area_struct *vma,
    - unsigned long address,
    - int *type)
    +static int kvm_vcpu_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
    {
    struct kvm_vcpu *vcpu = vma->vm_file->private_data;
    - unsigned long pgoff;
    struct page *page;

    - pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
    - if (pgoff == 0)
    + if (vmf->pgoff == 0)
    page = virt_to_page(vcpu->run);
    - else if (pgoff == KVM_PIO_PAGE_OFFSET)
    + else if (vmf->pgoff == KVM_PIO_PAGE_OFFSET)
    page = virt_to_page(vcpu->pio_data);
    else
    - return NOPAGE_SIGBUS;
    + return VM_FAULT_SIGBUS;
    get_page(page);
    - if (type != NULL)
    - *type = VM_FAULT_MINOR;
    -
    - return page;
    + vmf->page = page;
    + return 0;
    }

    static struct vm_operations_struct kvm_vcpu_vm_ops = {
    - .nopage = kvm_vcpu_nopage,
    + .fault = kvm_vcpu_fault,
    };

    static int kvm_vcpu_mmap(struct file *file, struct vm_area_struct *vma)
    @@ -3111,27 +3105,21 @@ out:
    return r;
    }

    -static struct page *kvm_vm_nopage(struct vm_area_struct *vma,
    - unsigned long address,
    - int *type)
    +static int kvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
    {
    struct kvm *kvm = vma->vm_file->private_data;
    - unsigned long pgoff;
    struct page *page;

    - pgoff = ((address - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
    - page = gfn_to_page(kvm, pgoff);
    + page = gfn_to_page(kvm, vmf->pgoff);
    if (!page)
    - return NOPAGE_SIGBUS;
    + return VM_FAULT_SIGBUS;
    get_page(page);
    - if (type != NULL)
    - *type = VM_FAULT_MINOR;
    -
    - return page;
    + vmf->page = page;
    + return 0;
    }

    static struct vm_operations_struct kvm_vm_vm_ops = {
    - .nopage = kvm_vm_nopage,
    + .fault = kvm_vm_fault,
    };

    static int kvm_vm_mmap(struct file *file, struct vm_area_struct *vma)
    --



    \
     
     \ /
      Last update: 2007-12-05 09:01    [W:4.110 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site