Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/usb usbnet: Apply hardware multicast filter updates ...



details:   https://anonhg.NetBSD.org/src/rev/dbe3ef6cf09f
branches:  trunk
changeset: 362531:dbe3ef6cf09f
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Thu Mar 03 05:53:23 2022 +0000

description:
usbnet: Apply hardware multicast filter updates synchronously again.

To make this work:

1. Do it only under a new lock, unp_mcastlock.  This lock lives at
   IPL_SOFTCLOCK so it can be taken from network stack callouts.  It
   is forbidden to acquire the usbnet core lock under unp_mcastlock.

2. Do it only after usbnet_init_rx_tx and before usbnet_stop; if
   issued at any other time, drop the update on the floor.

3. Make usbnet_init_rx_tx apply any pending multicast filter updates
   under the lock before setting the flag that allows SIOCADDMULTI or
   SIOCDELMULTI to apply the updates.

4. Remove core lock asserts from various drivers' register access
   routines.  This is necessary because the multicast filter updates
   are done with register reads/writes, but _cannot_ take the core
   lock when the caller holds softnet_lock.

This now programs the hardware multicast filter redundantly in many
drivers which already explicitly call *_uno_mcast from the *_uno_init
routines.  This is probably harmless, but it will likely be better to
remove the explicit calls.

diffstat:

 sys/dev/usb/if_aue.c  |   14 +----
 sys/dev/usb/if_axe.c  |    6 +-
 sys/dev/usb/if_axen.c |    8 +--
 sys/dev/usb/if_smsc.c |   10 +---
 sys/dev/usb/if_udav.c |   11 +---
 sys/dev/usb/if_ure.c  |    6 +-
 sys/dev/usb/if_url.c  |    8 +--
 sys/dev/usb/usbnet.c  |  128 +++++++++++++++++--------------------------------
 8 files changed, 59 insertions(+), 132 deletions(-)

diffs (truncated from 515 to 300 lines):

diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_aue.c
--- a/sys/dev/usb/if_aue.c      Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_aue.c      Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_aue.c,v 1.180 2022/03/03 05:53:14 riastradh Exp $   */
+/*     $NetBSD: if_aue.c,v 1.181 2022/03/03 05:53:23 riastradh Exp $   */
 
 /*
  * Copyright (c) 1997, 1998, 1999, 2000
@@ -76,7 +76,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.180 2022/03/03 05:53:14 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_aue.c,v 1.181 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -284,8 +284,6 @@
        usbd_status             err;
        uByte                   val = 0;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -315,8 +313,6 @@
        usbd_status             err;
        uWord                   val;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -346,8 +342,6 @@
        usbd_status             err;
        uByte                   val;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -378,8 +372,6 @@
        usbd_status             err;
        uWord                   val;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -624,8 +616,6 @@
        AUEHIST_FUNC();
        AUEHIST_CALLARGSN(5, "aue%jd: enter", device_unit(un->un_dev), 0, 0, 0);
 
-       usbnet_isowned_core(un);
-
        if (ifp->if_flags & IFF_PROMISC) {
                ETHER_LOCK(ec);
 allmulti:
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_axe.c
--- a/sys/dev/usb/if_axe.c      Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_axe.c      Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_axe.c,v 1.141 2022/03/03 05:53:04 riastradh Exp $   */
+/*     $NetBSD: if_axe.c,v 1.142 2022/03/03 05:53:23 riastradh Exp $   */
 /*     $OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.141 2022/03/03 05:53:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.142 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -293,8 +293,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return -1;
 
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_axen.c
--- a/sys/dev/usb/if_axen.c     Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_axen.c     Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_axen.c,v 1.83 2022/03/03 05:53:04 riastradh Exp $   */
+/*     $NetBSD: if_axen.c,v 1.84 2022/03/03 05:53:23 riastradh Exp $   */
 /*     $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.83 2022/03/03 05:53:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.84 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -108,8 +108,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -239,8 +237,6 @@
        if (usbnet_isdying(un))
                return;
 
-       usbnet_isowned_core(un);
-
        rxmode = 0;
 
        /* Enable receiver, set RX mode */
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_smsc.c
--- a/sys/dev/usb/if_smsc.c     Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_smsc.c     Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_smsc.c,v 1.82 2022/03/03 05:53:14 riastradh Exp $   */
+/*     $NetBSD: if_smsc.c,v 1.83 2022/03/03 05:53:23 riastradh Exp $   */
 
 /*     $OpenBSD: if_smsc.c,v 1.4 2012/09/27 12:38:11 jsg Exp $ */
 /*     $FreeBSD: src/sys/dev/usb/net/if_smsc.c,v 1.1 2012/08/15 04:03:55 gonzo Exp $ */
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.82 2022/03/03 05:53:14 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_smsc.c,v 1.83 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -211,8 +211,6 @@
        uint32_t buf;
        usbd_status err;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -238,8 +236,6 @@
        uint32_t buf;
        usbd_status err;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return 0;
 
@@ -422,8 +418,6 @@
        uint32_t hashtbl[2] = { 0, 0 };
        uint32_t hash;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return;
 
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_udav.c
--- a/sys/dev/usb/if_udav.c     Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_udav.c     Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_udav.c,v 1.87 2022/03/03 05:53:14 riastradh Exp $   */
+/*     $NetBSD: if_udav.c,v 1.88 2022/03/03 05:53:23 riastradh Exp $   */
 /*     $nabe: if_udav.c,v 1.3 2003/08/21 16:57:19 nabe Exp $   */
 
 /*
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.87 2022/03/03 05:53:14 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_udav.c,v 1.88 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -364,7 +364,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
        KASSERT(!usbnet_isdying(un));
 
        DPRINTFN(0x200,
@@ -395,7 +394,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
        KASSERT(!usbnet_isdying(un));
 
        DPRINTFN(0x200,
@@ -424,8 +422,6 @@
 {
        uint8_t val = 0;
 
-       usbnet_isowned_core(un);
-
        DPRINTFN(0x200,
                ("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
@@ -442,7 +438,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
        KASSERT(!usbnet_isdying(un));
 
        DPRINTFN(0x200,
@@ -586,8 +581,6 @@
 
        DPRINTF(("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return;
 
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_ure.c
--- a/sys/dev/usb/if_ure.c      Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_ure.c      Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_ure.c,v 1.48 2022/03/03 05:53:04 riastradh Exp $    */
+/*     $NetBSD: if_ure.c,v 1.49 2022/03/03 05:53:23 riastradh Exp $    */
 /*     $OpenBSD: if_ure.c,v 1.10 2018/11/02 21:32:30 jcs Exp $ */
 
 /*-
@@ -30,7 +30,7 @@
 /* RealTek RTL8152/RTL8153 10/100/Gigabit USB Ethernet device */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.48 2022/03/03 05:53:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ure.c,v 1.49 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -340,8 +340,6 @@
        uint32_t mchash[2] = { 0, 0 };
        uint32_t h = 0, rxmode;
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return;
 
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/if_url.c
--- a/sys/dev/usb/if_url.c      Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/if_url.c      Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_url.c,v 1.87 2022/03/03 05:53:04 riastradh Exp $    */
+/*     $NetBSD: if_url.c,v 1.88 2022/03/03 05:53:23 riastradh Exp $    */
 
 /*
  * Copyright (c) 2001, 2002
@@ -44,7 +44,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.87 2022/03/03 05:53:04 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_url.c,v 1.88 2022/03/03 05:53:23 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -268,8 +268,6 @@
        usb_device_request_t req;
        usbd_status err;
 
-       usbnet_isowned_core(un);
-
        DPRINTFN(0x200,
                ("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
@@ -435,8 +433,6 @@
 
        DPRINTF(("%s: %s: enter\n", device_xname(un->un_dev), __func__));
 
-       usbnet_isowned_core(un);
-
        if (usbnet_isdying(un))
                return;
 
diff -r 46437a55a446 -r dbe3ef6cf09f sys/dev/usb/usbnet.c
--- a/sys/dev/usb/usbnet.c      Thu Mar 03 05:53:14 2022 +0000
+++ b/sys/dev/usb/usbnet.c      Thu Mar 03 05:53:23 2022 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: usbnet.c,v 1.81 2022/03/03 05:52:46 riastradh Exp $    */
+/*     $NetBSD: usbnet.c,v 1.82 2022/03/03 05:53:23 riastradh Exp $    */



Home | Main Index | Thread Index | Old Index