Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * vDPA bus.
   4 *
   5 * Copyright (c) 2020, Red Hat. All rights reserved.
   6 *     Author: Jason Wang <jasowang@redhat.com>
   7 *
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/idr.h>
  12#include <linux/slab.h>
  13#include <linux/vdpa.h>
  14#include <uapi/linux/vdpa.h>
  15#include <net/genetlink.h>
  16#include <linux/mod_devicetable.h>
  17#include <linux/virtio_ids.h>
  18
  19static LIST_HEAD(mdev_head);
  20/* A global mutex that protects vdpa management device and device level operations. */
  21static DECLARE_RWSEM(vdpa_dev_lock);
  22static DEFINE_IDA(vdpa_index_ida);
  23
  24void vdpa_set_status(struct vdpa_device *vdev, u8 status)
  25{
  26	down_write(&vdev->cf_lock);
  27	vdev->config->set_status(vdev, status);
  28	up_write(&vdev->cf_lock);
  29}
  30EXPORT_SYMBOL(vdpa_set_status);
  31
  32static struct genl_family vdpa_nl_family;
  33
  34static int vdpa_dev_probe(struct device *d)
  35{
  36	struct vdpa_device *vdev = dev_to_vdpa(d);
  37	struct vdpa_driver *drv = drv_to_vdpa(vdev->dev.driver);
  38	const struct vdpa_config_ops *ops = vdev->config;
  39	u32 max_num, min_num = 1;
  40	int ret = 0;
  41
  42	d->dma_mask = &d->coherent_dma_mask;
  43	ret = dma_set_mask_and_coherent(d, DMA_BIT_MASK(64));
  44	if (ret)
  45		return ret;
  46
  47	max_num = ops->get_vq_num_max(vdev);
  48	if (ops->get_vq_num_min)
  49		min_num = ops->get_vq_num_min(vdev);
  50	if (max_num < min_num)
  51		return -EINVAL;
  52
  53	if (drv && drv->probe)
  54		ret = drv->probe(vdev);
  55
  56	return ret;
  57}
  58
  59static void vdpa_dev_remove(struct device *d)
  60{
  61	struct vdpa_device *vdev = dev_to_vdpa(d);
  62	struct vdpa_driver *drv = drv_to_vdpa(vdev->dev.driver);
  63
  64	if (drv && drv->remove)
  65		drv->remove(vdev);
  66}
  67
  68static int vdpa_dev_match(struct device *dev, struct device_driver *drv)
  69{
  70	struct vdpa_device *vdev = dev_to_vdpa(dev);
  71
  72	/* Check override first, and if set, only use the named driver */
  73	if (vdev->driver_override)
  74		return strcmp(vdev->driver_override, drv->name) == 0;
  75
  76	/* Currently devices must be supported by all vDPA bus drivers */
  77	return 1;
  78}
  79
  80static ssize_t driver_override_store(struct device *dev,
  81				     struct device_attribute *attr,
  82				     const char *buf, size_t count)
  83{
  84	struct vdpa_device *vdev = dev_to_vdpa(dev);
  85	int ret;
  86
  87	ret = driver_set_override(dev, &vdev->driver_override, buf, count);
  88	if (ret)
  89		return ret;
  90
  91	return count;
  92}
  93
  94static ssize_t driver_override_show(struct device *dev,
  95				    struct device_attribute *attr, char *buf)
  96{
  97	struct vdpa_device *vdev = dev_to_vdpa(dev);
  98	ssize_t len;
  99
 100	device_lock(dev);
 101	len = snprintf(buf, PAGE_SIZE, "%s\n", vdev->driver_override);
 102	device_unlock(dev);
 103
 104	return len;
 105}
 106static DEVICE_ATTR_RW(driver_override);
 107
 108static struct attribute *vdpa_dev_attrs[] = {
 109	&dev_attr_driver_override.attr,
 110	NULL,
 111};
 112
 113static const struct attribute_group vdpa_dev_group = {
 114	.attrs  = vdpa_dev_attrs,
 115};
 116__ATTRIBUTE_GROUPS(vdpa_dev);
 117
 118static const struct bus_type vdpa_bus = {
 119	.name  = "vdpa",
 120	.dev_groups = vdpa_dev_groups,
 121	.match = vdpa_dev_match,
 122	.probe = vdpa_dev_probe,
 123	.remove = vdpa_dev_remove,
 124};
 125
 126static void vdpa_release_dev(struct device *d)
 127{
 128	struct vdpa_device *vdev = dev_to_vdpa(d);
 129	const struct vdpa_config_ops *ops = vdev->config;
 130
 131	if (ops->free)
 132		ops->free(vdev);
 133
 134	ida_free(&vdpa_index_ida, vdev->index);
 135	kfree(vdev->driver_override);
 136	kfree(vdev);
 137}
 138
 139/**
 140 * __vdpa_alloc_device - allocate and initilaize a vDPA device
 141 * This allows driver to some prepartion after device is
 142 * initialized but before registered.
 143 * @parent: the parent device
 144 * @config: the bus operations that is supported by this device
 145 * @ngroups: number of groups supported by this device
 146 * @nas: number of address spaces supported by this device
 147 * @size: size of the parent structure that contains private data
 148 * @name: name of the vdpa device; optional.
 149 * @use_va: indicate whether virtual address must be used by this device
 150 *
 151 * Driver should use vdpa_alloc_device() wrapper macro instead of
 152 * using this directly.
 153 *
 154 * Return: Returns an error when parent/config/dma_dev is not set or fail to get
 155 *	   ida.
 156 */
 157struct vdpa_device *__vdpa_alloc_device(struct device *parent,
 158					const struct vdpa_config_ops *config,
 159					unsigned int ngroups, unsigned int nas,
 160					size_t size, const char *name,
 161					bool use_va)
 162{
 163	struct vdpa_device *vdev;
 164	int err = -EINVAL;
 165
 166	if (!config)
 167		goto err;
 168
 169	if (!!config->dma_map != !!config->dma_unmap)
 170		goto err;
 171
 172	/* It should only work for the device that use on-chip IOMMU */
 173	if (use_va && !(config->dma_map || config->set_map))
 174		goto err;
 175
 176	err = -ENOMEM;
 177	vdev = kzalloc(size, GFP_KERNEL);
 178	if (!vdev)
 179		goto err;
 180
 181	err = ida_alloc(&vdpa_index_ida, GFP_KERNEL);
 182	if (err < 0)
 183		goto err_ida;
 184
 185	vdev->dev.bus = &vdpa_bus;
 186	vdev->dev.parent = parent;
 187	vdev->dev.release = vdpa_release_dev;
 188	vdev->index = err;
 189	vdev->config = config;
 190	vdev->features_valid = false;
 191	vdev->use_va = use_va;
 192	vdev->ngroups = ngroups;
 193	vdev->nas = nas;
 194
 195	if (name)
 196		err = dev_set_name(&vdev->dev, "%s", name);
 197	else
 198		err = dev_set_name(&vdev->dev, "vdpa%u", vdev->index);
 199	if (err)
 200		goto err_name;
 201
 202	init_rwsem(&vdev->cf_lock);
 203	device_initialize(&vdev->dev);
 204
 205	return vdev;
 206
 207err_name:
 208	ida_free(&vdpa_index_ida, vdev->index);
 209err_ida:
 210	kfree(vdev);
 211err:
 212	return ERR_PTR(err);
 213}
 214EXPORT_SYMBOL_GPL(__vdpa_alloc_device);
 215
 216static int vdpa_name_match(struct device *dev, const void *data)
 217{
 218	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
 219
 220	return (strcmp(dev_name(&vdev->dev), data) == 0);
 221}
 222
 223static int __vdpa_register_device(struct vdpa_device *vdev, u32 nvqs)
 224{
 225	struct device *dev;
 226
 227	vdev->nvqs = nvqs;
 228
 229	lockdep_assert_held(&vdpa_dev_lock);
 230	dev = bus_find_device(&vdpa_bus, NULL, dev_name(&vdev->dev), vdpa_name_match);
 231	if (dev) {
 232		put_device(dev);
 233		return -EEXIST;
 234	}
 235	return device_add(&vdev->dev);
 236}
 237
 238/**
 239 * _vdpa_register_device - register a vDPA device with vdpa lock held
 240 * Caller must have a succeed call of vdpa_alloc_device() before.
 241 * Caller must invoke this routine in the management device dev_add()
 242 * callback after setting up valid mgmtdev for this vdpa device.
 243 * @vdev: the vdpa device to be registered to vDPA bus
 244 * @nvqs: number of virtqueues supported by this device
 245 *
 246 * Return: Returns an error when fail to add device to vDPA bus
 247 */
 248int _vdpa_register_device(struct vdpa_device *vdev, u32 nvqs)
 249{
 250	if (!vdev->mdev)
 251		return -EINVAL;
 252
 253	return __vdpa_register_device(vdev, nvqs);
 254}
 255EXPORT_SYMBOL_GPL(_vdpa_register_device);
 256
 257/**
 258 * vdpa_register_device - register a vDPA device
 259 * Callers must have a succeed call of vdpa_alloc_device() before.
 260 * @vdev: the vdpa device to be registered to vDPA bus
 261 * @nvqs: number of virtqueues supported by this device
 262 *
 263 * Return: Returns an error when fail to add to vDPA bus
 264 */
 265int vdpa_register_device(struct vdpa_device *vdev, u32 nvqs)
 266{
 267	int err;
 268
 269	down_write(&vdpa_dev_lock);
 270	err = __vdpa_register_device(vdev, nvqs);
 271	up_write(&vdpa_dev_lock);
 272	return err;
 273}
 274EXPORT_SYMBOL_GPL(vdpa_register_device);
 275
 276/**
 277 * _vdpa_unregister_device - unregister a vDPA device
 278 * Caller must invoke this routine as part of management device dev_del()
 279 * callback.
 280 * @vdev: the vdpa device to be unregisted from vDPA bus
 281 */
 282void _vdpa_unregister_device(struct vdpa_device *vdev)
 283{
 284	lockdep_assert_held(&vdpa_dev_lock);
 285	WARN_ON(!vdev->mdev);
 286	device_unregister(&vdev->dev);
 287}
 288EXPORT_SYMBOL_GPL(_vdpa_unregister_device);
 289
 290/**
 291 * vdpa_unregister_device - unregister a vDPA device
 292 * @vdev: the vdpa device to be unregisted from vDPA bus
 293 */
 294void vdpa_unregister_device(struct vdpa_device *vdev)
 295{
 296	down_write(&vdpa_dev_lock);
 297	device_unregister(&vdev->dev);
 298	up_write(&vdpa_dev_lock);
 299}
 300EXPORT_SYMBOL_GPL(vdpa_unregister_device);
 301
 302/**
 303 * __vdpa_register_driver - register a vDPA device driver
 304 * @drv: the vdpa device driver to be registered
 305 * @owner: module owner of the driver
 306 *
 307 * Return: Returns an err when fail to do the registration
 308 */
 309int __vdpa_register_driver(struct vdpa_driver *drv, struct module *owner)
 310{
 311	drv->driver.bus = &vdpa_bus;
 312	drv->driver.owner = owner;
 313
 314	return driver_register(&drv->driver);
 315}
 316EXPORT_SYMBOL_GPL(__vdpa_register_driver);
 317
 318/**
 319 * vdpa_unregister_driver - unregister a vDPA device driver
 320 * @drv: the vdpa device driver to be unregistered
 321 */
 322void vdpa_unregister_driver(struct vdpa_driver *drv)
 323{
 324	driver_unregister(&drv->driver);
 325}
 326EXPORT_SYMBOL_GPL(vdpa_unregister_driver);
 327
 328/**
 329 * vdpa_mgmtdev_register - register a vdpa management device
 330 *
 331 * @mdev: Pointer to vdpa management device
 332 * vdpa_mgmtdev_register() register a vdpa management device which supports
 333 * vdpa device management.
 334 * Return: Returns 0 on success or failure when required callback ops are not
 335 *         initialized.
 336 */
 337int vdpa_mgmtdev_register(struct vdpa_mgmt_dev *mdev)
 338{
 339	if (!mdev->device || !mdev->ops || !mdev->ops->dev_add || !mdev->ops->dev_del)
 340		return -EINVAL;
 341
 342	INIT_LIST_HEAD(&mdev->list);
 343	down_write(&vdpa_dev_lock);
 344	list_add_tail(&mdev->list, &mdev_head);
 345	up_write(&vdpa_dev_lock);
 346	return 0;
 347}
 348EXPORT_SYMBOL_GPL(vdpa_mgmtdev_register);
 349
 350static int vdpa_match_remove(struct device *dev, void *data)
 351{
 352	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
 353	struct vdpa_mgmt_dev *mdev = vdev->mdev;
 354
 355	if (mdev == data)
 356		mdev->ops->dev_del(mdev, vdev);
 357	return 0;
 358}
 359
 360void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev)
 361{
 362	down_write(&vdpa_dev_lock);
 363
 364	list_del(&mdev->list);
 365
 366	/* Filter out all the entries belong to this management device and delete it. */
 367	bus_for_each_dev(&vdpa_bus, NULL, mdev, vdpa_match_remove);
 368
 369	up_write(&vdpa_dev_lock);
 370}
 371EXPORT_SYMBOL_GPL(vdpa_mgmtdev_unregister);
 372
 373static void vdpa_get_config_unlocked(struct vdpa_device *vdev,
 374				     unsigned int offset,
 375				     void *buf, unsigned int len)
 376{
 377	const struct vdpa_config_ops *ops = vdev->config;
 378
 379	/*
 380	 * Config accesses aren't supposed to trigger before features are set.
 381	 * If it does happen we assume a legacy guest.
 382	 */
 383	if (!vdev->features_valid)
 384		vdpa_set_features_unlocked(vdev, 0);
 385	ops->get_config(vdev, offset, buf, len);
 386}
 387
 388/**
 389 * vdpa_get_config - Get one or more device configuration fields.
 390 * @vdev: vdpa device to operate on
 391 * @offset: starting byte offset of the field
 392 * @buf: buffer pointer to read to
 393 * @len: length of the configuration fields in bytes
 394 */
 395void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
 396		     void *buf, unsigned int len)
 397{
 398	down_read(&vdev->cf_lock);
 399	vdpa_get_config_unlocked(vdev, offset, buf, len);
 400	up_read(&vdev->cf_lock);
 401}
 402EXPORT_SYMBOL_GPL(vdpa_get_config);
 403
 404/**
 405 * vdpa_set_config - Set one or more device configuration fields.
 406 * @vdev: vdpa device to operate on
 407 * @offset: starting byte offset of the field
 408 * @buf: buffer pointer to read from
 409 * @length: length of the configuration fields in bytes
 410 */
 411void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
 412		     const void *buf, unsigned int length)
 413{
 414	down_write(&vdev->cf_lock);
 415	vdev->config->set_config(vdev, offset, buf, length);
 416	up_write(&vdev->cf_lock);
 417}
 418EXPORT_SYMBOL_GPL(vdpa_set_config);
 419
 420static bool mgmtdev_handle_match(const struct vdpa_mgmt_dev *mdev,
 421				 const char *busname, const char *devname)
 422{
 423	/* Bus name is optional for simulated management device, so ignore the
 424	 * device with bus if bus attribute is provided.
 425	 */
 426	if ((busname && !mdev->device->bus) || (!busname && mdev->device->bus))
 427		return false;
 428
 429	if (!busname && strcmp(dev_name(mdev->device), devname) == 0)
 430		return true;
 431
 432	if (busname && (strcmp(mdev->device->bus->name, busname) == 0) &&
 433	    (strcmp(dev_name(mdev->device), devname) == 0))
 434		return true;
 435
 436	return false;
 437}
 438
 439static struct vdpa_mgmt_dev *vdpa_mgmtdev_get_from_attr(struct nlattr **attrs)
 440{
 441	struct vdpa_mgmt_dev *mdev;
 442	const char *busname = NULL;
 443	const char *devname;
 444
 445	if (!attrs[VDPA_ATTR_MGMTDEV_DEV_NAME])
 446		return ERR_PTR(-EINVAL);
 447	devname = nla_data(attrs[VDPA_ATTR_MGMTDEV_DEV_NAME]);
 448	if (attrs[VDPA_ATTR_MGMTDEV_BUS_NAME])
 449		busname = nla_data(attrs[VDPA_ATTR_MGMTDEV_BUS_NAME]);
 450
 451	list_for_each_entry(mdev, &mdev_head, list) {
 452		if (mgmtdev_handle_match(mdev, busname, devname))
 453			return mdev;
 454	}
 455	return ERR_PTR(-ENODEV);
 456}
 457
 458static int vdpa_nl_mgmtdev_handle_fill(struct sk_buff *msg, const struct vdpa_mgmt_dev *mdev)
 459{
 460	if (mdev->device->bus &&
 461	    nla_put_string(msg, VDPA_ATTR_MGMTDEV_BUS_NAME, mdev->device->bus->name))
 462		return -EMSGSIZE;
 463	if (nla_put_string(msg, VDPA_ATTR_MGMTDEV_DEV_NAME, dev_name(mdev->device)))
 464		return -EMSGSIZE;
 465	return 0;
 466}
 467
 468static u64 vdpa_mgmtdev_get_classes(const struct vdpa_mgmt_dev *mdev,
 469				    unsigned int *nclasses)
 470{
 471	u64 supported_classes = 0;
 472	unsigned int n = 0;
 473
 474	for (int i = 0; mdev->id_table[i].device; i++) {
 475		if (mdev->id_table[i].device > 63)
 476			continue;
 477		supported_classes |= BIT_ULL(mdev->id_table[i].device);
 478		n++;
 479	}
 480	if (nclasses)
 481		*nclasses = n;
 482
 483	return supported_classes;
 484}
 485
 486static int vdpa_mgmtdev_fill(const struct vdpa_mgmt_dev *mdev, struct sk_buff *msg,
 487			     u32 portid, u32 seq, int flags)
 488{
 489	void *hdr;
 490	int err;
 491
 492	hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_MGMTDEV_NEW);
 493	if (!hdr)
 494		return -EMSGSIZE;
 495	err = vdpa_nl_mgmtdev_handle_fill(msg, mdev);
 496	if (err)
 497		goto msg_err;
 498
 499	if (nla_put_u64_64bit(msg, VDPA_ATTR_MGMTDEV_SUPPORTED_CLASSES,
 500			      vdpa_mgmtdev_get_classes(mdev, NULL),
 501			      VDPA_ATTR_UNSPEC)) {
 502		err = -EMSGSIZE;
 503		goto msg_err;
 504	}
 505	if (nla_put_u32(msg, VDPA_ATTR_DEV_MGMTDEV_MAX_VQS,
 506			mdev->max_supported_vqs)) {
 507		err = -EMSGSIZE;
 508		goto msg_err;
 509	}
 510	if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_SUPPORTED_FEATURES,
 511			      mdev->supported_features, VDPA_ATTR_PAD)) {
 512		err = -EMSGSIZE;
 513		goto msg_err;
 514	}
 515
 516	genlmsg_end(msg, hdr);
 517	return 0;
 518
 519msg_err:
 520	genlmsg_cancel(msg, hdr);
 521	return err;
 522}
 523
 524static int vdpa_nl_cmd_mgmtdev_get_doit(struct sk_buff *skb, struct genl_info *info)
 525{
 526	struct vdpa_mgmt_dev *mdev;
 527	struct sk_buff *msg;
 528	int err;
 529
 530	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 531	if (!msg)
 532		return -ENOMEM;
 533
 534	down_read(&vdpa_dev_lock);
 535	mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
 536	if (IS_ERR(mdev)) {
 537		up_read(&vdpa_dev_lock);
 538		NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified mgmt device");
 539		err = PTR_ERR(mdev);
 540		goto out;
 541	}
 542
 543	err = vdpa_mgmtdev_fill(mdev, msg, info->snd_portid, info->snd_seq, 0);
 544	up_read(&vdpa_dev_lock);
 545	if (err)
 546		goto out;
 547	err = genlmsg_reply(msg, info);
 548	return err;
 549
 550out:
 551	nlmsg_free(msg);
 552	return err;
 553}
 554
 555static int
 556vdpa_nl_cmd_mgmtdev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
 557{
 558	struct vdpa_mgmt_dev *mdev;
 559	int start = cb->args[0];
 560	int idx = 0;
 561	int err;
 562
 563	down_read(&vdpa_dev_lock);
 564	list_for_each_entry(mdev, &mdev_head, list) {
 565		if (idx < start) {
 566			idx++;
 567			continue;
 568		}
 569		err = vdpa_mgmtdev_fill(mdev, msg, NETLINK_CB(cb->skb).portid,
 570					cb->nlh->nlmsg_seq, NLM_F_MULTI);
 571		if (err)
 572			goto out;
 573		idx++;
 574	}
 575out:
 576	up_read(&vdpa_dev_lock);
 577	cb->args[0] = idx;
 578	return msg->len;
 579}
 580
 581#define VDPA_DEV_NET_ATTRS_MASK (BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MACADDR) | \
 582				 BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU)     | \
 583				 BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP))
 584
 585/*
 586 * Bitmask for all per-device features: feature bits VIRTIO_TRANSPORT_F_START
 587 * through VIRTIO_TRANSPORT_F_END are unset, i.e. 0xfffffc000fffffff for
 588 * all 64bit features. If the features are extended beyond 64 bits, or new
 589 * "holes" are reserved for other type of features than per-device, this
 590 * macro would have to be updated.
 591 */
 592#define VIRTIO_DEVICE_F_MASK (~0ULL << (VIRTIO_TRANSPORT_F_END + 1) | \
 593			      ((1ULL << VIRTIO_TRANSPORT_F_START) - 1))
 594
 595static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *info)
 596{
 597	struct vdpa_dev_set_config config = {};
 598	struct nlattr **nl_attrs = info->attrs;
 599	struct vdpa_mgmt_dev *mdev;
 600	unsigned int ncls = 0;
 601	const u8 *macaddr;
 602	const char *name;
 603	u64 classes;
 604	int err = 0;
 605
 606	if (!info->attrs[VDPA_ATTR_DEV_NAME])
 607		return -EINVAL;
 608
 609	name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 610
 611	if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
 612		macaddr = nla_data(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
 613		memcpy(config.net.mac, macaddr, sizeof(config.net.mac));
 614		config.mask |= BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MACADDR);
 615	}
 616	if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]) {
 617		config.net.mtu =
 618			nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]);
 619		config.mask |= BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU);
 620	}
 621	if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MAX_VQP]) {
 622		config.net.max_vq_pairs =
 623			nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MAX_VQP]);
 624		if (!config.net.max_vq_pairs) {
 625			NL_SET_ERR_MSG_MOD(info->extack,
 626					   "At least one pair of VQs is required");
 627			return -EINVAL;
 628		}
 629		config.mask |= BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP);
 630	}
 631	if (nl_attrs[VDPA_ATTR_DEV_FEATURES]) {
 632		u64 missing = 0x0ULL;
 633
 634		config.device_features =
 635			nla_get_u64(nl_attrs[VDPA_ATTR_DEV_FEATURES]);
 636		if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR] &&
 637		    !(config.device_features & BIT_ULL(VIRTIO_NET_F_MAC)))
 638			missing |= BIT_ULL(VIRTIO_NET_F_MAC);
 639		if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU] &&
 640		    !(config.device_features & BIT_ULL(VIRTIO_NET_F_MTU)))
 641			missing |= BIT_ULL(VIRTIO_NET_F_MTU);
 642		if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MAX_VQP] &&
 643		    config.net.max_vq_pairs > 1 &&
 644		    !(config.device_features & BIT_ULL(VIRTIO_NET_F_MQ)))
 645			missing |= BIT_ULL(VIRTIO_NET_F_MQ);
 646		if (missing) {
 647			NL_SET_ERR_MSG_FMT_MOD(info->extack,
 648					       "Missing features 0x%llx for provided attributes",
 649					       missing);
 650			return -EINVAL;
 651		}
 652		config.mask |= BIT_ULL(VDPA_ATTR_DEV_FEATURES);
 653	}
 654
 655	/* Skip checking capability if user didn't prefer to configure any
 656	 * device networking attributes. It is likely that user might have used
 657	 * a device specific method to configure such attributes or using device
 658	 * default attributes.
 659	 */
 660	if ((config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
 661	    !netlink_capable(skb, CAP_NET_ADMIN))
 662		return -EPERM;
 663
 664	down_write(&vdpa_dev_lock);
 665	mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
 666	if (IS_ERR(mdev)) {
 667		NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified management device");
 668		err = PTR_ERR(mdev);
 669		goto err;
 670	}
 671
 672	if ((config.mask & mdev->config_attr_mask) != config.mask) {
 673		NL_SET_ERR_MSG_FMT_MOD(info->extack,
 674				       "Some provided attributes are not supported: 0x%llx",
 675				       config.mask & ~mdev->config_attr_mask);
 676		err = -EOPNOTSUPP;
 677		goto err;
 678	}
 679
 680	classes = vdpa_mgmtdev_get_classes(mdev, &ncls);
 681	if (config.mask & VDPA_DEV_NET_ATTRS_MASK &&
 682	    !(classes & BIT_ULL(VIRTIO_ID_NET))) {
 683		NL_SET_ERR_MSG_MOD(info->extack,
 684				   "Network class attributes provided on unsupported management device");
 685		err = -EINVAL;
 686		goto err;
 687	}
 688	if (!(config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
 689	    config.mask & BIT_ULL(VDPA_ATTR_DEV_FEATURES) &&
 690	    classes & BIT_ULL(VIRTIO_ID_NET) && ncls > 1 &&
 691	    config.device_features & VIRTIO_DEVICE_F_MASK) {
 692		NL_SET_ERR_MSG_MOD(info->extack,
 693				   "Management device supports multi-class while device features specified are ambiguous");
 694		err = -EINVAL;
 695		goto err;
 696	}
 697
 698	err = mdev->ops->dev_add(mdev, name, &config);
 699err:
 700	up_write(&vdpa_dev_lock);
 701	return err;
 702}
 703
 704static int vdpa_nl_cmd_dev_del_set_doit(struct sk_buff *skb, struct genl_info *info)
 705{
 706	struct vdpa_mgmt_dev *mdev;
 707	struct vdpa_device *vdev;
 708	struct device *dev;
 709	const char *name;
 710	int err = 0;
 711
 712	if (!info->attrs[VDPA_ATTR_DEV_NAME])
 713		return -EINVAL;
 714	name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 715
 716	down_write(&vdpa_dev_lock);
 717	dev = bus_find_device(&vdpa_bus, NULL, name, vdpa_name_match);
 718	if (!dev) {
 719		NL_SET_ERR_MSG_MOD(info->extack, "device not found");
 720		err = -ENODEV;
 721		goto dev_err;
 722	}
 723	vdev = container_of(dev, struct vdpa_device, dev);
 724	if (!vdev->mdev) {
 725		NL_SET_ERR_MSG_MOD(info->extack, "Only user created device can be deleted by user");
 726		err = -EINVAL;
 727		goto mdev_err;
 728	}
 729	mdev = vdev->mdev;
 730	mdev->ops->dev_del(mdev, vdev);
 731mdev_err:
 732	put_device(dev);
 733dev_err:
 734	up_write(&vdpa_dev_lock);
 735	return err;
 736}
 737
 738static int
 739vdpa_dev_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
 740	      int flags, struct netlink_ext_ack *extack)
 741{
 742	u16 max_vq_size;
 743	u16 min_vq_size = 1;
 744	u32 device_id;
 745	u32 vendor_id;
 746	void *hdr;
 747	int err;
 748
 749	hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_DEV_NEW);
 750	if (!hdr)
 751		return -EMSGSIZE;
 752
 753	err = vdpa_nl_mgmtdev_handle_fill(msg, vdev->mdev);
 754	if (err)
 755		goto msg_err;
 756
 757	device_id = vdev->config->get_device_id(vdev);
 758	vendor_id = vdev->config->get_vendor_id(vdev);
 759	max_vq_size = vdev->config->get_vq_num_max(vdev);
 760	if (vdev->config->get_vq_num_min)
 761		min_vq_size = vdev->config->get_vq_num_min(vdev);
 762
 763	err = -EMSGSIZE;
 764	if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev)))
 765		goto msg_err;
 766	if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id))
 767		goto msg_err;
 768	if (nla_put_u32(msg, VDPA_ATTR_DEV_VENDOR_ID, vendor_id))
 769		goto msg_err;
 770	if (nla_put_u32(msg, VDPA_ATTR_DEV_MAX_VQS, vdev->nvqs))
 771		goto msg_err;
 772	if (nla_put_u16(msg, VDPA_ATTR_DEV_MAX_VQ_SIZE, max_vq_size))
 773		goto msg_err;
 774	if (nla_put_u16(msg, VDPA_ATTR_DEV_MIN_VQ_SIZE, min_vq_size))
 775		goto msg_err;
 776
 777	genlmsg_end(msg, hdr);
 778	return 0;
 779
 780msg_err:
 781	genlmsg_cancel(msg, hdr);
 782	return err;
 783}
 784
 785static int vdpa_nl_cmd_dev_get_doit(struct sk_buff *skb, struct genl_info *info)
 786{
 787	struct vdpa_device *vdev;
 788	struct sk_buff *msg;
 789	const char *devname;
 790	struct device *dev;
 791	int err;
 792
 793	if (!info->attrs[VDPA_ATTR_DEV_NAME])
 794		return -EINVAL;
 795	devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
 796	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
 797	if (!msg)
 798		return -ENOMEM;
 799
 800	down_read(&vdpa_dev_lock);
 801	dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
 802	if (!dev) {
 803		NL_SET_ERR_MSG_MOD(info->extack, "device not found");
 804		err = -ENODEV;
 805		goto err;
 806	}
 807	vdev = container_of(dev, struct vdpa_device, dev);
 808	if (!vdev->mdev) {
 809		err = -EINVAL;
 810		goto mdev_err;
 811	}
 812	err = vdpa_dev_fill(vdev, msg, info->snd_portid, info->snd_seq, 0, info->extack);
 813	if (err)
 814		goto mdev_err;
 815
 816	err = genlmsg_reply(msg, info);
 817	put_device(dev);
 818	up_read(&vdpa_dev_lock);
 819	return err;
 820
 821mdev_err:
 822	put_device(dev);
 823err:
 824	up_read(&vdpa_dev_lock);
 825	nlmsg_free(msg);
 826	return err;
 827}
 828
 829struct vdpa_dev_dump_info {
 830	struct sk_buff *msg;
 831	struct netlink_callback *cb;
 832	int start_idx;
 833	int idx;
 834};
 835
 836static int vdpa_dev_dump(struct device *dev, void *data)
 837{
 838	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
 839	struct vdpa_dev_dump_info *info = data;
 840	int err;
 841
 842	if (!vdev->mdev)
 843		return 0;
 844	if (info->idx < info->start_idx) {
 845		info->idx++;
 846		return 0;
 847	}
 848	err = vdpa_dev_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
 849			    info->cb->nlh->nlmsg_seq, NLM_F_MULTI, info->cb->extack);
 850	if (err)
 851		return err;
 852
 853	info->idx++;
 854	return 0;
 855}
 856
 857static int vdpa_nl_cmd_dev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
 858{
 859	struct vdpa_dev_dump_info info;
 860
 861	info.msg = msg;
 862	info.cb = cb;
 863	info.start_idx = cb->args[0];
 864	info.idx = 0;
 865
 866	down_read(&vdpa_dev_lock);
 867	bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_dump);
 868	up_read(&vdpa_dev_lock);
 869	cb->args[0] = info.idx;
 870	return msg->len;
 871}
 872
 873static int vdpa_dev_net_mq_config_fill(struct sk_buff *msg, u64 features,
 874				       const struct virtio_net_config *config)
 875{
 876	u16 val_u16;
 877
 878	if ((features & BIT_ULL(VIRTIO_NET_F_MQ)) == 0 &&
 879	    (features & BIT_ULL(VIRTIO_NET_F_RSS)) == 0)
 880		return 0;
 881
 882	val_u16 = __virtio16_to_cpu(true, config->max_virtqueue_pairs);
 883
 884	return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16);
 885}
 886
 887static int vdpa_dev_net_mtu_config_fill(struct sk_buff *msg, u64 features,
 888					const struct virtio_net_config *config)
 889{
 890	u16 val_u16;
 891
 892	if ((features & BIT_ULL(VIRTIO_NET_F_MTU)) == 0)
 893		return 0;
 894
 895	val_u16 = __virtio16_to_cpu(true, config->mtu);
 896
 897	return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16);
 898}
 899
 900static int vdpa_dev_net_mac_config_fill(struct sk_buff *msg, u64 features,
 901					const struct virtio_net_config *config)
 902{
 903	if ((features & BIT_ULL(VIRTIO_NET_F_MAC)) == 0)
 904		return 0;
 905
 906	return  nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR,
 907			sizeof(config->mac), config->mac);
 908}
 909
 910static int vdpa_dev_net_status_config_fill(struct sk_buff *msg, u64 features,
 911					   const struct virtio_net_config *config)
 912{
 913	u16 val_u16;
 914
 915	if ((features & BIT_ULL(VIRTIO_NET_F_STATUS)) == 0)
 916		return 0;
 917
 918	val_u16 = __virtio16_to_cpu(true, config->status);
 919	return nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16);
 920}
 921
 922static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg)
 923{
 924	struct virtio_net_config config = {};
 925	u64 features_device;
 926
 927	vdev->config->get_config(vdev, 0, &config, sizeof(config));
 928
 929	features_device = vdev->config->get_device_features(vdev);
 930
 931	if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_FEATURES, features_device,
 932			      VDPA_ATTR_PAD))
 933		return -EMSGSIZE;
 934
 935	if (vdpa_dev_net_mtu_config_fill(msg, features_device, &config))
 936		return -EMSGSIZE;
 937
 938	if (vdpa_dev_net_mac_config_fill(msg, features_device, &config))
 939		return -EMSGSIZE;
 940
 941	if (vdpa_dev_net_status_config_fill(msg, features_device, &config))
 942		return -EMSGSIZE;
 943
 944	return vdpa_dev_net_mq_config_fill(msg, features_device, &config);
 945}
 946
 947static int
 948vdpa_dev_blk_capacity_config_fill(struct sk_buff *msg,
 949				  const struct virtio_blk_config *config)
 950{
 951	u64 val_u64;
 952
 953	val_u64 = __virtio64_to_cpu(true, config->capacity);
 954
 955	return nla_put_u64_64bit(msg, VDPA_ATTR_DEV_BLK_CFG_CAPACITY,
 956				 val_u64, VDPA_ATTR_PAD);
 957}
 958
 959static int
 960vdpa_dev_blk_seg_size_config_fill(struct sk_buff *msg, u64 features,
 961				  const struct virtio_blk_config *config)
 962{
 963	u32 val_u32;
 964
 965	if ((features & BIT_ULL(VIRTIO_BLK_F_SIZE_MAX)) == 0)
 966		return 0;
 967
 968	val_u32 = __virtio32_to_cpu(true, config->size_max);
 969
 970	return nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_SIZE_MAX, val_u32);
 971}
 972
 973/* fill the block size*/
 974static int
 975vdpa_dev_blk_block_size_config_fill(struct sk_buff *msg, u64 features,
 976				    const struct virtio_blk_config *config)
 977{
 978	u32 val_u32;
 979
 980	if ((features & BIT_ULL(VIRTIO_BLK_F_BLK_SIZE)) == 0)
 981		return 0;
 982
 983	val_u32 = __virtio32_to_cpu(true, config->blk_size);
 984
 985	return nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_BLK_SIZE, val_u32);
 986}
 987
 988static int
 989vdpa_dev_blk_seg_max_config_fill(struct sk_buff *msg, u64 features,
 990				 const struct virtio_blk_config *config)
 991{
 992	u32 val_u32;
 993
 994	if ((features & BIT_ULL(VIRTIO_BLK_F_SEG_MAX)) == 0)
 995		return 0;
 996
 997	val_u32 = __virtio32_to_cpu(true, config->seg_max);
 998
 999	return nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_SEG_MAX, val_u32);
