1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 2020, Red Hat. All rights reserved.
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>
19 static LIST_HEAD(mdev_head);
20 /* A global mutex that protects vdpa management device and device level operations. */
21 static DEFINE_MUTEX(vdpa_dev_mutex);
22 static DEFINE_IDA(vdpa_index_ida);
24 static struct genl_family vdpa_nl_family;
26 static int vdpa_dev_probe(struct device *d)
28 struct vdpa_device *vdev = dev_to_vdpa(d);
29 struct vdpa_driver *drv = drv_to_vdpa(vdev->dev.driver);
30 const struct vdpa_config_ops *ops = vdev->config;
31 u32 max_num, min_num = 1;
34 max_num = ops->get_vq_num_max(vdev);
35 if (ops->get_vq_num_min)
36 min_num = ops->get_vq_num_min(vdev);
37 if (max_num < min_num)
40 if (drv && drv->probe)
41 ret = drv->probe(vdev);
46 static void vdpa_dev_remove(struct device *d)
48 struct vdpa_device *vdev = dev_to_vdpa(d);
49 struct vdpa_driver *drv = drv_to_vdpa(vdev->dev.driver);
51 if (drv && drv->remove)
55 static struct bus_type vdpa_bus = {
57 .probe = vdpa_dev_probe,
58 .remove = vdpa_dev_remove,
61 static void vdpa_release_dev(struct device *d)
63 struct vdpa_device *vdev = dev_to_vdpa(d);
64 const struct vdpa_config_ops *ops = vdev->config;
69 ida_simple_remove(&vdpa_index_ida, vdev->index);
70 mutex_destroy(&vdev->cf_mutex);
75 * __vdpa_alloc_device - allocate and initilaize a vDPA device
76 * This allows driver to some prepartion after device is
77 * initialized but before registered.
78 * @parent: the parent device
79 * @config: the bus operations that is supported by this device
80 * @size: size of the parent structure that contains private data
81 * @name: name of the vdpa device; optional.
82 * @use_va: indicate whether virtual address must be used by this device
84 * Driver should use vdpa_alloc_device() wrapper macro instead of
85 * using this directly.
87 * Return: Returns an error when parent/config/dma_dev is not set or fail to get
90 struct vdpa_device *__vdpa_alloc_device(struct device *parent,
91 const struct vdpa_config_ops *config,
92 size_t size, const char *name,
95 struct vdpa_device *vdev;
101 if (!!config->dma_map != !!config->dma_unmap)
104 /* It should only work for the device that use on-chip IOMMU */
105 if (use_va && !(config->dma_map || config->set_map))
109 vdev = kzalloc(size, GFP_KERNEL);
113 err = ida_alloc(&vdpa_index_ida, GFP_KERNEL);
117 vdev->dev.bus = &vdpa_bus;
118 vdev->dev.parent = parent;
119 vdev->dev.release = vdpa_release_dev;
121 vdev->config = config;
122 vdev->features_valid = false;
123 vdev->use_va = use_va;
126 err = dev_set_name(&vdev->dev, "%s", name);
128 err = dev_set_name(&vdev->dev, "vdpa%u", vdev->index);
132 mutex_init(&vdev->cf_mutex);
133 device_initialize(&vdev->dev);
138 ida_simple_remove(&vdpa_index_ida, vdev->index);
144 EXPORT_SYMBOL_GPL(__vdpa_alloc_device);
146 static int vdpa_name_match(struct device *dev, const void *data)
148 struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
150 return (strcmp(dev_name(&vdev->dev), data) == 0);
153 static int __vdpa_register_device(struct vdpa_device *vdev, int nvqs)
159 lockdep_assert_held(&vdpa_dev_mutex);
160 dev = bus_find_device(&vdpa_bus, NULL, dev_name(&vdev->dev), vdpa_name_match);
165 return device_add(&vdev->dev);
169 * _vdpa_register_device - register a vDPA device with vdpa lock held
170 * Caller must have a succeed call of vdpa_alloc_device() before.
171 * Caller must invoke this routine in the management device dev_add()
172 * callback after setting up valid mgmtdev for this vdpa device.
173 * @vdev: the vdpa device to be registered to vDPA bus
174 * @nvqs: number of virtqueues supported by this device
176 * Return: Returns an error when fail to add device to vDPA bus
178 int _vdpa_register_device(struct vdpa_device *vdev, int nvqs)
183 return __vdpa_register_device(vdev, nvqs);
185 EXPORT_SYMBOL_GPL(_vdpa_register_device);
188 * vdpa_register_device - register a vDPA device
189 * Callers must have a succeed call of vdpa_alloc_device() before.
190 * @vdev: the vdpa device to be registered to vDPA bus
191 * @nvqs: number of virtqueues supported by this device
193 * Return: Returns an error when fail to add to vDPA bus
195 int vdpa_register_device(struct vdpa_device *vdev, int nvqs)
199 mutex_lock(&vdpa_dev_mutex);
200 err = __vdpa_register_device(vdev, nvqs);
201 mutex_unlock(&vdpa_dev_mutex);
204 EXPORT_SYMBOL_GPL(vdpa_register_device);
207 * _vdpa_unregister_device - unregister a vDPA device
208 * Caller must invoke this routine as part of management device dev_del()
210 * @vdev: the vdpa device to be unregisted from vDPA bus
212 void _vdpa_unregister_device(struct vdpa_device *vdev)
214 lockdep_assert_held(&vdpa_dev_mutex);
215 WARN_ON(!vdev->mdev);
216 device_unregister(&vdev->dev);
218 EXPORT_SYMBOL_GPL(_vdpa_unregister_device);
221 * vdpa_unregister_device - unregister a vDPA device
222 * @vdev: the vdpa device to be unregisted from vDPA bus
224 void vdpa_unregister_device(struct vdpa_device *vdev)
226 mutex_lock(&vdpa_dev_mutex);
227 device_unregister(&vdev->dev);
228 mutex_unlock(&vdpa_dev_mutex);
230 EXPORT_SYMBOL_GPL(vdpa_unregister_device);
233 * __vdpa_register_driver - register a vDPA device driver
234 * @drv: the vdpa device driver to be registered
235 * @owner: module owner of the driver
237 * Return: Returns an err when fail to do the registration
239 int __vdpa_register_driver(struct vdpa_driver *drv, struct module *owner)
241 drv->driver.bus = &vdpa_bus;
242 drv->driver.owner = owner;
244 return driver_register(&drv->driver);
246 EXPORT_SYMBOL_GPL(__vdpa_register_driver);
249 * vdpa_unregister_driver - unregister a vDPA device driver
250 * @drv: the vdpa device driver to be unregistered
252 void vdpa_unregister_driver(struct vdpa_driver *drv)
254 driver_unregister(&drv->driver);
256 EXPORT_SYMBOL_GPL(vdpa_unregister_driver);
259 * vdpa_mgmtdev_register - register a vdpa management device
261 * @mdev: Pointer to vdpa management device
262 * vdpa_mgmtdev_register() register a vdpa management device which supports
263 * vdpa device management.
264 * Return: Returns 0 on success or failure when required callback ops are not
267 int vdpa_mgmtdev_register(struct vdpa_mgmt_dev *mdev)
269 if (!mdev->device || !mdev->ops || !mdev->ops->dev_add || !mdev->ops->dev_del)
272 INIT_LIST_HEAD(&mdev->list);
273 mutex_lock(&vdpa_dev_mutex);
274 list_add_tail(&mdev->list, &mdev_head);
275 mutex_unlock(&vdpa_dev_mutex);
278 EXPORT_SYMBOL_GPL(vdpa_mgmtdev_register);
280 static int vdpa_match_remove(struct device *dev, void *data)
282 struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
283 struct vdpa_mgmt_dev *mdev = vdev->mdev;
286 mdev->ops->dev_del(mdev, vdev);
290 void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev)
292 mutex_lock(&vdpa_dev_mutex);
294 list_del(&mdev->list);
296 /* Filter out all the entries belong to this management device and delete it. */
297 bus_for_each_dev(&vdpa_bus, NULL, mdev, vdpa_match_remove);
299 mutex_unlock(&vdpa_dev_mutex);
301 EXPORT_SYMBOL_GPL(vdpa_mgmtdev_unregister);
304 * vdpa_get_config - Get one or more device configuration fields.
305 * @vdev: vdpa device to operate on
306 * @offset: starting byte offset of the field
307 * @buf: buffer pointer to read to
308 * @len: length of the configuration fields in bytes
310 void vdpa_get_config(struct vdpa_device *vdev, unsigned int offset,
311 void *buf, unsigned int len)
313 const struct vdpa_config_ops *ops = vdev->config;
315 mutex_lock(&vdev->cf_mutex);
317 * Config accesses aren't supposed to trigger before features are set.
318 * If it does happen we assume a legacy guest.
320 if (!vdev->features_valid)
321 vdpa_set_features(vdev, 0);
322 ops->get_config(vdev, offset, buf, len);
323 mutex_unlock(&vdev->cf_mutex);
325 EXPORT_SYMBOL_GPL(vdpa_get_config);
328 * vdpa_set_config - Set one or more device configuration fields.
329 * @vdev: vdpa device to operate on
330 * @offset: starting byte offset of the field
331 * @buf: buffer pointer to read from
332 * @length: length of the configuration fields in bytes
334 void vdpa_set_config(struct vdpa_device *vdev, unsigned int offset,
335 const void *buf, unsigned int length)
337 mutex_lock(&vdev->cf_mutex);
338 vdev->config->set_config(vdev, offset, buf, length);
339 mutex_unlock(&vdev->cf_mutex);
341 EXPORT_SYMBOL_GPL(vdpa_set_config);
343 static bool mgmtdev_handle_match(const struct vdpa_mgmt_dev *mdev,
344 const char *busname, const char *devname)
346 /* Bus name is optional for simulated management device, so ignore the
347 * device with bus if bus attribute is provided.
349 if ((busname && !mdev->device->bus) || (!busname && mdev->device->bus))
352 if (!busname && strcmp(dev_name(mdev->device), devname) == 0)
355 if (busname && (strcmp(mdev->device->bus->name, busname) == 0) &&
356 (strcmp(dev_name(mdev->device), devname) == 0))
362 static struct vdpa_mgmt_dev *vdpa_mgmtdev_get_from_attr(struct nlattr **attrs)
364 struct vdpa_mgmt_dev *mdev;
365 const char *busname = NULL;
368 if (!attrs[VDPA_ATTR_MGMTDEV_DEV_NAME])
369 return ERR_PTR(-EINVAL);
370 devname = nla_data(attrs[VDPA_ATTR_MGMTDEV_DEV_NAME]);
371 if (attrs[VDPA_ATTR_MGMTDEV_BUS_NAME])
372 busname = nla_data(attrs[VDPA_ATTR_MGMTDEV_BUS_NAME]);
374 list_for_each_entry(mdev, &mdev_head, list) {
375 if (mgmtdev_handle_match(mdev, busname, devname))
378 return ERR_PTR(-ENODEV);
381 static int vdpa_nl_mgmtdev_handle_fill(struct sk_buff *msg, const struct vdpa_mgmt_dev *mdev)
383 if (mdev->device->bus &&
384 nla_put_string(msg, VDPA_ATTR_MGMTDEV_BUS_NAME, mdev->device->bus->name))
386 if (nla_put_string(msg, VDPA_ATTR_MGMTDEV_DEV_NAME, dev_name(mdev->device)))
391 static int vdpa_mgmtdev_fill(const struct vdpa_mgmt_dev *mdev, struct sk_buff *msg,
392 u32 portid, u32 seq, int flags)
394 u64 supported_classes = 0;
399 hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_MGMTDEV_NEW);
402 err = vdpa_nl_mgmtdev_handle_fill(msg, mdev);
406 while (mdev->id_table[i].device) {
407 supported_classes |= BIT(mdev->id_table[i].device);
411 if (nla_put_u64_64bit(msg, VDPA_ATTR_MGMTDEV_SUPPORTED_CLASSES,
412 supported_classes, VDPA_ATTR_UNSPEC)) {
417 genlmsg_end(msg, hdr);
421 genlmsg_cancel(msg, hdr);
425 static int vdpa_nl_cmd_mgmtdev_get_doit(struct sk_buff *skb, struct genl_info *info)
427 struct vdpa_mgmt_dev *mdev;
431 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
435 mutex_lock(&vdpa_dev_mutex);
436 mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
438 mutex_unlock(&vdpa_dev_mutex);
439 NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified mgmt device");
444 err = vdpa_mgmtdev_fill(mdev, msg, info->snd_portid, info->snd_seq, 0);
445 mutex_unlock(&vdpa_dev_mutex);
448 err = genlmsg_reply(msg, info);
457 vdpa_nl_cmd_mgmtdev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
459 struct vdpa_mgmt_dev *mdev;
460 int start = cb->args[0];
464 mutex_lock(&vdpa_dev_mutex);
465 list_for_each_entry(mdev, &mdev_head, list) {
470 err = vdpa_mgmtdev_fill(mdev, msg, NETLINK_CB(cb->skb).portid,
471 cb->nlh->nlmsg_seq, NLM_F_MULTI);
477 mutex_unlock(&vdpa_dev_mutex);
482 #define VDPA_DEV_NET_ATTRS_MASK ((1 << VDPA_ATTR_DEV_NET_CFG_MACADDR) | \
483 (1 << VDPA_ATTR_DEV_NET_CFG_MTU))
485 static int vdpa_nl_cmd_dev_add_set_doit(struct sk_buff *skb, struct genl_info *info)
487 struct vdpa_dev_set_config config = {};
488 struct nlattr **nl_attrs = info->attrs;
489 struct vdpa_mgmt_dev *mdev;
494 if (!info->attrs[VDPA_ATTR_DEV_NAME])
497 name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
499 if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]) {
500 macaddr = nla_data(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MACADDR]);
501 memcpy(config.net.mac, macaddr, sizeof(config.net.mac));
502 config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR);
504 if (nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]) {
506 nla_get_u16(nl_attrs[VDPA_ATTR_DEV_NET_CFG_MTU]);
507 config.mask |= (1 << VDPA_ATTR_DEV_NET_CFG_MTU);
510 /* Skip checking capability if user didn't prefer to configure any
511 * device networking attributes. It is likely that user might have used
512 * a device specific method to configure such attributes or using device
513 * default attributes.
515 if ((config.mask & VDPA_DEV_NET_ATTRS_MASK) &&
516 !netlink_capable(skb, CAP_NET_ADMIN))
519 mutex_lock(&vdpa_dev_mutex);
520 mdev = vdpa_mgmtdev_get_from_attr(info->attrs);
522 NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified management device");
526 if ((config.mask & mdev->config_attr_mask) != config.mask) {
527 NL_SET_ERR_MSG_MOD(info->extack,
528 "All provided attributes are not supported");
533 err = mdev->ops->dev_add(mdev, name, &config);
535 mutex_unlock(&vdpa_dev_mutex);
539 static int vdpa_nl_cmd_dev_del_set_doit(struct sk_buff *skb, struct genl_info *info)
541 struct vdpa_mgmt_dev *mdev;
542 struct vdpa_device *vdev;
547 if (!info->attrs[VDPA_ATTR_DEV_NAME])
549 name = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
551 mutex_lock(&vdpa_dev_mutex);
552 dev = bus_find_device(&vdpa_bus, NULL, name, vdpa_name_match);
554 NL_SET_ERR_MSG_MOD(info->extack, "device not found");
558 vdev = container_of(dev, struct vdpa_device, dev);
560 NL_SET_ERR_MSG_MOD(info->extack, "Only user created device can be deleted by user");
565 mdev->ops->dev_del(mdev, vdev);
569 mutex_unlock(&vdpa_dev_mutex);
574 vdpa_dev_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
575 int flags, struct netlink_ext_ack *extack)
584 hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_DEV_NEW);
588 err = vdpa_nl_mgmtdev_handle_fill(msg, vdev->mdev);
592 device_id = vdev->config->get_device_id(vdev);
593 vendor_id = vdev->config->get_vendor_id(vdev);
594 max_vq_size = vdev->config->get_vq_num_max(vdev);
595 if (vdev->config->get_vq_num_min)
596 min_vq_size = vdev->config->get_vq_num_min(vdev);
599 if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev)))
601 if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id))
603 if (nla_put_u32(msg, VDPA_ATTR_DEV_VENDOR_ID, vendor_id))
605 if (nla_put_u32(msg, VDPA_ATTR_DEV_MAX_VQS, vdev->nvqs))
607 if (nla_put_u16(msg, VDPA_ATTR_DEV_MAX_VQ_SIZE, max_vq_size))
609 if (nla_put_u16(msg, VDPA_ATTR_DEV_MIN_VQ_SIZE, min_vq_size))
612 genlmsg_end(msg, hdr);
616 genlmsg_cancel(msg, hdr);
620 static int vdpa_nl_cmd_dev_get_doit(struct sk_buff *skb, struct genl_info *info)
622 struct vdpa_device *vdev;
628 if (!info->attrs[VDPA_ATTR_DEV_NAME])
630 devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
631 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
635 mutex_lock(&vdpa_dev_mutex);
636 dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
638 NL_SET_ERR_MSG_MOD(info->extack, "device not found");
642 vdev = container_of(dev, struct vdpa_device, dev);
647 err = vdpa_dev_fill(vdev, msg, info->snd_portid, info->snd_seq, 0, info->extack);
649 err = genlmsg_reply(msg, info);
653 mutex_unlock(&vdpa_dev_mutex);
659 struct vdpa_dev_dump_info {
661 struct netlink_callback *cb;
666 static int vdpa_dev_dump(struct device *dev, void *data)
668 struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
669 struct vdpa_dev_dump_info *info = data;
674 if (info->idx < info->start_idx) {
678 err = vdpa_dev_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
679 info->cb->nlh->nlmsg_seq, NLM_F_MULTI, info->cb->extack);
687 static int vdpa_nl_cmd_dev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
689 struct vdpa_dev_dump_info info;
693 info.start_idx = cb->args[0];
696 mutex_lock(&vdpa_dev_mutex);
697 bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_dump);
698 mutex_unlock(&vdpa_dev_mutex);
699 cb->args[0] = info.idx;
703 static int vdpa_dev_net_mq_config_fill(struct vdpa_device *vdev,
704 struct sk_buff *msg, u64 features,
705 const struct virtio_net_config *config)
709 if ((features & (1ULL << VIRTIO_NET_F_MQ)) == 0)
712 val_u16 = le16_to_cpu(config->max_virtqueue_pairs);
713 return nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MAX_VQP, val_u16);
716 static int vdpa_dev_net_config_fill(struct vdpa_device *vdev, struct sk_buff *msg)
718 struct virtio_net_config config = {};
722 vdpa_get_config(vdev, 0, &config, sizeof(config));
724 if (nla_put(msg, VDPA_ATTR_DEV_NET_CFG_MACADDR, sizeof(config.mac),
728 val_u16 = le16_to_cpu(config.status);
729 if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_STATUS, val_u16))
732 val_u16 = le16_to_cpu(config.mtu);
733 if (nla_put_u16(msg, VDPA_ATTR_DEV_NET_CFG_MTU, val_u16))
736 features = vdev->config->get_features(vdev);
738 return vdpa_dev_net_mq_config_fill(vdev, msg, features, &config);
742 vdpa_dev_config_fill(struct vdpa_device *vdev, struct sk_buff *msg, u32 portid, u32 seq,
743 int flags, struct netlink_ext_ack *extack)
749 hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags,
750 VDPA_CMD_DEV_CONFIG_GET);
754 if (nla_put_string(msg, VDPA_ATTR_DEV_NAME, dev_name(&vdev->dev))) {
759 device_id = vdev->config->get_device_id(vdev);
760 if (nla_put_u32(msg, VDPA_ATTR_DEV_ID, device_id)) {
767 err = vdpa_dev_net_config_fill(vdev, msg);
776 genlmsg_end(msg, hdr);
780 genlmsg_cancel(msg, hdr);
784 static int vdpa_nl_cmd_dev_config_get_doit(struct sk_buff *skb, struct genl_info *info)
786 struct vdpa_device *vdev;
792 if (!info->attrs[VDPA_ATTR_DEV_NAME])
794 devname = nla_data(info->attrs[VDPA_ATTR_DEV_NAME]);
795 msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
799 mutex_lock(&vdpa_dev_mutex);
800 dev = bus_find_device(&vdpa_bus, NULL, devname, vdpa_name_match);
802 NL_SET_ERR_MSG_MOD(info->extack, "device not found");
806 vdev = container_of(dev, struct vdpa_device, dev);
808 NL_SET_ERR_MSG_MOD(info->extack, "unmanaged vdpa device");
812 err = vdpa_dev_config_fill(vdev, msg, info->snd_portid, info->snd_seq,
815 err = genlmsg_reply(msg, info);
820 mutex_unlock(&vdpa_dev_mutex);
826 static int vdpa_dev_config_dump(struct device *dev, void *data)
828 struct vdpa_device *vdev = container_of(dev, struct vdpa_device, dev);
829 struct vdpa_dev_dump_info *info = data;
834 if (info->idx < info->start_idx) {
838 err = vdpa_dev_config_fill(vdev, info->msg, NETLINK_CB(info->cb->skb).portid,
839 info->cb->nlh->nlmsg_seq, NLM_F_MULTI,
849 vdpa_nl_cmd_dev_config_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb)
851 struct vdpa_dev_dump_info info;
855 info.start_idx = cb->args[0];
858 mutex_lock(&vdpa_dev_mutex);
859 bus_for_each_dev(&vdpa_bus, NULL, &info, vdpa_dev_config_dump);
860 mutex_unlock(&vdpa_dev_mutex);
861 cb->args[0] = info.idx;
865 static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = {
866 [VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING },
867 [VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING },
868 [VDPA_ATTR_DEV_NAME] = { .type = NLA_STRING },
869 [VDPA_ATTR_DEV_NET_CFG_MACADDR] = NLA_POLICY_ETH_ADDR,
870 /* virtio spec 1.1 section 5.1.4.1 for valid MTU range */
871 [VDPA_ATTR_DEV_NET_CFG_MTU] = NLA_POLICY_MIN(NLA_U16, 68),
874 static const struct genl_ops vdpa_nl_ops[] = {
876 .cmd = VDPA_CMD_MGMTDEV_GET,
877 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
878 .doit = vdpa_nl_cmd_mgmtdev_get_doit,
879 .dumpit = vdpa_nl_cmd_mgmtdev_get_dumpit,
882 .cmd = VDPA_CMD_DEV_NEW,
883 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
884 .doit = vdpa_nl_cmd_dev_add_set_doit,
885 .flags = GENL_ADMIN_PERM,
888 .cmd = VDPA_CMD_DEV_DEL,
889 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
890 .doit = vdpa_nl_cmd_dev_del_set_doit,
891 .flags = GENL_ADMIN_PERM,
894 .cmd = VDPA_CMD_DEV_GET,
895 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
896 .doit = vdpa_nl_cmd_dev_get_doit,
897 .dumpit = vdpa_nl_cmd_dev_get_dumpit,
900 .cmd = VDPA_CMD_DEV_CONFIG_GET,
901 .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
902 .doit = vdpa_nl_cmd_dev_config_get_doit,
903 .dumpit = vdpa_nl_cmd_dev_config_get_dumpit,
907 static struct genl_family vdpa_nl_family __ro_after_init = {
908 .name = VDPA_GENL_NAME,
909 .version = VDPA_GENL_VERSION,
910 .maxattr = VDPA_ATTR_MAX,
911 .policy = vdpa_nl_policy,
913 .module = THIS_MODULE,
915 .n_ops = ARRAY_SIZE(vdpa_nl_ops),
918 static int vdpa_init(void)
922 err = bus_register(&vdpa_bus);
925 err = genl_register_family(&vdpa_nl_family);
931 bus_unregister(&vdpa_bus);
935 static void __exit vdpa_exit(void)
937 genl_unregister_family(&vdpa_nl_family);
938 bus_unregister(&vdpa_bus);
939 ida_destroy(&vdpa_index_ida);
941 core_initcall(vdpa_init);
942 module_exit(vdpa_exit);
945 MODULE_LICENSE("GPL v2");