diff options
| author | Breno Leitao <leitao@debian.org> | 2026-05-20 09:53:48 -0700 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2026-05-22 11:11:09 -0700 |
| commit | 3c6776b5b9120f912ff3a02a2c205a90104e2b0f (patch) | |
| tree | 1cd43097cd3d9d2d7ec70d7ef50f6ce66418d380 /net | |
| parent | 4177767daf83f4e7bd9b017febd4198b3fad20e9 (diff) | |
| download | linux-next-3c6776b5b9120f912ff3a02a2c205a90104e2b0f.tar.gz linux-next-3c6776b5b9120f912ff3a02a2c205a90104e2b0f.zip | |
xdp: convert to getsockopt_iter
Convert XDP socket's getsockopt implementation to use the new
getsockopt_iter callback with sockopt_t.
Key changes:
- Replace (char __user *optval, int __user *optlen) with sockopt_t *opt
- Use opt->optlen for buffer length (input) and returned size (output)
- Use copy_to_iter() instead of put_user()/copy_to_user()
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Signed-off-by: Breno Leitao <leitao@debian.org>
Link: https://patch.msgid.link/20260520-getsock_four-v3-3-b8c0b16b7780@debian.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net')
| -rw-r--r-- | net/xdp/xsk.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 5e5786cd9af5..77f8de054a1b 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -22,6 +22,7 @@ #include <linux/net.h> #include <linux/netdevice.h> #include <linux/rculist.h> +#include <linux/uio.h> #include <linux/vmalloc.h> #include <net/netdev_queues.h> @@ -1729,7 +1730,7 @@ struct xdp_statistics_v1 { }; static int xsk_getsockopt(struct socket *sock, int level, int optname, - char __user *optval, int __user *optlen) + sockopt_t *opt) { struct sock *sk = sock->sk; struct xdp_sock *xs = xdp_sk(sk); @@ -1738,8 +1739,7 @@ static int xsk_getsockopt(struct socket *sock, int level, int optname, if (level != SOL_XDP) return -ENOPROTOOPT; - if (get_user(len, optlen)) - return -EFAULT; + len = opt->optlen; if (len < 0) return -EINVAL; @@ -1773,10 +1773,10 @@ static int xsk_getsockopt(struct socket *sock, int level, int optname, stats.tx_invalid_descs = xskq_nb_invalid_descs(xs->tx); mutex_unlock(&xs->mutex); - if (copy_to_user(optval, &stats, stats_size)) - return -EFAULT; - if (put_user(stats_size, optlen)) + if (copy_to_iter(&stats, stats_size, &opt->iter_out) != + stats_size) return -EFAULT; + opt->optlen = stats_size; return 0; } @@ -1825,10 +1825,9 @@ static int xsk_getsockopt(struct socket *sock, int level, int optname, to_copy = &off_v1; } - if (copy_to_user(optval, to_copy, len)) - return -EFAULT; - if (put_user(len, optlen)) + if (copy_to_iter(to_copy, len, &opt->iter_out) != len) return -EFAULT; + opt->optlen = len; return 0; } @@ -1845,10 +1844,9 @@ static int xsk_getsockopt(struct socket *sock, int level, int optname, mutex_unlock(&xs->mutex); len = sizeof(opts); - if (copy_to_user(optval, &opts, len)) - return -EFAULT; - if (put_user(len, optlen)) + if (copy_to_iter(&opts, len, &opt->iter_out) != len) return -EFAULT; + opt->optlen = len; return 0; } @@ -1949,7 +1947,7 @@ static const struct proto_ops xsk_proto_ops = { .listen = sock_no_listen, .shutdown = sock_no_shutdown, .setsockopt = xsk_setsockopt, - .getsockopt = xsk_getsockopt, + .getsockopt_iter = xsk_getsockopt, .sendmsg = xsk_sendmsg, .recvmsg = xsk_recvmsg, .mmap = xsk_mmap, |
