From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id ECA54A053A; Tue, 4 Aug 2020 09:25:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7BEC21C026; Tue, 4 Aug 2020 09:24:54 +0200 (CEST) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-1.mimecast.com [205.139.110.61]) by dpdk.org (Postfix) with ESMTP id 160212BE2 for ; Tue, 4 Aug 2020 09:24:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1596525891; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+5H/uv0arEEUMdr5TXUb6e5mCKKC5W/T3W/d7SpGv78=; b=NE7J40/eTQsT+PsWb05RX2LlDSiCkE2m73+JnTPr4aDR+3ml0E18ewEsJorBfc/UoqP7WB XulgSKV5+um322byc6Jd2cdipkryaKLvllzHfMuDu7vD92nze1qURUA/O57ye7Mjp4IQ3q AMSVJsmOJogqMO4KKNlGA/y/jyLyu5Q= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-372-fdm8kMO8MwCY6dVUychU9w-1; Tue, 04 Aug 2020 03:24:49 -0400 X-MC-Unique: fdm8kMO8MwCY6dVUychU9w-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A194A800685; Tue, 4 Aug 2020 07:24:48 +0000 (UTC) Received: from amorenoz.users.ipa.redhat.com (ovpn-113-91.ams2.redhat.com [10.36.113.91]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3296A7852C; Tue, 4 Aug 2020 07:24:47 +0000 (UTC) From: Adrian Moreno To: dev@dpdk.org Cc: zhihong.wang@intel.com, chenbo.xia@intel.com, maxime.coquelin@redhat.com, Adrian Moreno Date: Tue, 4 Aug 2020 09:24:29 +0200 Message-Id: <20200804072431.86441-3-amorenoz@redhat.com> In-Reply-To: <20200804072431.86441-1-amorenoz@redhat.com> References: <20200804072431.86441-1-amorenoz@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v2 2/4] net/virtio: add VIRTIO_SET_STATUS support to Virtio-user X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Maxime Coquelin This patch adds support for VHOST_USER_SET_STATUS request. It is used to make the backend aware of Virtio devices status update. It is useful for the backend to know when the Virtio driver is done with the Virtio device configuration. Signed-off-by: Maxime Coquelin Signed-off-by: Adrian Moreno --- drivers/net/virtio/virtio_user/vhost.h | 6 +++++ drivers/net/virtio/virtio_user/vhost_user.c | 10 +++++++ .../net/virtio/virtio_user/virtio_user_dev.c | 26 ++++++++++++++++++- .../net/virtio/virtio_user/virtio_user_dev.h | 1 + drivers/net/virtio/virtio_user_ethdev.c | 1 + 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/drivers/net/virtio/virtio_user/vhost.h b/drivers/net/virtio/virtio_user/vhost.h index 260e1c308..8f49ef457 100644 --- a/drivers/net/virtio/virtio_user/vhost.h +++ b/drivers/net/virtio/virtio_user/vhost.h @@ -57,6 +57,10 @@ struct vhost_vring_addr { #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3 #endif +#ifndef VHOST_USER_PROTOCOL_F_STATUS +#define VHOST_USER_PROTOCOL_F_STATUS 16 +#endif + enum vhost_user_request { VHOST_USER_NONE = 0, VHOST_USER_GET_FEATURES = 1, @@ -77,6 +81,8 @@ enum vhost_user_request { VHOST_USER_SET_PROTOCOL_FEATURES = 16, VHOST_USER_GET_QUEUE_NUM = 17, VHOST_USER_SET_VRING_ENABLE = 18, + VHOST_USER_SET_STATUS = 39, + VHOST_USER_GET_STATUS = 40, VHOST_USER_MAX }; diff --git a/drivers/net/virtio/virtio_user/vhost_user.c b/drivers/net/virtio/virtio_user/vhost_user.c index ad48bafd4..337e51199 100644 --- a/drivers/net/virtio/virtio_user/vhost_user.c +++ b/drivers/net/virtio/virtio_user/vhost_user.c @@ -244,6 +244,8 @@ const char * const vhost_msg_strings[] = { [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE", [VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES", [VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES", + [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS", + [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS", }; static int @@ -280,6 +282,14 @@ vhost_user_sock(struct virtio_user_dev *dev, need_reply = 1; break; + case VHOST_USER_SET_STATUS: + if (!(dev->protocol_features & + (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + return 0; + + if (has_reply_ack) + msg.flags |= VHOST_USER_NEED_REPLY_MASK; + /* Fallthrough */ case VHOST_USER_SET_FEATURES: case VHOST_USER_SET_PROTOCOL_FEATURES: case VHOST_USER_SET_LOG_BASE: diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c index 0a6991bcc..670fc9d40 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.c +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c @@ -424,7 +424,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev) #define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES \ (1ULL << VHOST_USER_PROTOCOL_F_MQ | \ - 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK) + 1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK | \ + 1ULL << VHOST_USER_PROTOCOL_F_STATUS) int virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues, @@ -783,3 +784,26 @@ virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx) __atomic_add_fetch(&vring->used->idx, 1, __ATOMIC_RELAXED); } } + +int +virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status) +{ + int ret; + uint64_t arg = status; + + /* Vhost-user only for now */ + if (!is_vhost_user_by_type(dev->path)) + return 0; + + if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS))) + return 0; + + ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg); + if (ret) { + PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret, + strerror(errno)); + return -1; + } + + return 0; +} diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.h b/drivers/net/virtio/virtio_user/virtio_user_dev.h index 554174e81..835ab64ae 100644 --- a/drivers/net/virtio/virtio_user/virtio_user_dev.h +++ b/drivers/net/virtio/virtio_user/virtio_user_dev.h @@ -72,4 +72,5 @@ void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx); void virtio_user_handle_cq_packed(struct virtio_user_dev *dev, uint16_t queue_idx); uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs); +int virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status); #endif diff --git a/drivers/net/virtio/virtio_user_ethdev.c b/drivers/net/virtio/virtio_user_ethdev.c index 6003f6d50..785882e06 100644 --- a/drivers/net/virtio/virtio_user_ethdev.c +++ b/drivers/net/virtio/virtio_user_ethdev.c @@ -272,6 +272,7 @@ virtio_user_set_status(struct virtio_hw *hw, uint8_t status) else if (status == VIRTIO_CONFIG_STATUS_RESET) virtio_user_reset(hw); dev->status = status; + virtio_user_send_status_update(dev, status); } static uint8_t -- 2.26.2