From: Breno Leitao Date: Wed, 20 May 2026 16:53:48 +0000 (-0700) Subject: xdp: convert to getsockopt_iter X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c6776b5b9120f912ff3a02a2c205a90104e2b0f;p=thirdparty%2Flinux.git 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 Signed-off-by: Breno Leitao Link: https://patch.msgid.link/20260520-getsock_four-v3-3-b8c0b16b7780@debian.org Signed-off-by: Jakub Kicinski --- diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c index 5e5786cd9af55..77f8de054a1be 100644 --- a/net/xdp/xsk.c +++ b/net/xdp/xsk.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -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,