Commit c2475a9a authored by Zhu Lingshan's avatar Zhu Lingshan Committed by Michael S. Tsirkin
Browse files

vDPA: report virtio-block capacity to user space



This commit allows userspace to query capacity of
a virtio-block device.

Signed-off-by: default avatarZhu Lingshan <lingshan.zhu@intel.com>
Message-Id: <20240218185606.13509-2-lingshan.zhu@intel.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 2b666ee2
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -944,6 +944,38 @@ static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *ms
	return vdpa_dev_net_mq_config_fill(msg, features_device, &config);
}

static int
vdpa_dev_blk_capacity_config_fill(struct sk_buff *msg,
				  const struct virtio_blk_config *config)
{
	u64 val_u64;

	val_u64 = __virtio64_to_cpu(true, config->capacity);

	return nla_put_u64_64bit(msg, VDPA_ATTR_DEV_BLK_CFG_CAPACITY,
				 val_u64, VDPA_ATTR_PAD);
}

static int vdpa_dev_blk_config_fill(struct vdpa_device *vdev,
				    struct sk_buff *msg)
{
	struct virtio_blk_config config = {};
	u64 features_device;

	vdev->config->get_config(vdev, 0, &config, sizeof(config));

	features_device = vdev->config->get_device_features(vdev);

	if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_FEATURES, features_device,
			      VDPA_ATTR_PAD))
		return -EMSGSIZE;

	if (vdpa_dev_blk_capacity_config_fill(msg, &config))
		return -EMSGSIZE;

	return 0;
}

static int
vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
		     int flags, struct netlink_ext_ack *extack)
@@ -988,6 +1020,9 @@ vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid,
	case VIRTIO_ID_NET:
		err = vdpa_dev_net_config_fill(vdev, msg);
		break;
	case VIRTIO_ID_BLOCK:
		err = vdpa_dev_blk_config_fill(vdev, msg);
		break;
	default:
		err = -EOPNOTSUPP;
		break;
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <linux/interrupt.h>
#include <linux/vhost_iotlb.h>
#include <linux/virtio_net.h>
#include <linux/virtio_blk.h>
#include <linux/if_ether.h>

/**
+2 −0
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ enum vdpa_attr {
	/* virtio features that are provisioned to the vDPA device */
	VDPA_ATTR_DEV_FEATURES,                 /* u64 */

	VDPA_ATTR_DEV_BLK_CFG_CAPACITY,		/* u64 */

	/* new attributes must be added above here */
	VDPA_ATTR_MAX,
};