diff options
| -rw-r--r-- | mm/slab.c | 26 |
1 files changed, 15 insertions, 11 deletions
| @@ -3076,20 +3076,24 @@ ssize_t slabinfo_write(struct file *file, const char __user *buffer, | |||
| 3076 | } | 3076 | } |
| 3077 | #endif | 3077 | #endif |
| 3078 | 3078 | ||
| 3079 | /** | ||
| 3080 | * ksize - get the actual amount of memory allocated for a given object | ||
| 3081 | * @objp: Pointer to the object | ||
| 3082 | * | ||
| 3083 | * kmalloc may internally round up allocations and return more memory | ||
| 3084 | * than requested. ksize() can be used to determine the actual amount of | ||
| 3085 | * memory allocated. The caller may use this additional memory, even though | ||
| 3086 | * a smaller amount of memory was initially specified with the kmalloc call. | ||
| 3087 | * The caller must guarantee that objp points to a valid object previously | ||
| 3088 | * allocated with either kmalloc() or kmem_cache_alloc(). The object | ||
| 3089 | * must not be freed during the duration of the call. | ||
| 3090 | */ | ||
| 3079 | unsigned int ksize(const void *objp) | 3091 | unsigned int ksize(const void *objp) |
| 3080 | { | 3092 | { |
| 3081 | kmem_cache_t *c; | 3093 | if (unlikely(objp == NULL)) |
| 3082 | unsigned long flags; | 3094 | return 0; |
| 3083 | unsigned int size = 0; | ||
| 3084 | |||
| 3085 | if (likely(objp != NULL)) { | ||
| 3086 | local_irq_save(flags); | ||
| 3087 | c = GET_PAGE_CACHE(virt_to_page(objp)); | ||
| 3088 | size = kmem_cache_size(c); | ||
| 3089 | local_irq_restore(flags); | ||
| 3090 | } | ||
| 3091 | 3095 | ||
| 3092 | return size; | 3096 | return obj_reallen(GET_PAGE_CACHE(virt_to_page(objp))); |
| 3093 | } | 3097 | } |
| 3094 | 3098 | ||
| 3095 | 3099 | ||
