libceph: add ceph_kv{malloc,free}() and switch to them
Encapsulate kmalloc vs vmalloc memory allocation and freeing logic into two helpers, ceph_kvmalloc() and ceph_kvfree(), and switch to them. ceph_kvmalloc() kmalloc()'s a maximum of 8 pages, anything bigger is vmalloc()'ed with __GFP_HIGHMEM set. This changes the existing behaviour: - for buffers (ceph_buffer_new()), from trying to kmalloc() everything and using vmalloc() just as a fallback - for messages (ceph_msg_new()), from going to vmalloc() for anything bigger than a page - for messages (ceph_msg_new()), from disallowing vmalloc() to use high memory Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
@@ -3131,13 +3131,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
|
||||
|
||||
/* front */
|
||||
if (front_len) {
|
||||
if (front_len > PAGE_CACHE_SIZE) {
|
||||
m->front.iov_base = __vmalloc(front_len, flags,
|
||||
PAGE_KERNEL);
|
||||
m->front_is_vmalloc = true;
|
||||
} else {
|
||||
m->front.iov_base = kmalloc(front_len, flags);
|
||||
}
|
||||
m->front.iov_base = ceph_kvmalloc(front_len, flags);
|
||||
if (m->front.iov_base == NULL) {
|
||||
dout("ceph_msg_new can't allocate %d bytes\n",
|
||||
front_len);
|
||||
@@ -3259,10 +3253,7 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
|
||||
void ceph_msg_kfree(struct ceph_msg *m)
|
||||
{
|
||||
dout("msg_kfree %p\n", m);
|
||||
if (m->front_is_vmalloc)
|
||||
vfree(m->front.iov_base);
|
||||
else
|
||||
kfree(m->front.iov_base);
|
||||
ceph_kvfree(m->front.iov_base);
|
||||
kmem_cache_free(ceph_msg_cache, m);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user