Re: [PATCH] libceph: optimize ceph_msg_new

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

 



On Tue, Apr 17, 2018 at 12:15 PM, Chengguang Xu <cgxu519@xxxxxxx> wrote:
> 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);

Hi Chengguang,

I don't think this buys anything.  The difference is literally a few
integer/pointer assignments in the error case, which means a failed OSD
or MDS request.

Thanks,

                Ilya
--
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