net/packet: Add getsockopt support for PACKET_COPY_THRESH
authorJuntong Deng <juntong.deng@outlook.com>
Fri, 8 Mar 2024 13:06:36 +0000 (13:06 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 11 Mar 2024 22:52:05 +0000 (15:52 -0700)
Currently getsockopt does not support PACKET_COPY_THRESH,
and we are unable to get the value of PACKET_COPY_THRESH
socket option through getsockopt.

This patch adds getsockopt support for PACKET_COPY_THRESH.

In addition, this patch converts access to copy_thresh to
READ_ONCE/WRITE_ONCE.

Signed-off-by: Juntong Deng <juntong.deng@outlook.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Link: https://lore.kernel.org/r/AM6PR03MB58487A9704FD150CF76F542899272@AM6PR03MB5848.eurprd03.prod.outlook.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/packet/af_packet.c
net/packet/diag.c

index 0db31ca4982daea787fc3cb15c28e501de1f95bb..61270826b9ac73e66f9011c3230d4668f0bf7c77 100644 (file)
@@ -2318,7 +2318,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
        }
        if (po->tp_version <= TPACKET_V2) {
                if (macoff + snaplen > po->rx_ring.frame_size) {
-                       if (po->copy_thresh &&
+                       if (READ_ONCE(po->copy_thresh) &&
                            atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) {
                                if (skb_shared(skb)) {
                                        copy_skb = skb_clone(skb, GFP_ATOMIC);
@@ -3836,7 +3836,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, sockptr_t optval,
                if (copy_from_sockptr(&val, optval, sizeof(val)))
                        return -EFAULT;
 
-               pkt_sk(sk)->copy_thresh = val;
+               WRITE_ONCE(pkt_sk(sk)->copy_thresh, val);
                return 0;
        }
        case PACKET_VERSION:
@@ -4090,6 +4090,9 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
        case PACKET_VNET_HDR_SZ:
                val = READ_ONCE(po->vnet_hdr_sz);
                break;
+       case PACKET_COPY_THRESH:
+               val = READ_ONCE(pkt_sk(sk)->copy_thresh);
+               break;
        case PACKET_VERSION:
                val = po->tp_version;
                break;
index b3bd2f6c2bf7be7b1436aa1a7fad6ef3f77217ad..47f69f3dbf73e98b24fd4012eb048c776c15618f 100644 (file)
@@ -17,7 +17,7 @@ static int pdiag_put_info(const struct packet_sock *po, struct sk_buff *nlskb)
        pinfo.pdi_index = po->ifindex;
        pinfo.pdi_version = po->tp_version;
        pinfo.pdi_reserve = po->tp_reserve;
-       pinfo.pdi_copy_thresh = po->copy_thresh;
+       pinfo.pdi_copy_thresh = READ_ONCE(po->copy_thresh);
        pinfo.pdi_tstamp = READ_ONCE(po->tp_tstamp);
 
        pinfo.pdi_flags = 0;