Hi,

Before converting bpf(4) from using ticks to using real units of time
we need to serialize BIOCGRTIMEOUT and BIOCSRTIMEOUT.  Neither
operation is atomic so we need to use the per-descriptor mutex when
reading or writing the bd_rtout member.

While here we can start annotating the locking for struct members in
bpfdesc.h, too.

ok?

Index: bpf.c
===================================================================
RCS file: /cvs/src/sys/net/bpf.c,v
retrieving revision 1.193
diff -u -p -r1.193 bpf.c
--- bpf.c       4 Nov 2020 04:40:13 -0000       1.193
+++ bpf.c       10 Dec 2020 17:24:43 -0000
@@ -873,9 +873,11 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t 
                                break;
                        }
                        rtout += tv->tv_usec / tick;
+                       mtx_enter(&d->bd_mtx);
                        d->bd_rtout = rtout;
                        if (d->bd_rtout == 0 && tv->tv_usec != 0)
                                d->bd_rtout = 1;
+                       mtx_leave(&d->bd_mtx);
                        break;
                }
 
@@ -886,8 +888,10 @@ bpfioctl(dev_t dev, u_long cmd, caddr_t 
                {
                        struct timeval *tv = (struct timeval *)addr;
 
+                       mtx_enter(&d->bd_mtx);
                        tv->tv_sec = d->bd_rtout / hz;
                        tv->tv_usec = (d->bd_rtout % hz) * tick;
+                       mtx_leave(&d->bd_mtx);
                        break;
                }
 
Index: bpfdesc.h
===================================================================
RCS file: /cvs/src/sys/net/bpfdesc.h,v
retrieving revision 1.41
diff -u -p -r1.41 bpfdesc.h
--- bpfdesc.h   13 May 2020 21:34:37 -0000      1.41
+++ bpfdesc.h   10 Dec 2020 17:24:43 -0000
@@ -42,6 +42,13 @@
 
 #ifdef _KERNEL
 
+/*
+ * Locks used to protect struct members in this file:
+ *
+ *     I       immutable after initialization
+ *     m       the per-descriptor mutex (bpf_d.bd_mtx)
+ */
+
 struct bpf_program_smr {
        struct bpf_program      bps_bf;
        struct smr_entry        bps_smr;
@@ -72,7 +79,7 @@ struct bpf_d {
        int             bd_in_uiomove;  /* for debugging purpose */
 
        struct bpf_if  *bd_bif;         /* interface descriptor */
-       u_long          bd_rtout;       /* Read timeout in 'ticks' */
+       u_long          bd_rtout;       /* [m] Read timeout in 'ticks' */
        u_long          bd_rdStart;     /* when the read started */
        int             bd_rnonblock;   /* true if nonblocking reads are set */
        struct bpf_program_smr

Reply via email to