8

यह मेरा मॉड्यूल है dequeue_huge_page_vma() और alloc_buddy_huge_page() का उपयोग करके एक विशाल पृष्ठ आवंटित करना। उन्हें वीएमए स्वतंत्र बनाने के लिए, मुझे __get_vm_area_node() से vm क्षेत्र उपलब्ध है, और फिर इसका वर्चुअल पता प्राप्त करें। मैं एक 2MB पेज आवंटित करना चाहते हैं, हालांकि, गिरी का कहना है:मेरा मॉड्यूल कर्नेल पेजिंग अनुरोध को संभालने में असमर्थ क्यों है?

[ 84.944634] BUG: unable to handle kernel paging request at ffffc90013d02000 
[ 84.944641] IP: [<ffffffffa0ac9063>] vma_null_test+0x63/0xa3 [vma_null_test] 
[ 84.944650] PGD bd019067 PUD bd01a067 PMD b35c0067 PTE 0 
[ 84.944657] Oops: 0000 [#1] SMP 

मेरे कोड:

/* 
* vma_null_test.c - Cindy: to test if vma can be set to NULL in alloc_huge_page() 
*/ 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/hugetlb.h> 
#include <linux/mm.h> 
#include <linux/list.h> 
#include <asm/page.h> 
#include <linux/nodemask.h> 
#include <linux/gfp.h> 
#include <linux/mm_types.h> 
#include <asm-generic/pgtable.h> 
#include <linux/err.h> 
#include <linux/vmalloc.h> 
#define TWO_MB 0x200000 

struct hstate *h; 

struct vm_struct *__get_vm_area_node(unsigned long size, 
      unsigned long align, unsigned long flags, unsigned long start, 
      unsigned long end, int node, gfp_t gfp_mask, void *caller); 

struct page *dequeue_huge_page_vma(struct hstate *,struct vm_area_struct *, 
      unsigned long, int); 

struct page *alloc_buddy_huge_page(struct hstate *,struct vm_area_struct *, 
          unsigned long); 

struct page *alloc_huge_page_node_mod(unsigned long vaddr) 
{ 
struct page *page; 

page = dequeue_huge_page_vma(h, NULL, vaddr, 0); 

if (!page) 
    page = alloc_buddy_huge_page(h, NULL, vaddr); 

return page; 
} 

static int __init vma_null_test(void) 
{ 
    struct vm_struct *area; 
    h=&default_hstate; 
    unsigned long *address; 
    struct page *page; 
    int ret; 

    area=__get_vm_area_node(TWO_MB, 1, VM_ALLOC, VMALLOC_START, VMALLOC_END, -1, GFP_KERNEL|__GFP_HIGHMEM, __builtin_return_address(0)); 
    address=(unsigned long *)area->addr; 
    page=alloc_huge_page_node_mod(*address); 
    if(IS_ERR(page)){ 
    ret=-PTR_ERR(page); 
    printk(KERN_ERR "Cannot allocate page\n"); 

    } 
    else{ 
    ret=0; 
    printk(KERN_ERR "Allocate one huge page at virtual address:%x\n",*address); 
    } 

    return ret; 
} 

static void __exit vma_null_exit(void) 
{ 
    printk(KERN_ERR ".............Exit..........\n"); 
} 

module_init(vma_null_test); 
module_exit(vma_null_exit); 
MODULE_LICENSE("GPL"); 
+0

प्रत्येक कथन के बाद एक प्रिंटक स्टेटमेंट जोड़ें और देखें कि यह कहां दुर्घटनाग्रस्त है। साथ ही, आप डिबगर में डीबग प्रतीकों को लोड करने का प्रयास कर सकते हैं और जांच सकते हैं कि यह कहां दुर्घटनाग्रस्त हो गया है। और क्रैश रिपोर्ट से अधिक जानकारी पेस्ट करें। आपके द्वारा शामिल किए गए कार्यों से कहीं अधिक होना चाहिए। – hebbo

+0

क्या आप क्षेत्र वस्तु का डंप प्रदान कर सकते हैं? – t0k3n1z3r

उत्तर

0

यह एक बहुत पुराना सवाल, लेकिन क्या बिल्ली है ...

__get_vm_area_node () कई कारणों से NULL वापस कर सकते हैं, आप बिना शर्त शर्त के अपने वापसी मूल्य को सम्मानित करते हैं। यह मूर्खतापूर्ण है।

संबंधित मुद्दे