From: Tiwei Bie <tiwei.bie@intel.com>
To: Nikolay Nikolaev <nicknickolaev@gmail.com>
Cc: maxime.coquelin@redhat.com, zhihong.wang@intel.com, dev@dpdk.org
Subject: Re: [PATCH v1 5/5] vhost: message handling implemented as a callback array
Date: Tue, 10 Jul 2018 13:56:57 +0800 [thread overview]
Message-ID: <20180710055657.GB10600@debian> (raw)
In-Reply-To: <153002997827.22089.15583649737397622971.stgit@T460>
On Tue, Jun 26, 2018 at 07:19:38PM +0300, Nikolay Nikolaev wrote:
> Introduce vhost_message_handlers, which maps the message request
> type to the message handler. Then replace the switch construct
> with a map and call.
>
> Signed-off-by: Nikolay Nikolaev <nicknickolaev@gmail.com>
> ---
> lib/librte_vhost/vhost_user.c | 144 ++++++++++++++++-------------------------
> 1 file changed, 55 insertions(+), 89 deletions(-)
>
> diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
> index dd47d84c7..e62164d63 100644
> --- a/lib/librte_vhost/vhost_user.c
> +++ b/lib/librte_vhost/vhost_user.c
> @@ -1379,6 +1379,36 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, VhostUserMsg *msg)
> return VH_RESULT_OK;
> }
>
> +typedef int (*message_handler)(struct virtio_net **pdev, VhostUserMsg * msg);
s/message_handler/vhost_message_handler_t/
> +static message_handler vhost_message_handlers[VHOST_USER_MAX] = {
> + [VHOST_USER_NONE] = NULL,
> + [VHOST_USER_GET_FEATURES] = vhost_user_get_features,
> + [VHOST_USER_SET_FEATURES] = vhost_user_set_features,
> + [VHOST_USER_SET_OWNER] = vhost_user_set_owner,
> + [VHOST_USER_RESET_OWNER] = vhost_user_reset_owner,
> + [VHOST_USER_SET_MEM_TABLE] = vhost_user_set_mem_table,
> + [VHOST_USER_SET_LOG_BASE] = vhost_user_set_log_base,
> + [VHOST_USER_SET_LOG_FD] = vhost_user_set_log_fd,
> + [VHOST_USER_SET_VRING_NUM] = vhost_user_set_vring_num,
> + [VHOST_USER_SET_VRING_ADDR] = vhost_user_set_vring_addr,
> + [VHOST_USER_SET_VRING_BASE] = vhost_user_set_vring_base,
> + [VHOST_USER_GET_VRING_BASE] = vhost_user_get_vring_base,
> + [VHOST_USER_SET_VRING_KICK] = vhost_user_set_vring_kick,
> + [VHOST_USER_SET_VRING_CALL] = vhost_user_set_vring_call,
> + [VHOST_USER_SET_VRING_ERR] = vhost_user_set_vring_err,
> + [VHOST_USER_GET_PROTOCOL_FEATURES] = vhost_user_get_protocol_features,
> + [VHOST_USER_SET_PROTOCOL_FEATURES] = vhost_user_set_protocol_features,
> + [VHOST_USER_GET_QUEUE_NUM] = vhost_user_get_queue_num,
> + [VHOST_USER_SET_VRING_ENABLE] = vhost_user_set_vring_enable,
> + [VHOST_USER_SEND_RARP] = vhost_user_send_rarp,
> + [VHOST_USER_NET_SET_MTU] = vhost_user_net_set_mtu,
> + [VHOST_USER_SET_SLAVE_REQ_FD] = vhost_user_set_req_fd,
> + [VHOST_USER_IOTLB_MSG] = vhost_user_iotlb_msg,
Please keep using one space between "]" and "=".
> + [VHOST_USER_CRYPTO_CREATE_SESS] = NULL,
> + [VHOST_USER_CRYPTO_CLOSE_SESS] = NULL,
There is no need to zero above two explicitly.
> +};
> +
> +
> /* return bytes# of read on success or negative val on failure. */
> static int
> read_vhost_message(int sockfd, VhostUserMsg *msg)
> @@ -1623,97 +1653,33 @@ vhost_user_msg_handler(int vid, int fd)
> goto skip_to_post_handle;
> }
>
> - switch (msg.request.master) {
> - case VHOST_USER_GET_FEATURES:
> - ret = vhost_user_get_features(&dev, &msg);
> - send_vhost_reply(fd, &msg);
> - break;
> - case VHOST_USER_SET_FEATURES:
> - ret = vhost_user_set_features(&dev, &msg);
> - if (ret)
> - return -1;
> - break;
> -
> - case VHOST_USER_GET_PROTOCOL_FEATURES:
> - ret = vhost_user_get_protocol_features(&dev, &msg);
> - send_vhost_reply(fd, &msg);
> - break;
> - case VHOST_USER_SET_PROTOCOL_FEATURES:
> - ret = vhost_user_set_protocol_features(&dev, &msg);
> - break;
> -
> - case VHOST_USER_SET_OWNER:
> - ret = vhost_user_set_owner(&dev, &msg);
> - break;
> - case VHOST_USER_RESET_OWNER:
> - ret = vhost_user_reset_owner(&dev, &msg);
> - break;
> -
> - case VHOST_USER_SET_MEM_TABLE:
> - ret = vhost_user_set_mem_table(&dev, &msg);
> - break;
> -
> - case VHOST_USER_SET_LOG_BASE:
> - ret = vhost_user_set_log_base(&dev, &msg);
> - send_vhost_reply(fd, &msg);
> - break;
> - case VHOST_USER_SET_LOG_FD:
> - ret = vhost_user_set_log_fd(&dev, &msg);
> - break;
> -
> - case VHOST_USER_SET_VRING_NUM:
> - ret = vhost_user_set_vring_num(&dev, &msg);
> - break;
> - case VHOST_USER_SET_VRING_ADDR:
> - ret = vhost_user_set_vring_addr(&dev, &msg);
> - break;
> - case VHOST_USER_SET_VRING_BASE:
> - ret = vhost_user_set_vring_base(&dev, &msg);
> - break;
>
Please also remove above blank line.
> - case VHOST_USER_GET_VRING_BASE:
> - ret = vhost_user_get_vring_base(&dev, &msg);
> - send_vhost_reply(fd, &msg);
> - break;
> + int request = msg.request.master;
Please define variable at the beginning of the function.
> + if (vhost_message_handlers[request]) {
The `request` needs to be checked with VHOST_USER_MAX first.
> + ret = vhost_message_handlers[request](&dev, &msg);
>
[...]
> -
> - default:
> - ret = -1;
> - break;
> + switch (ret) {
> + case VH_RESULT_ERR:
> + RTE_LOG(ERR, VHOST_CONFIG,
> + "Processing %s failed.\n",
> + vhost_message_str[request]);
> + return -1;
Queue pairs need to be unlocked when necessary.
> + case VH_RESULT_OK:
> + RTE_LOG(DEBUG, VHOST_CONFIG,
> + "Processing %s succeeded.\n",
> + vhost_message_str[request]);
> + break;
> + case VH_RESULT_REPLY:
> + RTE_LOG(INFO, VHOST_CONFIG,
> + "Processing %s succeeded and needs reply.\n",
> + vhost_message_str[request]);
> + send_vhost_reply(fd, &msg);
> + break;
> + }
> + } else {
> + RTE_LOG(ERR, VHOST_CONFIG,
> + "Requested invalid message type %d.\n", request);
> + return -1;
The old behaviour is changed, VHOST_USER_CRYPTO_CREATE_SESS
and VHOST_USER_CRYPTO_CLOSE_SESS will be broken.
> }
>
> skip_to_post_handle:
>
prev parent reply other threads:[~2018-07-10 5:57 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-26 16:19 [PATCH v1 0/5] vhost_user.c code cleanup Nikolay Nikolaev
2018-06-26 16:19 ` [PATCH v1 1/5] vhost: unify VhostUserMsg usage Nikolay Nikolaev
2018-06-26 16:19 ` [PATCH v1 2/5] vhost: make message handling functions prepare the reply Nikolay Nikolaev
2018-06-26 16:19 ` [PATCH v1 3/5] vhost: handle unsupported message types in functions Nikolay Nikolaev
2018-06-26 16:19 ` [PATCH v1 4/5] vhost: unify message handling function signature Nikolay Nikolaev
2018-07-10 5:48 ` Tiwei Bie
2018-06-26 16:19 ` [PATCH v1 5/5] vhost: message handling implemented as a callback array Nikolay Nikolaev
2018-07-10 5:56 ` Tiwei Bie [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180710055657.GB10600@debian \
--to=tiwei.bie@intel.com \
--cc=dev@dpdk.org \
--cc=maxime.coquelin@redhat.com \
--cc=nicknickolaev@gmail.com \
--cc=zhihong.wang@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.