[PATCH] libceph: optimize ceph_msg_new

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Do memory allocation first, so that avoid unnecessary
initialization of newly allocated message in error case.

Signed-off-by: Chengguang Xu <cgxu519@xxxxxxx>
---
 net/ceph/messenger.c | 42 ++++++++++++++++++++----------------------
 1 file changed, 20 insertions(+), 22 deletions(-)

diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index fcb40c1..5a8c5cd 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -3331,6 +3331,16 @@ void ceph_msg_data_add_bvecs(struct ceph_msg *msg,
 EXPORT_SYMBOL(ceph_msg_data_add_bvecs);
 
 /*
+ * Free a generically kmalloc'd message.
+ */
+static void ceph_msg_free(struct ceph_msg *m)
+{
+	dout("%s %p\n", __func__, m);
+	kvfree(m->front.iov_base);
+	kmem_cache_free(ceph_msg_cache, m);
+}
+
+/*
  * construct a new message with given type, size
  * the new msg has a ref count of 1.
  */
@@ -3343,14 +3353,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
 	if (m == NULL)
 		goto out;
 
-	m->hdr.type = cpu_to_le16(type);
-	m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT);
-	m->hdr.front_len = cpu_to_le32(front_len);
-
-	INIT_LIST_HEAD(&m->list_head);
-	kref_init(&m->kref);
-	INIT_LIST_HEAD(&m->data);
-
 	/* front */
 	if (front_len) {
 		m->front.iov_base = ceph_kvmalloc(front_len, flags);
@@ -3359,16 +3361,23 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags,
 			     front_len);
 			goto out2;
 		}
-	} else {
-		m->front.iov_base = NULL;
 	}
+
+	m->hdr.type = cpu_to_le16(type);
+	m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT);
+	m->hdr.front_len = cpu_to_le32(front_len);
+
+	INIT_LIST_HEAD(&m->list_head);
+	kref_init(&m->kref);
+	INIT_LIST_HEAD(&m->data);
+
 	m->front_alloc_len = m->front.iov_len = front_len;
 
 	dout("ceph_msg_new %p front %d\n", m, front_len);
 	return m;
 
 out2:
-	ceph_msg_put(m);
+	ceph_msg_free(m);
 out:
 	if (!can_fail) {
 		pr_err("msg_new can't create type %d front %d\n", type,
@@ -3467,17 +3476,6 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip)
 	return ret;
 }
 
-
-/*
- * Free a generically kmalloc'd message.
- */
-static void ceph_msg_free(struct ceph_msg *m)
-{
-	dout("%s %p\n", __func__, m);
-	kvfree(m->front.iov_base);
-	kmem_cache_free(ceph_msg_cache, m);
-}
-
 static void ceph_msg_release(struct kref *kref)
 {
 	struct ceph_msg *m = container_of(kref, struct ceph_msg, kref);
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux