From: Sasha Levin Date: Wed, 25 Aug 2021 01:15:30 +0000 (-0400) Subject: Drop vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch X-Git-Tag: v5.13.13~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0395a54a56fb2fb16ea55dd3c6d7f4bb6194f432;p=thirdparty%2Fkernel%2Fstable-queue.git Drop vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch Signed-off-by: Sasha Levin --- diff --git a/queue-5.10/series b/queue-5.10/series index 21c1d6ca331..c2f7d9e3dd0 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -6,7 +6,6 @@ ath9k-postpone-key-cache-entry-deletion-for-txq-frames-reference-it.patch mtd-cfi_cmdset_0002-fix-crash-when-erasing-writing-amd-cards.patch media-zr364xx-propagate-errors-from-zr364xx_start_re.patch media-zr364xx-fix-memory-leaks-in-probe.patch -vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch media-drivers-media-usb-fix-memory-leak-in-zr364xx_p.patch kvm-x86-factor-out-x86-instruction-emulation-with-de.patch kvm-x86-fix-warning-caused-by-stale-emulation-contex.patch diff --git a/queue-5.10/vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch b/queue-5.10/vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch deleted file mode 100644 index 90f747acbe4..00000000000 --- a/queue-5.10/vdpa-define-vdpa-mgmt-device-ops-and-a-netlink-inter.patch +++ /dev/null @@ -1,417 +0,0 @@ -From ae78f42e582eb3e9c067f1dfee9cba5738c484c0 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Tue, 5 Jan 2021 12:32:00 +0200 -Subject: vdpa: Define vdpa mgmt device, ops and a netlink interface - -From: Parav Pandit - -[ Upstream commit 33b347503f014ebf76257327cbc7001c6b721956 ] - -To add one or more VDPA devices, define a management device which -allows adding or removing vdpa device. A management device defines -set of callbacks to manage vdpa devices. - -To begin with, it defines add and remove callbacks through which a user -defined vdpa device can be added or removed. - -A unique management device is identified by its unique handle identified -by management device name and optionally the bus name. - -Hence, introduce routine through which driver can register a -management device and its callback operations for adding and remove -a vdpa device. - -Introduce vdpa netlink socket family so that user can query management -device and its attributes. - -Example of show vdpa management device which allows creating vdpa device of -networking class (device id = 0x1) of virtio specification 1.1 -section 5.1.1. - -$ vdpa mgmtdev show -vdpasim_net: - supported_classes: - net - -Example of showing vdpa management device in JSON format. - -$ vdpa mgmtdev show -jp -{ - "show": { - "vdpasim_net": { - "supported_classes": [ "net" ] - } - } -} - -Signed-off-by: Parav Pandit -Reviewed-by: Eli Cohen -Reviewed-by: Jason Wang -Link: https://lore.kernel.org/r/20210105103203.82508-4-parav@nvidia.com -Signed-off-by: Michael S. Tsirkin - -Including a bugfix: - -vpda: correctly size vdpa_nl_policy - -We need to ensure last entry of vdpa_nl_policy[] -is zero, otherwise out-of-bounds access is hurting us. - -Signed-off-by: Eric Dumazet -Reported-by: syzbot -Cc: Parav Pandit -Cc: Eli Cohen -Cc: Jason Wang -Cc: Michael S. Tsirkin -Link: https://lore.kernel.org/r/20210210134911.4119555-1-eric.dumazet@gmail.com -Signed-off-by: Michael S. Tsirkin -Signed-off-by: Sasha Levin ---- - drivers/vdpa/Kconfig | 1 + - drivers/vdpa/vdpa.c | 213 +++++++++++++++++++++++++++++++++++++- - include/linux/vdpa.h | 31 ++++++ - include/uapi/linux/vdpa.h | 31 ++++++ - 4 files changed, 275 insertions(+), 1 deletion(-) - create mode 100644 include/uapi/linux/vdpa.h - -diff --git a/drivers/vdpa/Kconfig b/drivers/vdpa/Kconfig -index 6caf539091e5..4be7be39be26 100644 ---- a/drivers/vdpa/Kconfig -+++ b/drivers/vdpa/Kconfig -@@ -1,6 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - menuconfig VDPA - tristate "vDPA drivers" -+ depends on NET - help - Enable this module to support vDPA device that uses a - datapath which complies with virtio specifications with -diff --git a/drivers/vdpa/vdpa.c b/drivers/vdpa/vdpa.c -index b3408cc8c63b..e96b81431e4f 100644 ---- a/drivers/vdpa/vdpa.c -+++ b/drivers/vdpa/vdpa.c -@@ -11,11 +11,17 @@ - #include - #include - #include -+#include -+#include -+#include - -+static LIST_HEAD(mdev_head); - /* A global mutex that protects vdpa management device and device level operations. */ - static DEFINE_MUTEX(vdpa_dev_mutex); - static DEFINE_IDA(vdpa_index_ida); - -+static struct genl_family vdpa_nl_family; -+ - static int vdpa_dev_probe(struct device *d) - { - struct vdpa_device *vdev = dev_to_vdpa(d); -@@ -195,13 +201,218 @@ void vdpa_unregister_driver(struct vdpa_driver *drv) - } - EXPORT_SYMBOL_GPL(vdpa_unregister_driver); - -+/** -+ * vdpa_mgmtdev_register - register a vdpa management device -+ * -+ * @mdev: Pointer to vdpa management device -+ * vdpa_mgmtdev_register() register a vdpa management device which supports -+ * vdpa device management. -+ */ -+int vdpa_mgmtdev_register(struct vdpa_mgmt_dev *mdev) -+{ -+ if (!mdev->device || !mdev->ops || !mdev->ops->dev_add || !mdev->ops->dev_del) -+ return -EINVAL; -+ -+ INIT_LIST_HEAD(&mdev->list); -+ mutex_lock(&vdpa_dev_mutex); -+ list_add_tail(&mdev->list, &mdev_head); -+ mutex_unlock(&vdpa_dev_mutex); -+ return 0; -+} -+EXPORT_SYMBOL_GPL(vdpa_mgmtdev_register); -+ -+void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev) -+{ -+ mutex_lock(&vdpa_dev_mutex); -+ list_del(&mdev->list); -+ mutex_unlock(&vdpa_dev_mutex); -+} -+EXPORT_SYMBOL_GPL(vdpa_mgmtdev_unregister); -+ -+static bool mgmtdev_handle_match(const struct vdpa_mgmt_dev *mdev, -+ const char *busname, const char *devname) -+{ -+ /* Bus name is optional for simulated management device, so ignore the -+ * device with bus if bus attribute is provided. -+ */ -+ if ((busname && !mdev->device->bus) || (!busname && mdev->device->bus)) -+ return false; -+ -+ if (!busname && strcmp(dev_name(mdev->device), devname) == 0) -+ return true; -+ -+ if (busname && (strcmp(mdev->device->bus->name, busname) == 0) && -+ (strcmp(dev_name(mdev->device), devname) == 0)) -+ return true; -+ -+ return false; -+} -+ -+static struct vdpa_mgmt_dev *vdpa_mgmtdev_get_from_attr(struct nlattr **attrs) -+{ -+ struct vdpa_mgmt_dev *mdev; -+ const char *busname = NULL; -+ const char *devname; -+ -+ if (!attrs[VDPA_ATTR_MGMTDEV_DEV_NAME]) -+ return ERR_PTR(-EINVAL); -+ devname = nla_data(attrs[VDPA_ATTR_MGMTDEV_DEV_NAME]); -+ if (attrs[VDPA_ATTR_MGMTDEV_BUS_NAME]) -+ busname = nla_data(attrs[VDPA_ATTR_MGMTDEV_BUS_NAME]); -+ -+ list_for_each_entry(mdev, &mdev_head, list) { -+ if (mgmtdev_handle_match(mdev, busname, devname)) -+ return mdev; -+ } -+ return ERR_PTR(-ENODEV); -+} -+ -+static int vdpa_nl_mgmtdev_handle_fill(struct sk_buff *msg, const struct vdpa_mgmt_dev *mdev) -+{ -+ if (mdev->device->bus && -+ nla_put_string(msg, VDPA_ATTR_MGMTDEV_BUS_NAME, mdev->device->bus->name)) -+ return -EMSGSIZE; -+ if (nla_put_string(msg, VDPA_ATTR_MGMTDEV_DEV_NAME, dev_name(mdev->device))) -+ return -EMSGSIZE; -+ return 0; -+} -+ -+static int vdpa_mgmtdev_fill(const struct vdpa_mgmt_dev *mdev, struct sk_buff *msg, -+ u32 portid, u32 seq, int flags) -+{ -+ u64 supported_classes = 0; -+ void *hdr; -+ int i = 0; -+ int err; -+ -+ hdr = genlmsg_put(msg, portid, seq, &vdpa_nl_family, flags, VDPA_CMD_MGMTDEV_NEW); -+ if (!hdr) -+ return -EMSGSIZE; -+ err = vdpa_nl_mgmtdev_handle_fill(msg, mdev); -+ if (err) -+ goto msg_err; -+ -+ while (mdev->id_table[i].device) { -+ supported_classes |= BIT(mdev->id_table[i].device); -+ i++; -+ } -+ -+ if (nla_put_u64_64bit(msg, VDPA_ATTR_MGMTDEV_SUPPORTED_CLASSES, -+ supported_classes, VDPA_ATTR_UNSPEC)) { -+ err = -EMSGSIZE; -+ goto msg_err; -+ } -+ -+ genlmsg_end(msg, hdr); -+ return 0; -+ -+msg_err: -+ genlmsg_cancel(msg, hdr); -+ return err; -+} -+ -+static int vdpa_nl_cmd_mgmtdev_get_doit(struct sk_buff *skb, struct genl_info *info) -+{ -+ struct vdpa_mgmt_dev *mdev; -+ struct sk_buff *msg; -+ int err; -+ -+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); -+ if (!msg) -+ return -ENOMEM; -+ -+ mutex_lock(&vdpa_dev_mutex); -+ mdev = vdpa_mgmtdev_get_from_attr(info->attrs); -+ if (IS_ERR(mdev)) { -+ mutex_unlock(&vdpa_dev_mutex); -+ NL_SET_ERR_MSG_MOD(info->extack, "Fail to find the specified mgmt device"); -+ err = PTR_ERR(mdev); -+ goto out; -+ } -+ -+ err = vdpa_mgmtdev_fill(mdev, msg, info->snd_portid, info->snd_seq, 0); -+ mutex_unlock(&vdpa_dev_mutex); -+ if (err) -+ goto out; -+ err = genlmsg_reply(msg, info); -+ return err; -+ -+out: -+ nlmsg_free(msg); -+ return err; -+} -+ -+static int -+vdpa_nl_cmd_mgmtdev_get_dumpit(struct sk_buff *msg, struct netlink_callback *cb) -+{ -+ struct vdpa_mgmt_dev *mdev; -+ int start = cb->args[0]; -+ int idx = 0; -+ int err; -+ -+ mutex_lock(&vdpa_dev_mutex); -+ list_for_each_entry(mdev, &mdev_head, list) { -+ if (idx < start) { -+ idx++; -+ continue; -+ } -+ err = vdpa_mgmtdev_fill(mdev, msg, NETLINK_CB(cb->skb).portid, -+ cb->nlh->nlmsg_seq, NLM_F_MULTI); -+ if (err) -+ goto out; -+ idx++; -+ } -+out: -+ mutex_unlock(&vdpa_dev_mutex); -+ cb->args[0] = idx; -+ return msg->len; -+} -+ -+static const struct nla_policy vdpa_nl_policy[VDPA_ATTR_MAX + 1] = { -+ [VDPA_ATTR_MGMTDEV_BUS_NAME] = { .type = NLA_NUL_STRING }, -+ [VDPA_ATTR_MGMTDEV_DEV_NAME] = { .type = NLA_STRING }, -+}; -+ -+static const struct genl_ops vdpa_nl_ops[] = { -+ { -+ .cmd = VDPA_CMD_MGMTDEV_GET, -+ .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, -+ .doit = vdpa_nl_cmd_mgmtdev_get_doit, -+ .dumpit = vdpa_nl_cmd_mgmtdev_get_dumpit, -+ }, -+}; -+ -+static struct genl_family vdpa_nl_family __ro_after_init = { -+ .name = VDPA_GENL_NAME, -+ .version = VDPA_GENL_VERSION, -+ .maxattr = VDPA_ATTR_MAX, -+ .policy = vdpa_nl_policy, -+ .netnsok = false, -+ .module = THIS_MODULE, -+ .ops = vdpa_nl_ops, -+ .n_ops = ARRAY_SIZE(vdpa_nl_ops), -+}; -+ - static int vdpa_init(void) - { -- return bus_register(&vdpa_bus); -+ int err; -+ -+ err = bus_register(&vdpa_bus); -+ if (err) -+ return err; -+ err = genl_register_family(&vdpa_nl_family); -+ if (err) -+ goto err; -+ return 0; -+ -+err: -+ bus_unregister(&vdpa_bus); -+ return err; - } - - static void __exit vdpa_exit(void) - { -+ genl_unregister_family(&vdpa_nl_family); - bus_unregister(&vdpa_bus); - ida_destroy(&vdpa_index_ida); - } -diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h -index ac58462e8aed..d2f4e021ac79 100644 ---- a/include/linux/vdpa.h -+++ b/include/linux/vdpa.h -@@ -35,6 +35,8 @@ struct vdpa_vq_state { - u16 avail_index; - }; - -+struct vdpa_mgmt_dev; -+ - /** - * vDPA device - representation of a vDPA device - * @dev: underlying device -@@ -334,4 +336,33 @@ static inline void vdpa_get_config(struct vdpa_device *vdev, unsigned offset, - ops->get_config(vdev, offset, buf, len); - } - -+/** -+ * vdpa_mgmtdev_ops - vdpa device ops -+ * @dev_add: Add a vdpa device using alloc and register -+ * @mdev: parent device to use for device addition -+ * @name: name of the new vdpa device -+ * Driver need to add a new device using _vdpa_register_device() -+ * after fully initializing the vdpa device. Driver must return 0 -+ * on success or appropriate error code. -+ * @dev_del: Remove a vdpa device using unregister -+ * @mdev: parent device to use for device removal -+ * @dev: vdpa device to remove -+ * Driver need to remove the specified device by calling -+ * _vdpa_unregister_device(). -+ */ -+struct vdpa_mgmtdev_ops { -+ int (*dev_add)(struct vdpa_mgmt_dev *mdev, const char *name); -+ void (*dev_del)(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev); -+}; -+ -+struct vdpa_mgmt_dev { -+ struct device *device; -+ const struct vdpa_mgmtdev_ops *ops; -+ const struct virtio_device_id *id_table; /* supported ids */ -+ struct list_head list; -+}; -+ -+int vdpa_mgmtdev_register(struct vdpa_mgmt_dev *mdev); -+void vdpa_mgmtdev_unregister(struct vdpa_mgmt_dev *mdev); -+ - #endif /* _LINUX_VDPA_H */ -diff --git a/include/uapi/linux/vdpa.h b/include/uapi/linux/vdpa.h -new file mode 100644 -index 000000000000..d44d82e567b1 ---- /dev/null -+++ b/include/uapi/linux/vdpa.h -@@ -0,0 +1,31 @@ -+/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ -+/* -+ * vdpa device management interface -+ * Copyright (c) 2020 Mellanox Technologies Ltd. All rights reserved. -+ */ -+ -+#ifndef _UAPI_LINUX_VDPA_H_ -+#define _UAPI_LINUX_VDPA_H_ -+ -+#define VDPA_GENL_NAME "vdpa" -+#define VDPA_GENL_VERSION 0x1 -+ -+enum vdpa_command { -+ VDPA_CMD_UNSPEC, -+ VDPA_CMD_MGMTDEV_NEW, -+ VDPA_CMD_MGMTDEV_GET, /* can dump */ -+}; -+ -+enum vdpa_attr { -+ VDPA_ATTR_UNSPEC, -+ -+ /* bus name (optional) + dev name together make the parent device handle */ -+ VDPA_ATTR_MGMTDEV_BUS_NAME, /* string */ -+ VDPA_ATTR_MGMTDEV_DEV_NAME, /* string */ -+ VDPA_ATTR_MGMTDEV_SUPPORTED_CLASSES, /* u64 */ -+ -+ /* new attributes must be added above here */ -+ VDPA_ATTR_MAX, -+}; -+ -+#endif --- -2.30.2 -