msrpm[offset] = tmp;
 }
 
-static void svm_vcpu_init_msrpm(u32 *msrpm)
+static u32 *svm_vcpu_init_msrpm(void)
 {
        int i;
+       u32 *msrpm;
+       struct page *pages = alloc_pages(GFP_KERNEL_ACCOUNT, MSRPM_ALLOC_ORDER);
+
+       if (!pages)
+               return NULL;
 
+       msrpm = page_address(pages);
        memset(msrpm, 0xff, PAGE_SIZE * (1 << MSRPM_ALLOC_ORDER));
 
        for (i = 0; direct_access_msrs[i].index != MSR_INVALID; i++) {
                if (!direct_access_msrs[i].always)
                        continue;
-
                set_msr_interception(msrpm, direct_access_msrs[i].index, 1, 1);
        }
+       return msrpm;
+}
+
+static void svm_vcpu_free_msrpm(u32 *msrpm)
+{
+       __free_pages(virt_to_page(msrpm), MSRPM_ALLOC_ORDER);
 }
 
 static void add_msr_offset(u32 offset)
 {
        struct vcpu_svm *svm;
        struct page *vmcb_page;
-       struct page *msrpm_pages;
        struct page *hsave_page;
-       struct page *nested_msrpm_pages;
        int err;
 
        BUILD_BUG_ON(offsetof(struct vcpu_svm, vcpu) != 0);
        if (!vmcb_page)
                goto out;
 
-       msrpm_pages = alloc_pages(GFP_KERNEL_ACCOUNT, MSRPM_ALLOC_ORDER);
-       if (!msrpm_pages)
-               goto free_page1;
-
-       nested_msrpm_pages = alloc_pages(GFP_KERNEL_ACCOUNT, MSRPM_ALLOC_ORDER);
-       if (!nested_msrpm_pages)
-               goto free_page2;
-
        hsave_page = alloc_page(GFP_KERNEL_ACCOUNT);
        if (!hsave_page)
-               goto free_page3;
+               goto free_page1;
 
        err = avic_init_vcpu(svm);
        if (err)
-               goto free_page4;
+               goto free_page2;
 
        /* We initialize this flag to true to make sure that the is_running
         * bit would be set the first time the vcpu is loaded.
        svm->nested.hsave = page_address(hsave_page);
        clear_page(svm->nested.hsave);
 
-       svm->msrpm = page_address(msrpm_pages);
-       svm_vcpu_init_msrpm(svm->msrpm);
+       svm->msrpm = svm_vcpu_init_msrpm();
+       if (!svm->msrpm)
+               goto free_page2;
 
-       svm->nested.msrpm = page_address(nested_msrpm_pages);
-       svm_vcpu_init_msrpm(svm->nested.msrpm);
+       svm->nested.msrpm = svm_vcpu_init_msrpm();
+       if (!svm->nested.msrpm)
+               goto free_page3;
 
        svm->vmcb = page_address(vmcb_page);
        clear_page(svm->vmcb);
 
        return 0;
 
-free_page4:
-       __free_page(hsave_page);
 free_page3:
-       __free_pages(nested_msrpm_pages, MSRPM_ALLOC_ORDER);
+       svm_vcpu_free_msrpm(svm->msrpm);
 free_page2:
-       __free_pages(msrpm_pages, MSRPM_ALLOC_ORDER);
+       __free_page(hsave_page);
 free_page1:
        __free_page(vmcb_page);
 out: