All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefano Garzarella <sgarzare@redhat.com>
To: virtualization@lists.linux-foundation.org
Cc: Oren Duer <oren@nvidia.com>, Laurent Vivier <lvivier@redhat.com>,
	Max Gurtovoy <mgurtovoy@nvidia.com>,
	Randy Dunlap <rdunlap@infradead.org>,
	Shahaf Shuler <shahafs@nvidia.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Eli Cohen <elic@nvidia.com>,
	linux-kernel@vger.kernel.org,
	Stefano Garzarella <sgarzare@redhat.com>,
	Jason Wang <jasowang@redhat.com>
Subject: [PATCH v4 12/18] vdpa_sim: add get_config callback in vdpasim_dev_attr
Date: Tue, 15 Dec 2020 15:42:50 +0100	[thread overview]
Message-ID: <20201215144256.155342-13-sgarzare@redhat.com> (raw)
In-Reply-To: <20201215144256.155342-1-sgarzare@redhat.com>

The get_config callback can be used by the device to fill the
config structure.
The callback will be invoked in vdpasim_get_config() before copying
bytes into caller buffer.

Move vDPA-net config updates from vdpasim_set_features() in the
new vdpasim_net_get_config() callback.
This is safe since in vdpa_get_config() we already check that
.set_features() callback is called before .get_config().

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
v4:
- explained in the commit message that the moving is safe [Jason]

v3:
- checked if get_config callback is set before call it
---
 drivers/vdpa/vdpa_sim/vdpa_sim.c | 35 +++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c
index 4a0a6cadb9ff..5eadcd19ab6f 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
@@ -68,6 +68,8 @@ struct vdpasim_virtqueue {
 #define VDPASIM_NET_FEATURES	(VDPASIM_FEATURES | \
 				 (1ULL << VIRTIO_NET_F_MAC))
 
+struct vdpasim;
+
 struct vdpasim_dev_attr {
 	u64 supported_features;
 	size_t config_size;
@@ -75,6 +77,7 @@ struct vdpasim_dev_attr {
 	u32 id;
 
 	work_func_t work_fn;
+	void (*get_config)(struct vdpasim *vdpasim, void *config);
 };
 
 /* State of each vdpasim device */
@@ -530,8 +533,6 @@ static u64 vdpasim_get_features(struct vdpa_device *vdpa)
 static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
 {
 	struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
-	struct virtio_net_config *config =
-		(struct virtio_net_config *)vdpasim->config;
 
 	/* DMA mapping must be done by driver */
 	if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)))
@@ -539,16 +540,6 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
 
 	vdpasim->features = features & vdpasim->dev_attr.supported_features;
 
-	/* We generally only know whether guest is using the legacy interface
-	 * here, so generally that's the earliest we can set config fields.
-	 * Note: We actually require VIRTIO_F_ACCESS_PLATFORM above which
-	 * implies VIRTIO_F_VERSION_1, but let's not try to be clever here.
-	 */
-
-	config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
-	config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
-	memcpy(config->mac, macaddr_buf, ETH_ALEN);
-
 	return 0;
 }
 
@@ -603,8 +594,13 @@ static void vdpasim_get_config(struct vdpa_device *vdpa, unsigned int offset,
 {
 	struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
 
-	if (offset + len < vdpasim->dev_attr.config_size)
-		memcpy(buf, vdpasim->config + offset, len);
+	if (offset + len > vdpasim->dev_attr.config_size)
+		return;
+
+	if (vdpasim->dev_attr.get_config)
+		vdpasim->dev_attr.get_config(vdpasim, vdpasim->config);
+
+	memcpy(buf, vdpasim->config + offset, len);
 }
 
 static void vdpasim_set_config(struct vdpa_device *vdpa, unsigned int offset,
@@ -747,6 +743,16 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = {
 	.free                   = vdpasim_free,
 };
 
+static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config)
+{
+	struct virtio_net_config *net_config =
+		(struct virtio_net_config *)config;
+
+	net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
+	net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
+	memcpy(net_config->mac, macaddr_buf, ETH_ALEN);
+}
+
 static int __init vdpasim_dev_init(void)
 {
 	struct vdpasim_dev_attr dev_attr = {};
@@ -755,6 +761,7 @@ static int __init vdpasim_dev_init(void)
 	dev_attr.supported_features = VDPASIM_NET_FEATURES;
 	dev_attr.nvqs = VDPASIM_VQ_NUM;
 	dev_attr.config_size = sizeof(struct virtio_net_config);
+	dev_attr.get_config = vdpasim_net_get_config;
 	dev_attr.work_fn = vdpasim_net_work;
 
 	vdpasim_dev = vdpasim_create(&dev_attr);
-- 
2.26.2


WARNING: multiple messages have this Message-ID (diff)
From: Stefano Garzarella <sgarzare@redhat.com>
To: virtualization@lists.linux-foundation.org
Cc: Laurent Vivier <lvivier@redhat.com>,
	Max Gurtovoy <mgurtovoy@nvidia.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Randy Dunlap <rdunlap@infradead.org>,
	linux-kernel@vger.kernel.org, Shahaf Shuler <shahafs@nvidia.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Eli Cohen <elic@nvidia.com>, Oren Duer <oren@nvidia.com>
Subject: [PATCH v4 12/18] vdpa_sim: add get_config callback in vdpasim_dev_attr
Date: Tue, 15 Dec 2020 15:42:50 +0100	[thread overview]
Message-ID: <20201215144256.155342-13-sgarzare@redhat.com> (raw)
In-Reply-To: <20201215144256.155342-1-sgarzare@redhat.com>

The get_config callback can be used by the device to fill the
config structure.
The callback will be invoked in vdpasim_get_config() before copying
bytes into caller buffer.

Move vDPA-net config updates from vdpasim_set_features() in the
new vdpasim_net_get_config() callback.
This is safe since in vdpa_get_config() we already check that
.set_features() callback is called before .get_config().

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
---
v4:
- explained in the commit message that the moving is safe [Jason]

v3:
- checked if get_config callback is set before call it
---
 drivers/vdpa/vdpa_sim/vdpa_sim.c | 35 +++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/drivers/vdpa/vdpa_sim/vdpa_sim.c b/drivers/vdpa/vdpa_sim/vdpa_sim.c
index 4a0a6cadb9ff..5eadcd19ab6f 100644
--- a/drivers/vdpa/vdpa_sim/vdpa_sim.c
+++ b/drivers/vdpa/vdpa_sim/vdpa_sim.c
@@ -68,6 +68,8 @@ struct vdpasim_virtqueue {
 #define VDPASIM_NET_FEATURES	(VDPASIM_FEATURES | \
 				 (1ULL << VIRTIO_NET_F_MAC))
 
+struct vdpasim;
+
 struct vdpasim_dev_attr {
 	u64 supported_features;
 	size_t config_size;
@@ -75,6 +77,7 @@ struct vdpasim_dev_attr {
 	u32 id;
 
 	work_func_t work_fn;
+	void (*get_config)(struct vdpasim *vdpasim, void *config);
 };
 
 /* State of each vdpasim device */
@@ -530,8 +533,6 @@ static u64 vdpasim_get_features(struct vdpa_device *vdpa)
 static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
 {
 	struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
-	struct virtio_net_config *config =
-		(struct virtio_net_config *)vdpasim->config;
 
 	/* DMA mapping must be done by driver */
 	if (!(features & (1ULL << VIRTIO_F_ACCESS_PLATFORM)))
@@ -539,16 +540,6 @@ static int vdpasim_set_features(struct vdpa_device *vdpa, u64 features)
 
 	vdpasim->features = features & vdpasim->dev_attr.supported_features;
 
-	/* We generally only know whether guest is using the legacy interface
-	 * here, so generally that's the earliest we can set config fields.
-	 * Note: We actually require VIRTIO_F_ACCESS_PLATFORM above which
-	 * implies VIRTIO_F_VERSION_1, but let's not try to be clever here.
-	 */
-
-	config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
-	config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
-	memcpy(config->mac, macaddr_buf, ETH_ALEN);
-
 	return 0;
 }
 
@@ -603,8 +594,13 @@ static void vdpasim_get_config(struct vdpa_device *vdpa, unsigned int offset,
 {
 	struct vdpasim *vdpasim = vdpa_to_sim(vdpa);
 
-	if (offset + len < vdpasim->dev_attr.config_size)
-		memcpy(buf, vdpasim->config + offset, len);
+	if (offset + len > vdpasim->dev_attr.config_size)
+		return;
+
+	if (vdpasim->dev_attr.get_config)
+		vdpasim->dev_attr.get_config(vdpasim, vdpasim->config);
+
+	memcpy(buf, vdpasim->config + offset, len);
 }
 
 static void vdpasim_set_config(struct vdpa_device *vdpa, unsigned int offset,
@@ -747,6 +743,16 @@ static const struct vdpa_config_ops vdpasim_batch_config_ops = {
 	.free                   = vdpasim_free,
 };
 
+static void vdpasim_net_get_config(struct vdpasim *vdpasim, void *config)
+{
+	struct virtio_net_config *net_config =
+		(struct virtio_net_config *)config;
+
+	net_config->mtu = cpu_to_vdpasim16(vdpasim, 1500);
+	net_config->status = cpu_to_vdpasim16(vdpasim, VIRTIO_NET_S_LINK_UP);
+	memcpy(net_config->mac, macaddr_buf, ETH_ALEN);
+}
+
 static int __init vdpasim_dev_init(void)
 {
 	struct vdpasim_dev_attr dev_attr = {};
@@ -755,6 +761,7 @@ static int __init vdpasim_dev_init(void)
 	dev_attr.supported_features = VDPASIM_NET_FEATURES;
 	dev_attr.nvqs = VDPASIM_VQ_NUM;
 	dev_attr.config_size = sizeof(struct virtio_net_config);
+	dev_attr.get_config = vdpasim_net_get_config;
 	dev_attr.work_fn = vdpasim_net_work;
 
 	vdpasim_dev = vdpasim_create(&dev_attr);
-- 
2.26.2

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

  parent reply	other threads:[~2020-12-15 14:59 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-15 14:42 [PATCH v4 00/18] vdpa: generalize vdpa simulator Stefano Garzarella
2020-12-15 14:42 ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 01/18] vdpa: remove unnecessary 'default n' in Kconfig entries Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 02/18] vdpa_sim: remove unnecessary headers inclusion Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 03/18] vdpa_sim: remove hard-coded virtq count Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 04/18] vdpa_sim: make IOTLB entries limit configurable Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-17  4:29   ` Jason Wang
2020-12-17  4:29     ` Jason Wang
2020-12-15 14:42 ` [PATCH v4 05/18] vdpa_sim: rename vdpasim_config_ops variables Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 06/18] vdpa_sim: add struct vdpasim_dev_attr for device attributes Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 07/18] vdpa_sim: add device id field in vdpasim_dev_attr Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 08/18] vdpa_sim: add supported_features " Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 09/18] vdpa_sim: add work_fn " Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 10/18] vdpa_sim: store parsed MAC address in a buffer Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 11/18] vdpa_sim: make 'config' generic and usable for any device type Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` Stefano Garzarella [this message]
2020-12-15 14:42   ` [PATCH v4 12/18] vdpa_sim: add get_config callback in vdpasim_dev_attr Stefano Garzarella
2020-12-17  5:30   ` Jason Wang
2020-12-17  5:30     ` Jason Wang
2020-12-15 14:42 ` [PATCH v4 13/18] vdpa_sim: add set_config " Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 14/18] vdpa_sim: set vringh notify callback Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 15/18] vdpa_sim: use kvmalloc to allocate vdpasim->buffer Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 16/18] vdpa_sim: make vdpasim->buffer size configurable Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 17/18] vdpa_sim: split vdpasim_virtqueue's iov field in out_iov and in_iov Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella
2020-12-15 14:42 ` [PATCH v4 18/18] vdpa: split vdpasim to core and net modules Stefano Garzarella
2020-12-15 14:42   ` Stefano Garzarella

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=20201215144256.155342-13-sgarzare@redhat.com \
    --to=sgarzare@redhat.com \
    --cc=elic@nvidia.com \
    --cc=jasowang@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lvivier@redhat.com \
    --cc=mgurtovoy@nvidia.com \
    --cc=mst@redhat.com \
    --cc=oren@nvidia.com \
    --cc=rdunlap@infradead.org \
    --cc=shahafs@nvidia.com \
    --cc=stefanha@redhat.com \
    --cc=virtualization@lists.linux-foundation.org \
    /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.