函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source File:mm\nommu.c Create Date:2022-07-27 16:02:30
首页 Copyright©Brick

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
 * Return the total memory allocated for this pointer, not
 * just what the caller asked for.
 *
 * Doesn't have to be accurate, i.e. may have races.
 */
unsigned int kobjsize(const void *objp)
{
    struct page *page;
 
    /*
     * If the object we have should not have ksize performed on it,
     * return size of 0
     */
    if (!objp || !virt_addr_valid(objp))
        return 0;
 
    page = virt_to_head_page(objp);
 
    /*
     * If the allocator sets PageSlab, we know the pointer came from
     * kmalloc().
     */
    if (PageSlab(page))
        return ksize(objp);
 
    /*
     * If it's not a compound page, see if we have a matching VMA
     * region. This test is intentionally done in reverse order,
     * so if there's no VMA, we still fall through and hand back
     * PAGE_SIZE for 0-order pages.
     */
    if (!PageCompound(page)) {
        struct vm_area_struct *vma;
 
        vma = find_vma(current->mm, (unsigned long)objp);
        if (vma)
            return vma->vm_end - vma->vm_start;
    }
 
    /*
     * The ksize() function is only guaranteed to work for pointers
     * returned by kmalloc(). So handle arbitrary pointers here.
     */
    return page_size(page);
}