From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <nicknickolaev@gmail.com>
Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com
 [209.85.221.67]) by dpdk.org (Postfix) with ESMTP id 26C2E4F9B
 for <dev@dpdk.org>; Sat, 15 Sep 2018 07:20:57 +0200 (CEST)
Received: by mail-wr1-f67.google.com with SMTP id w11-v6so12386070wrc.5
 for <dev@dpdk.org>; Fri, 14 Sep 2018 22:20:57 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
 h=subject:from:to:cc:date:message-id:in-reply-to:references
 :user-agent:mime-version:content-transfer-encoding;
 bh=Yv236JZO8MBwNudwgeRbvCz9ijAwsid6llq78vrEdfI=;
 b=M41PSF1384aSFyIeQmnyTLwZhfgtpePKAq68cWu2AmkFanCMs6ev5tCIUW5R/sYKVz
 QLSXOZrszJch5yrAWAzLJRlcnemgR9a2vh9W5OBogVZB2QdtsO8/J2uoGQFnxyQ4ihMV
 4hCh6e3DzllOEJ7U7PjN6f/xwc3HJRaG0T5HGL2joMI1KWQNLmlg/PoLqBS3xF3/0pk5
 iHPAY/YmdecJR5nv4GlzGmB5Lg5jc44wq8qIJLMCLfSm+AvU2FAu6hFXi92ucQ5Fwnnc
 VtSjC1nfmlcT7ZKmUg79iEkpM6KdRmYDjEQow8X4fUyeDT6UbWS5re6UcOX8KAQ1PTIp
 lQiQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=1e100.net; s=20161025;
 h=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to
 :references:user-agent:mime-version:content-transfer-encoding;
 bh=Yv236JZO8MBwNudwgeRbvCz9ijAwsid6llq78vrEdfI=;
 b=V/2y2YZdKPRYHNnHfN3x+IVXQ3hyh4Cnnx03DjOUtkNyfm8vMbvz3TOyzOcVjeMV+0
 5WotHn3AKNuxDZiTSjeC2EBtdy/9vqB0YpYPkKm9E3pEffBjkpr8fzX+WsNDquH2u3Zt
 ie/9RB6ZrRAf7KjeWRvW7n4AdPKkUlwJ8NMaHbIdLFZaD4CkVSQJFu+f3KxtEukcJMNs
 AY1h3pgKjZ0qQ3ykl6SiHNw1kdXizbi3be1A3xT9sCyP0uaSy26P5a5ek8rL7MvVt/Oy
 LJl6kHXle4gEQW+L0keGQMbgTw/ttYomqyEWhgjQAZzzi1UGBoGoE2YuMQqJjHbzfbiR
 mbZA==
X-Gm-Message-State: APzg51CzKP1RdUfCCOtypRqY8LkDDvV+hh8MV1AHKIJBG55FyPSOX3bh
 IxkkHXZpP2sG9bUceRpd0AjY3K133EitbA==
X-Google-Smtp-Source: ANB0VdYfa3diLEuEPiT3cjGCuB94gXBUQhE+nPNgtA95F/A5/9tg2IZ9xWKjAmPiIuTFQqKcOjxecw==
X-Received: by 2002:a5d:50cf:: with SMTP id
 f15-v6mr12415525wrt.128.1536988856596; 
 Fri, 14 Sep 2018 22:20:56 -0700 (PDT)
Received: from [127.0.1.1] ([82.146.27.14])
 by smtp.gmail.com with ESMTPSA id 60-v6sm9827382wre.82.2018.09.14.22.20.55
 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
 Fri, 14 Sep 2018 22:20:56 -0700 (PDT)
From: Nikolay Nikolaev <nicknickolaev@gmail.com>
To: maxime.coquelin@redhat.com, tiwei.bie@intel.com, zhihong.wang@intel.com
Cc: dev@dpdk.org
Date: Sat, 15 Sep 2018 08:20:54 +0300
Message-ID: <153698885466.23049.5627861471035122455.stgit@T460>
In-Reply-To: <153698873346.23049.10966616323159180622.stgit@T460>
References: <153698873346.23049.10966616323159180622.stgit@T460>
User-Agent: StGit/0.17.1-dirty
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: 7bit
Subject: [dpdk-dev] [PATCH v3 5/5] vhost: message handling implemented as a
 callback array
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Sat, 15 Sep 2018 05:20:57 -0000

Introduce vhost_message_handlers, which maps the message request
type to the message handler. Then replace the switch construct
with a map and call.

Failing vhost_user_set_features is fatal and all processing should
stop immediately and propagate the error to the upper layers. Change
the code accordingly to reflect that.