1000}
1001
1002static int vdpa_dev_blk_mq_config_fill(struct sk_buff *msg, u64 features,
1003				       const struct virtio_blk_config *config)
1004{
1005	u16 val_u16;
1006
1007	if ((features & BIT_ULL(VIRTIO_BLK_F_MQ)) == 0)
1008		return 0;
1009
1010	val_u16 = __virtio16_to_cpu(true, config->num_queues);
1011
1012	return nla_put_u16(msg, VDPA_ATTR_DEV_BLK_CFG_NUM_QUEUES, val_u16);
1013}
1014
1015static int vdpa_dev_blk_topology_config_fill(struct sk_buff *msg, u64 features,
1016				       const struct virtio_blk_config *config)
1017{
1018	u16 min_io_size;
1019	u32 opt_io_size;
1020
1021	if ((features & BIT_ULL(VIRTIO_BLK_F_TOPOLOGY)) == 0)
1022		return 0;
1023
1024	min_io_size = __virtio16_to_cpu(true, config->min_io_size);
1025	opt_io_size = __virtio32_to_cpu(true, config->opt_io_size);
1026
1027	if (nla_put_u8(msg, VDPA_ATTR_DEV_BLK_CFG_PHY_BLK_EXP,
1028	    config->physical_block_exp))
1029		return -EMSGSIZE;
1030
1031	if (nla_put_u8(msg, VDPA_ATTR_DEV_BLK_CFG_ALIGN_OFFSET,
1032	    config->alignment_offset))
1033		return -EMSGSIZE;
1034
1035	if (nla_put_u16(msg, VDPA_ATTR_DEV_BLK_CFG_MIN_IO_SIZE, min_io_size))
1036		return -EMSGSIZE;
1037
1038	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_OPT_IO_SIZE, opt_io_size))
1039		return -EMSGSIZE;
1040
1041	return 0;
1042}
1043
1044static int vdpa_dev_blk_discard_config_fill(struct sk_buff *msg, u64 features,
1045				       const struct virtio_blk_config *config)
1046{
1047	u32 val_u32;
1048
1049	if ((features & BIT_ULL(VIRTIO_BLK_F_DISCARD)) == 0)
1050		return 0;
1051
1052	val_u32 = __virtio32_to_cpu(true, config->max_discard_sectors);
1053	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_MAX_DISCARD_SEC, val_u32))
1054		return -EMSGSIZE;
1055
1056	val_u32 = __virtio32_to_cpu(true, config->max_discard_seg);
1057	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_MAX_DISCARD_SEG, val_u32))
1058		return -EMSGSIZE;
1059
1060	val_u32 = __virtio32_to_cpu(true, config->discard_sector_alignment);
1061	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_DISCARD_SEC_ALIGN, val_u32))
1062		return -EMSGSIZE;
1063
1064	return 0;
1065}
1066
1067static int
1068vdpa_dev_blk_write_zeroes_config_fill(struct sk_buff *msg, u64 features,
1069				     const struct virtio_blk_config *config)
1070{
1071	u32 val_u32;
1072
1073	if ((features & BIT_ULL(VIRTIO_BLK_F_WRITE_ZEROES)) == 0)
1074		return 0;
1075
1076	val_u32 = __virtio32_to_cpu(true, config->max_write_zeroes_sectors);
1077	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_MAX_WRITE_ZEROES_SEC, val_u32))
1078		return -EMSGSIZE;
1079
1080	val_u32 = __virtio32_to_cpu(true, config->max_write_zeroes_seg);
1081	if (nla_put_u32(msg, VDPA_ATTR_DEV_BLK_CFG_MAX_WRITE_ZEROES_SEG, val_u32))
1082		return -EMSGSIZE;
1083
1084	return 0;
1085}
1086
1087static int vdpa_dev_blk_ro_config_fill(struct sk_buff *msg, u64 features)
1088{
1089	u8 ro;
1090
1091	ro = ((features & BIT_ULL(VIRTIO_BLK_F_RO)) == 0) ? 0 : 1;
1092	if (nla_put_u8(msg, VDPA_ATTR_DEV_BLK_READ_ONLY, ro))
1093		return -EMSGSIZE;
1094
1095	return 0;
1096}
1097
1098static int vdpa_dev_blk_flush_config_fill(struct sk_buff *msg, u64 features)
1099{
1100	u8 flush;
1101
1102	flush = ((features & BIT_ULL(VIRTIO_BLK_F_FLUSH)) == 0) ? 0 : 1;
1103	if (nla_put_u8(msg, VDPA_ATTR_DEV_BLK_FLUSH, flush))
1104		return -EMSGSIZE;
1105
1106	return 0;
1107}
1108
1109static int vdpa_dev_blk_config_fill(struct vdpa_device *vdev,
1110				    struct sk_buff *msg)
1111{
1112	struct virtio_blk_config config = {};
1113	u64 features_device;
1114
1115	vdev->config->get_config(vdev, 0, &config, sizeof(config));
1116
1117	features_device = vdev->config->get_device_features(vdev);
1118
1119	if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_FEATURES, features_device,
1120			      VDPA_ATTR_PAD))
1121		return -EMSGSIZE;
1122
1123	if (vdpa_dev_blk_capacity_config_fill(msg, &config))
1124		return -EMSGSIZE;
1125
1126	if (vdpa_dev_blk_seg_size_config_fill(msg, features_device, &config))
1127		return -EMSGSIZE;
1128
1129	if (vdpa_dev_blk_block_size_config_fill(msg, features_device, &config))
1130		return -EMSGSIZE;
1131
1132	if (vdpa_dev_blk_seg_max_config_fill(msg, features_device, &config))
1133		return -EMSGSIZE;
1134
1135	if (vdpa_dev_blk_mq_config_fill(msg, features_device, &config))
1136		return -EMSGSIZE;
1137
1138	if (vdpa_dev_blk_topology_config_fill(msg, features_device, &config))
1139		return -EMSGSIZE;
1140
1141	if (vdpa_dev_blk_discard_config_fill(msg, features_device, &config))
1142		return -EMSGSIZE;
1143
1144	if (vdpa_dev_blk_write_zeroes_config_fill(msg, features_device, &config))
1145		return -EMSGSIZE;
1146
1147	if (vdpa_dev_blk_ro_config_fill(msg, features_device))
1148		return -EMSGSIZE;
1149
1150	if (vdpa_dev_blk_flush_config_fill(msg, features_device))
1151		return -EMSGSIZE;
1152
1153	return 0;
1154}
1155
1156static int
1157vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
1158		     int flags, struct netlink_ext_ack *extack)
1159{
1160	u64 features_driver;
1161	u8 status = 0;
1162	u32 device_id;
1163	void *hdr;
1164	int err;
1165
1166	down_read(&vdev->cf_lock);
1167	hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags,
1168			  VDPA_CMD_DEV_CONFIG_GET);
1169	if (!hdr) {
1170		err = -EMSGSIZE;
1171		goto out;
1172	}
1173
1174	if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev))) {
1175		err = -EMSGSIZE;
1176		goto msg_err;
1177	}
1178
1179	device_id = vdev->config->get_device_id(vdev);
1180	if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id)) {
1181		err = -EMSGSIZE;
1182		goto msg_err;
1183	}
1184
1185	/* only read driver features after the feature negotiation is done */
1186	status = vdev->config->get_status(vdev);
1187	if (status & VIRTIO_CONFIG_S_FEATURES_OK) {
1188		features_driver = vdev->config->get_driver_features(vdev);
1189		if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_NEGOTIATED_FEATURES, features_driver,
1190				      VDPA_ATTR_PAD)) {
1191			err = -EMSGSIZE;
1192			goto msg_err;
1193		}
1194	}
1195
1196	switch (device_id) {
1197	case VIRTIO_ID_NET:
1198		err = vdpa_dev_net_config_fill(vdev, msg);
1199		break;
1200	case VIRTIO_ID_BLOCK:
1201		err = vdpa_dev_blk_config_fill(vdev, msg);
1202		break;
1203	default:
1204		err = -EOPNOTSUPP;
1205		break;
1206	}
1207	if (err)
1208		goto msg_err;
1209
1210	up_read(&vdev->cf_lock);
1211	genlmsg_end(msg, hdr);
1212	return 0;
1213
1214msg_err:
1215	genlmsg_cancel(msg, hdr);
1216out:
1217	up_read(&vdev->cf_lock);
1218	return err;
1219}
1220
1221static int vdpa_fill_stats_rec(struct vdpa_device *vdev, struct sk_buff *msg,
1222			       struct genl_info *info, u32 index)
1223{
1224	struct virtio_net_config config = {};
1225	u64 features;
1226	u8 status;
1227	int err;
1228
1229	status = vdev->config->get_status(vdev);
1230	if (!(status & VIRTIO_CONFIG_S_FEATURES_OK)) {
1231		NL_SET_ERR_MSG_MOD(info->extack, "feature negotiation not complete");
1232		return -EAGAIN;
1233	}
1234	vdpa_get_config_unlocked(vdev, 0, &config, sizeof(config));
1235
1236	features = vdev->config->get_driver_features(vdev);
1237	if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_NEGOTIATED_FEATURES,
1238			      features, VDPA_ATTR_PAD))
1239		return -EMSGSIZE;
1240
1241	err = vdpa_dev_net_mq_config_fill(msg, features, &config);
1242	if (err)
1243		return err;
1244
1245	if (nla_put_u32(msg, VDPA_ATTR_DEV_QUEUE_INDEX, index))
1246		return -EMSGSIZE;
1247
1248	err = vdev->config->get_vendor_vq_stats(vdev, index, msg, info->extack);
1249	if (err)
1250		return err;
1251
1252	return 0;
1253}
1254
1255static int vendor_stats_fill(struct vdpa_device *vdev, struct sk_buff *msg,
1256			     struct genl_info *info, u32 index)
1257{
1258	int err;
1259
1260	down_read(&vdev->cf_lock);
1261	if (!vdev->config->get_vendor_vq_stats) {
1262		err = -EOPNOTSUPP;
1263		goto out;
1264	}
1265
1266	err = vdpa_fill_stats_rec(vdev, msg, info, index);
1267out:
1268	up_read(&vdev->cf_lock);
1269	return err;
1270}
1271
1272static int vdpa_dev_vendor_stats_fill(struct vdpa_device *vdev,
1273				      struct sk_buff *msg,
1274				      struct genl_info *info, u32 index)
1275{
1276	u32 device_id;
1277	void *hdr;
1278	int err;
1279	u32 portid = info->snd_portid;
1280	u32 seq = info->snd_seq;
1281	u32 flags = 0;
1282
1283	hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags,
1284			  VDPA_CMD_DEV_VSTATS_GET);
1285	if (!hdr)
1286		return -EMSGSIZE;
1287
1288	if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev))) {
1289		err = -EMSGSIZE;
1290		goto undo_msg;
1291	}
1292
1293	device_id = vdev->config->get_device_id(vdev);
1294	if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id)) {
1295		err = -EMSGSIZE;
1296		goto undo_msg;
1297	}
1298
1299	switch (device_id) {
1300	case VIRTIO_ID_NET:
1301		if (index > VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX) {
1302			NL_SET_ERR_MSG_MOD(info->extack, "queue index exceeds max value");
1303			err = -ERANGE;
1304			break;
1305		}
1306
1307		err = vendor_stats_fill(vdev, msg, info, index);
1308		break;
1309	default:
1310		err = -EOPNOTSUPP;
1311		break;
1312	}
1313	genlmsg_end(msg, hdr);
1314
1315	return err;
1316
1317undo_msg:
1318	genlmsg_cancel(msg, hdr);
1319	return err;
1320}
1321
1322static int vdpa_nl_cmd_dev_config_get_doit(struct sk_buff *skb, struct genl_info *info)
1323{
1324	struct vdpa_device *vdev;
1325	struct sk_buff *msg;
1326	const char *devname;
1327	struct device *dev;
1328	int err;
1329
1330	if (!info->attrs[VDPA_ATTR_DEV_NAME])
1331		return -EINVAL;
1332	devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
1333	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1334	if (!msg)
1335		return -ENOMEM;
1336
1337	down_read(&vdpa_dev_lock);
1338	dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
1339	if (!dev) {
1340		NL_SET_ERR_MSG_MOD(info->extack, "device not found");
1341		err = -ENODEV;
1342		goto dev_err;
1343	}
1344	vdev = container_of(dev, struct vdpa_device, dev);
1345	if (!vdev->mdev) {
1346		NL_SET_ERR_MSG_MOD(info->extack, "unmanaged vdpa device");
1347		err = -EINVAL;
1348		goto mdev_err;
1349	}
1350	err = vdpa_dev_config_fill(vdev, msg, info->snd_portid, info->snd_seq,
1351				   0, info->extack);
1352	if (!err)
1353		err = genlmsg_reply(msg, info);
1354
1355mdev_err:
1356	put_device(dev);
1357dev_err:
1358	up_read(&vdpa_dev_lock);
1359	if (err)
1360		nlmsg_free(msg);
1361	return err;
1362}
1363
1364static int vdpa_dev_config_dump(struct device *dev, void *data)
1365{
1366	struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
1367	struct vdpa_dev_dump_info *info = data;
1368	int err;
1369
1370	if (!vdev->mdev)
1371		return 0;
1372	if (info->idx < info->start_idx) {
1373		info->idx++;
1374		return 0;
1375	}
1376	err = vdpa_dev_config_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
1377				   info->cb->nlh->nlmsg_seq, NLM_F_MULTI,
1378				   info->cb->extack);
1379	if (err)
1380		return err;
1381
1382	info->idx++;
1383	return 0;
1384}
1385
1386static int
1387vdpa_nl_cmd_dev_config_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
1388{
1389	struct vdpa_dev_dump_info info;
1390
1391	info.msg = msg;
1392	info.cb = cb;
1393	info.start_idx = cb->args[0];
1394	info.idx = 0;
1395
1396	down_read(&vdpa_dev_lock);
1397	bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_config_dump);
1398	up_read(&vdpa_dev_lock);
1399	cb->args[0] = info.idx;
1400	return msg->len;
1401}
1402
1403static int vdpa_nl_cmd_dev_stats_get_doit(struct sk_buff *skb,
1404					  struct genl_info *info)
1405{
1406	struct vdpa_device *vdev;
1407	struct sk_buff *msg;
1408	const char *devname;
1409	struct device *dev;
1410	u32 index;
1411	int err;
1412
1413	if (!info->attrs[VDPA_ATTR_DEV_NAME])
1414		return -EINVAL;
1415
1416	if (!info->attrs[VDPA_ATTR_DEV_QUEUE_INDEX])
1417		return -EINVAL;
1418
1419	devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
1420	msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
1421	if (!msg)
1422		return -ENOMEM;
1423
1424	index = nla_get_u32(info->attrs[VDPA_ATTR_DEV_QUEUE_INDEX]);
1425	down_read(&vdpa_dev_lock);
1426	dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
1427	if (!dev) {
1428		NL_SET_ERR_MSG_MOD(info->extack, "device not found");
1429		err = -ENODEV;
1430		goto dev_err;
1431	}
1432	vdev = container_of(dev, struct vdpa_device, dev);
1433	if (!vdev->mdev) {
1434		NL_SET_ERR_MSG_MOD(info->extack, "unmanaged vdpa device");
1435		err = -EINVAL;
1436		goto mdev_err;
1437	}
1438	err = vdpa_dev_vendor_stats_fill(vdev, msg, info, index);
1439	if (err)
1440		goto mdev_err;
1441
1442	err = genlmsg_reply(msg, info);
1443
1444	put_device(dev);
1445	up_read(&vdpa_dev_lock);
1446
1447	return err;
1448
1449mdev_err:
1450	put_device(dev);
1451dev_err:
1452	nlmsg_free(msg);
1453	up_read(&vdpa_dev_lock);
1454	return err;
1455}
1456
1457static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
1458	[VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
1459	[VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
1460	[VDPA_ATTR_DEV_NAME] = { .type = NLA_STRING },
1461	[VDPA_ATTR_DEV_NET_CFG_MACADDR] = NLA_POLICY_ETH_ADDR,
1462	[VDPA_ATTR_DEV_NET_CFG_MAX_VQP] = { .type = NLA_U16 },
1463	/* virtio spec 1.1 section 5.1.4.1 for valid MTU range */
1464	[VDPA_ATTR_DEV_NET_CFG_MTU] = NLA_POLICY_MIN(NLA_U16, 68),
1465	[VDPA_ATTR_DEV_QUEUE_INDEX] = { .type = NLA_U32 },
1466	[VDPA_ATTR_DEV_FEATURES] = { .type = NLA_U64 },
1467};
1468
1469static const struct genl_ops vdpa_nl_ops[] = {
1470	{
1471		.cmd = VDPA_CMD_MGMTDEV_GET,
1472		.doit = vdpa_nl_cmd_mgmtdev_get_doit,
1473		.dumpit = vdpa_nl_cmd_mgmtdev_get_dumpit,
1474	},
1475	{
1476		.cmd = VDPA_CMD_DEV_NEW,
1477		.doit = vdpa_nl_cmd_dev_add_set_doit,
1478		.flags = GENL_ADMIN_PERM,
1479	},
1480	{
1481		.cmd = VDPA_CMD_DEV_DEL,
1482		.doit = vdpa_nl_cmd_dev_del_set_doit,
1483		.flags = GENL_ADMIN_PERM,
1484	},
1485	{
1486		.cmd = VDPA_CMD_DEV_GET,
1487		.doit = vdpa_nl_cmd_dev_get_doit,
1488		.dumpit = vdpa_nl_cmd_dev_get_dumpit,
1489	},
1490	{
1491		.cmd = VDPA_CMD_DEV_CONFIG_GET,
1492		.doit = vdpa_nl_cmd_dev_config_get_doit,
1493		.dumpit = vdpa_nl_cmd_dev_config_get_dumpit,
1494	},
1495	{
1496		.cmd = VDPA_CMD_DEV_VSTATS_GET,
1497		.doit = vdpa_nl_cmd_dev_stats_get_doit,
1498		.flags = GENL_ADMIN_PERM,
1499	},
1500};
1501
1502static struct genl_family vdpa_nl_family __ro_after_init = {
1503	.name = VDPA_GENL_NAME,
1504	.version = VDPA_GENL_VERSION,
1505	.maxattr = VDPA_ATTR_MAX,
1506	.policy = vdpa_nl_policy,
1507	.netnsok = false,
1508	.module = THIS_MODULE,
1509	.ops = vdpa_nl_ops,
1510	.n_ops = ARRAY_SIZE(vdpa_nl_ops),
1511	.resv_start_op = VDPA_CMD_DEV_VSTATS_GET + 1,
1512};
1513
1514static int vdpa_init(void)
1515{
1516	int err;
1517
1518	err = bus_register(&vdpa_bus);
1519	if (err)
1520		return err;
1521	err = genl_register_family(&vdpa_nl_family);
1522	if (err)
1523		goto err;
1524	return 0;
1525
1526err:
1527	bus_unregister(&vdpa_bus);
1528	return err;
1529}
1530
1531static void __exit vdpa_exit(void)
1532{
1533	genl_unregister_family(&vdpa_nl_family);
1534	bus_unregister(&vdpa_bus);
1535	ida_destroy(&vdpa_index_ida);
1536}
1537core_initcall(vdpa_init);
1538module_exit(vdpa_exit);
1539
1540MODULE_AUTHOR("Jason Wang <jasowang@redhat.com>");
1541MODULE_LICENSE("GPL v2");