diff options
Diffstat (limited to 'drivers/net/netdevsim/bus.c')
-rw-r--r-- | drivers/net/netdevsim/bus.c | 155 |
1 files changed, 11 insertions, 144 deletions
diff --git a/drivers/net/netdevsim/bus.c b/drivers/net/netdevsim/bus.c index 29f5627d11e6..25cb2e600d53 100644 --- a/drivers/net/netdevsim/bus.c +++ b/drivers/net/netdevsim/bus.c @@ -8,7 +8,6 @@ #include <linux/kernel.h> #include <linux/list.h> #include <linux/mutex.h> -#include <linux/rtnetlink.h> #include <linux/slab.h> #include <linux/sysfs.h> @@ -24,39 +23,6 @@ static struct nsim_bus_dev *to_nsim_bus_dev(struct device *dev) return container_of(dev, struct nsim_bus_dev, dev); } -static int nsim_bus_dev_vfs_enable(struct nsim_bus_dev *nsim_bus_dev, - unsigned int num_vfs) -{ - struct nsim_dev *nsim_dev; - int err = 0; - - if (nsim_bus_dev->max_vfs < num_vfs) - return -ENOMEM; - - if (!nsim_bus_dev->vfconfigs) - return -ENOMEM; - nsim_bus_dev->num_vfs = num_vfs; - - nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev); - if (nsim_esw_mode_is_switchdev(nsim_dev)) { - err = nsim_esw_switchdev_enable(nsim_dev, NULL); - if (err) - nsim_bus_dev->num_vfs = 0; - } - - return err; -} - -void nsim_bus_dev_vfs_disable(struct nsim_bus_dev *nsim_bus_dev) -{ - struct nsim_dev *nsim_dev; - - nsim_bus_dev->num_vfs = 0; - nsim_dev = dev_get_drvdata(&nsim_bus_dev->dev); - if (nsim_esw_mode_is_switchdev(nsim_dev)) - nsim_esw_legacy_enable(nsim_dev, NULL); -} - static ssize_t nsim_bus_dev_numvfs_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -69,27 +35,13 @@ nsim_bus_dev_numvfs_store(struct device *dev, struct device_attribute *attr, if (ret) return ret; - mutex_lock(&nsim_bus_dev->vfs_lock); - if (nsim_bus_dev->num_vfs == num_vfs) - goto exit_good; - if (nsim_bus_dev->num_vfs && num_vfs) { - ret = -EBUSY; - goto exit_unlock; - } - - if (num_vfs) { - ret = nsim_bus_dev_vfs_enable(nsim_bus_dev, num_vfs); - if (ret) - goto exit_unlock; - } else { - nsim_bus_dev_vfs_disable(nsim_bus_dev); - } -exit_good: - ret = count; -exit_unlock: - mutex_unlock(&nsim_bus_dev->vfs_lock); + device_lock(dev); + ret = -ENOENT; + if (dev_get_drvdata(dev)) + ret = nsim_drv_configure_vfs(nsim_bus_dev, num_vfs); + device_unlock(dev); - return ret; + return ret ? ret : count; } static ssize_t @@ -105,79 +57,6 @@ static struct device_attribute nsim_bus_dev_numvfs_attr = __ATTR(sriov_numvfs, 0664, nsim_bus_dev_numvfs_show, nsim_bus_dev_numvfs_store); -ssize_t nsim_bus_dev_max_vfs_read(struct file *file, - char __user *data, - size_t count, loff_t *ppos) -{ - struct nsim_bus_dev *nsim_bus_dev = file->private_data; - char buf[11]; - ssize_t len; - - len = snprintf(buf, sizeof(buf), "%u\n", nsim_bus_dev->max_vfs); - if (len < 0) - return len; - - return simple_read_from_buffer(data, count, ppos, buf, len); -} - -ssize_t nsim_bus_dev_max_vfs_write(struct file *file, - const char __user *data, - size_t count, loff_t *ppos) -{ - struct nsim_bus_dev *nsim_bus_dev = file->private_data; - struct nsim_vf_config *vfconfigs; - ssize_t ret; - char buf[10]; - u32 val; - - if (*ppos != 0) - return 0; - - if (count >= sizeof(buf)) - return -ENOSPC; - - mutex_lock(&nsim_bus_dev->vfs_lock); - /* Reject if VFs are configured */ - if (nsim_bus_dev->num_vfs) { - ret = -EBUSY; - goto unlock; - } - - ret = copy_from_user(buf, data, count); - if (ret) { - ret = -EFAULT; - goto unlock; - } - - buf[count] = '\0'; - ret = kstrtouint(buf, 10, &val); - if (ret) { - ret = -EIO; - goto unlock; - } - - /* max_vfs limited by the maximum number of provided port indexes */ - if (val > NSIM_DEV_VF_PORT_INDEX_MAX - NSIM_DEV_VF_PORT_INDEX_BASE) { - ret = -ERANGE; - goto unlock; - } - - vfconfigs = kcalloc(val, sizeof(struct nsim_vf_config), GFP_KERNEL | __GFP_NOWARN); - if (!vfconfigs) { - ret = -ENOMEM; - goto unlock; - } - - kfree(nsim_bus_dev->vfconfigs); - nsim_bus_dev->vfconfigs = vfconfigs; - nsim_bus_dev->max_vfs = val; - *ppos += count; - ret = count; -unlock: - mutex_unlock(&nsim_bus_dev->vfs_lock); - return ret; -} - static ssize_t new_port_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) @@ -201,7 +80,7 @@ new_port_store(struct device *dev, struct device_attribute *attr, return -EBUSY; } - ret = nsim_dev_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); + ret = nsim_drv_port_add(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock); return ret ? ret : count; } @@ -231,7 +110,7 @@ del_port_store(struct device *dev, struct device_attribute *attr, return -EBUSY; } - ret = nsim_dev_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); + ret = nsim_drv_port_del(nsim_bus_dev, NSIM_DEV_PORT_TYPE_PF, port_index); mutex_unlock(&nsim_bus_dev->nsim_bus_reload_lock); return ret ? ret : count; } @@ -371,14 +250,14 @@ static int nsim_bus_probe(struct device *dev) { struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev); - return nsim_dev_probe(nsim_bus_dev); + return nsim_drv_probe(nsim_bus_dev); } static void nsim_bus_remove(struct device *dev) { struct nsim_bus_dev *nsim_bus_dev = to_nsim_bus_dev(dev); - nsim_dev_remove(nsim_bus_dev); + nsim_drv_remove(nsim_bus_dev); } static int nsim_num_vf(struct device *dev) @@ -420,26 +299,15 @@ nsim_bus_dev_new(unsigned int id, unsigned int port_count, unsigned int num_queu nsim_bus_dev->initial_net = current->nsproxy->net_ns; nsim_bus_dev->max_vfs = NSIM_BUS_DEV_MAX_VFS; mutex_init(&nsim_bus_dev->nsim_bus_reload_lock); - mutex_init(&nsim_bus_dev->vfs_lock); /* Disallow using nsim_bus_dev */ smp_store_release(&nsim_bus_dev->init, false); - nsim_bus_dev->vfconfigs = kcalloc(nsim_bus_dev->max_vfs, - sizeof(struct nsim_vf_config), - GFP_KERNEL | __GFP_NOWARN); - if (!nsim_bus_dev->vfconfigs) { - err = -ENOMEM; - goto err_nsim_bus_dev_id_free; - } - err = device_register(&nsim_bus_dev->dev); if (err) - goto err_nsim_vfs_free; + goto err_nsim_bus_dev_id_free; return nsim_bus_dev; -err_nsim_vfs_free: - kfree(nsim_bus_dev->vfconfigs); err_nsim_bus_dev_id_free: ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); err_nsim_bus_dev_free: @@ -453,7 +321,6 @@ static void nsim_bus_dev_del(struct nsim_bus_dev *nsim_bus_dev) smp_store_release(&nsim_bus_dev->init, false); device_unregister(&nsim_bus_dev->dev); ida_free(&nsim_bus_dev_ids, nsim_bus_dev->dev.id); - kfree(nsim_bus_dev->vfconfigs); kfree(nsim_bus_dev); } |