Signed-off-by: Nikolay Nikolaev <nicknickolaev@gmail.com>
---
 lib/librte_vhost/vhost_user.c |  161 +++++++++++++++++------------------------
 1 file changed, 66 insertions(+), 95 deletions(-)

diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 81c0396de..9004e1ac8 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -73,6 +73,8 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
 
 /* The possible results of a message handling function */
 enum vh_result {
+	/* Message handling failed with an unrecoverable error */
+	VH_RESULT_FATAL = -2,
 	/* Message handling failed */
 	VH_RESULT_ERR   = -1,
 	/* Message handling successful */
@@ -206,7 +208,7 @@ vhost_user_set_features(struct virtio_net **pdev, VhostUserMsg *msg)
 		RTE_LOG(ERR, VHOST_CONFIG,
 			"(%d) received invalid negotiated features.\n",
 			dev->vid);
-		return VH_RESULT_ERR;
+		return VH_RESULT_FATAL;
 	}
 
 	if (dev->flags & VIRTIO_DEV_RUNNING) {
@@ -222,7 +224,7 @@ vhost_user_set_features(struct virtio_net **pdev, VhostUserMsg *msg)
 			RTE_LOG(ERR, VHOST_CONFIG,
 				"(%d) features changed while device is running.\n",
 				dev->vid);
-			return VH_RESULT_ERR;
+			return VH_RESULT_FATAL;
 		}
 
 		if (dev->notify_ops->features_changed)
@@ -1477,6 +1479,34 @@ vhost_user_iotlb_msg(struct virtio_net **pdev, VhostUserMsg *msg)
 	return VH_RESULT_OK;
 }
 
+typedef int (*vhost_message_handler_t)(struct virtio_net **pdev, VhostUserMsg * msg);
+static vhost_message_handler_t 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,
+};
+
+
 /* return bytes# of read on success or negative val on failure. */
 static int
 read_vhost_message(int sockfd, VhostUserMsg *msg)
@@ -1629,6 +1659,7 @@ vhost_user_msg_handler(int vid, int fd)
 	int ret;
 	int unlock_required = 0;
 	uint32_t skip_master = 0;
+	int request;
 
 	dev = get_device(vid);
 	if (dev == NULL)
@@ -1721,100 +1752,40 @@ 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);
-		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);
-		if (ret)
-			goto skip_to_reply;
-		/* it needs a reply */
-		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;
-
-	case VHOST_USER_GET_VRING_BASE:
-		ret = vhost_user_get_vring_base(&dev, &msg);
-		if (ret)
-			goto skip_to_reply;
-		send_vhost_reply(fd, &msg);
-		break;
-
-	case VHOST_USER_SET_VRING_KICK:
-		ret = vhost_user_set_vring_kick(&dev, &msg);
-		break;
-	case VHOST_USER_SET_VRING_CALL:
-		ret = vhost_user_set_vring_call(&dev, &msg);
-		break;
-
-	case VHOST_USER_SET_VRING_ERR:
-		ret = vhost_user_set_vring_err(&dev, &msg);
-		break;
-
-	case VHOST_USER_GET_QUEUE_NUM:
-		ret = vhost_user_get_queue_num(&dev, &msg);
-		send_vhost_reply(fd, &msg);
-		break;
-
-	case VHOST_USER_SET_VRING_ENABLE:
-		ret = vhost_user_set_vring_enable(&dev, &msg);
-		break;
-	case VHOST_USER_SEND_RARP:
-		ret = vhost_user_send_rarp(&dev, &msg);
-		break;
-
-	case VHOST_USER_NET_SET_MTU:
-		ret = vhost_user_net_set_mtu(&dev, &msg);
-		break;
-
-	case VHOST_USER_SET_SLAVE_REQ_FD:
-		ret = vhost_user_set_req_fd(&dev, &msg);
-		break;
-
-	case VHOST_USER_IOTLB_MSG:
-		ret = vhost_user_iotlb_msg(&dev, &msg);
-		break;
+	request = msg.request.master;
+	if (request > VHOST_USER_NONE && request < VHOST_USER_MAX) {
+		if (!vhost_message_handlers[request])
+			goto skip_to_post_handle;
+		ret = vhost_message_handlers[request](&dev, &msg);
 
-	default:
-		ret = -1;
-		break;
+		switch (ret) {
+		case VH_RESULT_FATAL:
+			RTE_LOG(ERR, VHOST_CONFIG,
+				"Processing %s failed with an unrecoverable error.\n",
+				vhost_message_str[request]);
+			/* Propagate the error to the upper layer */
+			return -1;
+		case VH_RESULT_ERR:
+			RTE_LOG(ERR, VHOST_CONFIG,
+				"Processing %s failed.\n",
+				vhost_message_str[request]);
+			break;
+		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);
+		ret = VH_RESULT_ERR;
 	}
 
 skip_to_post_handle: