[PATCH 315/437] drivers/net/netdevsim: convert to read/write iterators

Jens Axboe
2024-04-11T15:40:23Z

drivers/net/netdevsim/dev.c | 73 ++++++++++++++---------------
drivers/net/netdevsim/fib.c | 16 +++----
drivers/net/netdevsim/health.c | 12 ++---
drivers/net/netdevsim/hwstats.c | 13 +++--
drivers/net/netdevsim/ipsec.c | 10 ++--
drivers/net/netdevsim/psample.c | 12 ++---
drivers/net/netdevsim/udp_tunnels.c | 9 ++--
7 files changed, 69 insertions(+), 76 deletions(-)

diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
index 92a7a36b93ac..41d49c53da39 100644
--- a/drivers/net/netdevsim/dev.c
+++ b/drivers/net/netdevsim/dev.c
@@ -93,11 +93,10 @@ nsim_dev_take_snapshot(struct devlink *devlink,
return 0;
}

-static ssize_t nsim_dev_take_snapshot_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_take_snapshot_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
- struct nsim_dev *nsim_dev = file->private_data;
+ struct nsim_dev *nsim_dev = iocb->ki_filp->private_data;
struct devlink *devlink;
u8 *dummy_data;
int err;
@@ -124,21 +123,20 @@ static ssize_t nsim_dev_take_snapshot_write(struct file *file,
return err;
}

- return count;
+ return iov_iter_count(from);
}

static const struct file_operations nsim_dev_take_snapshot_fops = {
.open = simple_open,
- .write = nsim_dev_take_snapshot_write,
+ .write_iter = nsim_dev_take_snapshot_write,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};

-static ssize_t nsim_dev_trap_fa_cookie_read(struct file *file,
- char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_trap_fa_cookie_read(struct kiocb *iocb,
+ struct iov_iter *to)
{
- struct nsim_dev *nsim_dev = file->private_data;
+ struct nsim_dev *nsim_dev = iocb->ki_filp->private_data;
struct flow_action_cookie *fa_cookie;
unsigned int buf_len;
ssize_t ret;
@@ -159,7 +157,7 @@ static ssize_t nsim_dev_trap_fa_cookie_read(struct file *file,
bin2hex(buf, fa_cookie->cookie, fa_cookie->cookie_len);
spin_unlock(&nsim_dev->fa_cookie_lock);

- ret = simple_read_from_buffer(data, count, ppos, buf, buf_len);
+ ret = simple_copy_to_iter(buf, &iocb->ki_pos, buf_len, to);

kfree(buf);
return ret;
@@ -169,23 +167,23 @@ static ssize_t nsim_dev_trap_fa_cookie_read(struct file *file,
return ret;
}

-static ssize_t nsim_dev_trap_fa_cookie_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_trap_fa_cookie_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
- struct nsim_dev *nsim_dev = file->private_data;
+ struct nsim_dev *nsim_dev = iocb->ki_filp->private_data;
struct flow_action_cookie *fa_cookie;
+ size_t count = iov_iter_count(from);
size_t cookie_len;
ssize_t ret;
char *buf;

- if (*ppos != 0)
+ if (iocb->ki_pos != 0)
return -EINVAL;
cookie_len = (count - 1) / 2;
if ((count - 1) % 2)
return -EINVAL;

- buf = memdup_user(data, count);
+ buf = iterdup(from, count);
if (IS_ERR(buf))
return PTR_ERR(buf);

@@ -218,42 +216,42 @@ static ssize_t nsim_dev_trap_fa_cookie_write(struct file *file,

static const struct file_operations nsim_dev_trap_fa_cookie_fops = {
.open = simple_open,
- .read = nsim_dev_trap_fa_cookie_read,
- .write = nsim_dev_trap_fa_cookie_write,
+ .read_iter = nsim_dev_trap_fa_cookie_read,
+ .write_iter = nsim_dev_trap_fa_cookie_write,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};

-static ssize_t nsim_bus_dev_max_vfs_read(struct file *file, char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_bus_dev_max_vfs_read(struct kiocb *iocb,
+ struct iov_iter *to)
{
- struct nsim_dev *nsim_dev = file->private_data;
+ struct nsim_dev *nsim_dev = iocb->ki_filp->private_data;
char buf[11];
ssize_t len;

len = scnprintf(buf, sizeof(buf), "%u\n",
READ_ONCE(nsim_dev->nsim_bus_dev->max_vfs));

- return simple_read_from_buffer(data, count, ppos, buf, len);
+ return simple_copy_to_iter(buf, &iocb->ki_pos, len, to);
}

-static ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_bus_dev_max_vfs_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
struct nsim_vf_config *vfconfigs;
+ size_t count = iov_iter_count(from);
struct nsim_dev *nsim_dev;
char buf[10];
ssize_t ret;
u32 val;

- if (*ppos != 0)
+ if (iocb->ki_pos != 0)
return 0;

if (count >= sizeof(buf))
return -ENOSPC;

- ret = copy_from_user(buf, data, count);
+ ret = !copy_from_iter_full(buf, count, from);
if (ret)
return -EFAULT;
buf[count] = '\0';
@@ -271,7 +269,7 @@ static ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
if (!vfconfigs)
return -ENOMEM;

- nsim_dev = file->private_data;
+ nsim_dev = iocb->ki_filp->private_data;
devl_lock(priv_to_devlink(nsim_dev));
/* Reject if VFs are configured */
if (nsim_dev_get_vfs(nsim_dev)) {
@@ -279,7 +277,7 @@ static ssize_t nsim_bus_dev_max_vfs_write(struct file *file,
} else {
swap(nsim_dev->vfconfigs, vfconfigs);
WRITE_ONCE(nsim_dev->nsim_bus_dev->max_vfs, val);
- *ppos += count;
+ iocb->ki_pos += count;
ret = count;
}
devl_unlock(priv_to_devlink(nsim_dev));
@@ -290,8 +288,8 @@ static ssize_t nsim_bus_dev_max_vfs_write(struct file *file,

static const struct file_operations nsim_dev_max_vfs_fops = {
.open = simple_open,
- .read = nsim_bus_dev_max_vfs_read,
- .write = nsim_bus_dev_max_vfs_write,
+ .read_iter = nsim_bus_dev_max_vfs_read,
+ .write_iter = nsim_bus_dev_max_vfs_write,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};
@@ -367,23 +365,22 @@ static void nsim_dev_debugfs_exit(struct nsim_dev *nsim_dev)
debugfs_remove_recursive(nsim_dev->ddir);
}

-static ssize_t nsim_dev_rate_parent_read(struct file *file,
- char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_rate_parent_read(struct kiocb *iocb,
+ struct iov_iter *to)
{
- char **name_ptr = file->private_data;
+ char **name_ptr = iocb->ki_filp->private_data;
size_t len;

if (!*name_ptr)
return 0;

len = strlen(*name_ptr);
- return simple_read_from_buffer(data, count, ppos, *name_ptr, len);
+ return simple_copy_to_iter(*name_ptr, &iocb->ki_pos, len, to);
}

static const struct file_operations nsim_dev_rate_parent_fops = {
.open = simple_open,
- .read = nsim_dev_rate_parent_read,
+ .read_iter = nsim_dev_rate_parent_read,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};
diff --git a/drivers/net/netdevsim/fib.c b/drivers/net/netdevsim/fib.c
index a1f91ff8ec56..4ab1b7944f3e 100644
--- a/drivers/net/netdevsim/fib.c
+++ b/drivers/net/netdevsim/fib.c
@@ -1361,15 +1361,15 @@ static void nsim_nexthop_free(void *ptr, void *arg)
nsim_nexthop_destroy(nexthop);
}

-static ssize_t nsim_nexthop_bucket_activity_write(struct file *file,
- const char __user *user_buf,
- size_t size, loff_t *ppos)
+static ssize_t nsim_nexthop_bucket_activity_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
- struct nsim_fib_data *data = file->private_data;
+ struct nsim_fib_data *data = iocb->ki_filp->private_data;
struct net *net = devlink_net(data->devlink);
+ size_t size = iov_iter_count(from);
struct nsim_nexthop *nexthop;
unsigned long *activity;
- loff_t pos = *ppos;
+ loff_t pos = iocb->ki_pos;
u16 bucket_index;
char buf[128];
int err = 0;
@@ -1379,7 +1379,7 @@ static ssize_t nsim_nexthop_bucket_activity_write(struct file *file,
return -EINVAL;
if (size > sizeof(buf))
return -EINVAL;
- if (copy_from_user(buf, user_buf, size))
+ if (!copy_from_iter_full(buf, size, from))
return -EFAULT;
if (sscanf(buf, "%u %hu", &nhid, &bucket_index) != 2)
return -EINVAL;
@@ -1407,13 +1407,13 @@ static ssize_t nsim_nexthop_bucket_activity_write(struct file *file,
out:
rtnl_unlock();

- *ppos = size;
+ iocb->ki_pos = size;
return err ?: size;
}

static const struct file_operations nsim_nexthop_bucket_activity_fops = {
.open = simple_open,
- .write = nsim_nexthop_bucket_activity_write,
+ .write_iter = nsim_nexthop_bucket_activity_write,
.llseek = no_llseek,
.owner = THIS_MODULE,
};
diff --git a/drivers/net/netdevsim/health.c b/drivers/net/netdevsim/health.c
index 70e8bdf34be9..b1c23d23bee2 100644
--- a/drivers/net/netdevsim/health.c
+++ b/drivers/net/netdevsim/health.c
@@ -140,16 +140,16 @@ struct devlink_health_reporter_ops nsim_dev_dummy_reporter_ops = {
.diagnose = nsim_dev_dummy_reporter_diagnose,
};

-static ssize_t nsim_dev_health_break_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_health_break_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
- struct nsim_dev_health *health = file->private_data;
+ struct nsim_dev_health *health = iocb->ki_filp->private_data;
struct nsim_dev_dummy_reporter_ctx ctx;
+ size_t count = iov_iter_count(from);
char *break_msg;
int err;

- break_msg = memdup_user_nul(data, count);
+ break_msg = iterdup_nul(from, count);
if (IS_ERR(break_msg))
return PTR_ERR(break_msg);

@@ -168,7 +168,7 @@ static ssize_t nsim_dev_health_break_write(struct file *file,

static const struct file_operations nsim_dev_health_break_fops = {
.open = simple_open,
- .write = nsim_dev_health_break_write,
+ .write_iter = nsim_dev_health_break_write,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};
diff --git a/drivers/net/netdevsim/hwstats.c b/drivers/net/netdevsim/hwstats.c
index 0e58aa7f0374..8e9b13c464a8 100644
--- a/drivers/net/netdevsim/hwstats.c
+++ b/drivers/net/netdevsim/hwstats.c
@@ -337,20 +337,19 @@ struct nsim_dev_hwstats_fops {
};

static ssize_t
-nsim_dev_hwstats_do_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+nsim_dev_hwstats_do_write(struct kiocb *iocb, struct iov_iter *from)
{
- struct nsim_dev_hwstats *hwstats = file->private_data;
+ struct nsim_dev_hwstats *hwstats = iocb->ki_filp->private_data;
struct nsim_dev_hwstats_fops *hwsfops;
+ size_t count = iov_iter_count(from);
struct list_head *hwsdev_list;
int ifindex;
int err;

- hwsfops = container_of(debugfs_real_fops(file),
+ hwsfops = container_of(debugfs_real_fops(iocb->ki_filp),
struct nsim_dev_hwstats_fops, fops);

- err = kstrtoint_from_user(data, count, 0, &ifindex);
+ err = kstrtoint_from_iter(from, count, 0, &ifindex);
if (err)
return err;

@@ -385,7 +384,7 @@ nsim_dev_hwstats_do_write(struct file *file,
{ \
.fops = { \
.open = simple_open, \
- .write = nsim_dev_hwstats_do_write, \
+ .write_iter = nsim_dev_hwstats_do_write, \
.llseek = generic_file_llseek, \
.owner = THIS_MODULE, \
}, \
diff --git a/drivers/net/netdevsim/ipsec.c b/drivers/net/netdevsim/ipsec.c
index f0d58092e7e9..16535c552d12 100644
--- a/drivers/net/netdevsim/ipsec.c
+++ b/drivers/net/netdevsim/ipsec.c
@@ -9,11 +9,9 @@

#define NSIM_IPSEC_AUTH_BITS 128

-static ssize_t nsim_dbg_netdev_ops_read(struct file *filp,
- char __user *buffer,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dbg_netdev_ops_read(struct kiocb *iocb, struct iov_iter *to)
{
- struct netdevsim *ns = filp->private_data;
+ struct netdevsim *ns = iocb->ki_filp->private_data;
struct nsim_ipsec *ipsec = &ns->ipsec;
size_t bufsize;
char *buf, *p;
@@ -53,7 +51,7 @@ static ssize_t nsim_dbg_netdev_ops_read(struct file *filp,
sap->key[2], sap->key[3]);
}

- len = simple_read_from_buffer(buffer, count, ppos, buf, p - buf);
+ len = simple_copy_to_iter(buf, &iocb->ki_pos, p - buf, to);

kfree(buf);
return len;
@@ -62,7 +60,7 @@ static ssize_t nsim_dbg_netdev_ops_read(struct file *filp,
static const struct file_operations ipsec_dbg_fops = {
.owner = THIS_MODULE,
.open = simple_open,
- .read = nsim_dbg_netdev_ops_read,
+ .read_iter = nsim_dbg_netdev_ops_read,
};

static int nsim_ipsec_find_empty_idx(struct nsim_ipsec *ipsec)
diff --git a/drivers/net/netdevsim/psample.c b/drivers/net/netdevsim/psample.c
index f0c6477dd0ae..21353aea4f4a 100644
--- a/drivers/net/netdevsim/psample.c
+++ b/drivers/net/netdevsim/psample.c
@@ -168,15 +168,15 @@ static int nsim_dev_psample_disable(struct nsim_dev *nsim_dev)
return 0;
}

-static ssize_t nsim_dev_psample_enable_write(struct file *file,
- const char __user *data,
- size_t count, loff_t *ppos)
+static ssize_t nsim_dev_psample_enable_write(struct kiocb *iocb,
+ struct iov_iter *from)
{
- struct nsim_dev *nsim_dev = file->private_data;
+ struct nsim_dev *nsim_dev = iocb->ki_filp->private_data;
+ size_t count = iov_iter_count(from);
bool enable;
int err;

- err = kstrtobool_from_user(data, count, &enable);
+ err = kstrtobool_from_iter(from, count, &enable);
if (err)
return err;

@@ -190,7 +190,7 @@ static ssize_t nsim_dev_psample_enable_write(struct file *file,

static const struct file_operations nsim_psample_enable_fops = {
.open = simple_open,
- .write = nsim_dev_psample_enable_write,
+ .write_iter = nsim_dev_psample_enable_write,
.llseek = generic_file_llseek,
.owner = THIS_MODULE,
};
diff --git a/drivers/net/netdevsim/udp_tunnels.c b/drivers/net/netdevsim/udp_tunnels.c
index 02dc3123eb6c..efbd5af4562c 100644
--- a/drivers/net/netdevsim/udp_tunnels.c
+++ b/drivers/net/netdevsim/udp_tunnels.c
@@ -106,10 +106,9 @@ static const struct udp_tunnel_nic_info nsim_udp_tunnel_info = {
};

static ssize_t
-nsim_udp_tunnels_info_reset_write(struct file *file, const char __user *data,
- size_t count, loff_t *ppos)
+nsim_udp_tunnels_info_reset_write(struct kiocb *iocb, struct iov_iter *from)
{
- struct net_device *dev = file->private_data;
+ struct net_device *dev = iocb->ki_filp->private_data;
struct netdevsim *ns = netdev_priv(dev);

memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
@@ -117,12 +116,12 @@ nsim_udp_tunnels_info_reset_write(struct file *file, const char __user *data,
udp_tunnel_nic_reset_ntf(dev);
rtnl_unlock();

- return count;
+ return iov_iter_count(from);
}

static const struct file_operations nsim_udp_tunnels_info_reset_fops = {
.open = simple_open,
- .write = nsim_udp_tunnels_info_reset_write,
+ .write_iter = nsim_udp_tunnels_info_reset_write,
.llseek = generic_file_llseek,