Date: Fri, 3 Sep 2021 22:10:13 GMT From: Alexander Motin <mav@FreeBSD.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org Subject: git: cd85b97e0e70 - main - rt(4): Replace Giant callout+task with timeout_task. Message-ID: <202109032210.183MADNU095147@gitrepo.freebsd.org>
next in thread | raw e-mail | index | archive | help
The branch main has been updated by mav: URL: https://cgit.FreeBSD.org/src/commit/?id=cd85b97e0e701bc87cc5bdb9844168a1f5c204e1 commit cd85b97e0e701bc87cc5bdb9844168a1f5c204e1 Author: Alexander Motin <mav@FreeBSD.org> AuthorDate: 2021-09-03 22:08:29 +0000 Commit: Alexander Motin <mav@FreeBSD.org> CommitDate: 2021-09-03 22:10:06 +0000 rt(4): Replace Giant callout+task with timeout_task. --- sys/dev/rt/if_rt.c | 40 +++++++++++++--------------------------- sys/dev/rt/if_rtvar.h | 3 +-- 2 files changed, 14 insertions(+), 29 deletions(-) diff --git a/sys/dev/rt/if_rt.c b/sys/dev/rt/if_rt.c index 91fa165bab69..87f0bce6c425 100644 --- a/sys/dev/rt/if_rt.c +++ b/sys/dev/rt/if_rt.c @@ -139,7 +139,6 @@ static void rt_stop_locked(void *priv); static void rt_stop(void *priv); static void rt_start(struct ifnet *ifp); static int rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data); -static void rt_periodic(void *arg); static void rt_tx_watchdog(void *arg); static void rt_intr(void *arg); static void rt_rt5350_intr(void *arg); @@ -288,7 +287,7 @@ generate_mac(uint8_t *mac) static int ether_request_mac(device_t dev, uint8_t *mac) { - char *var; + const char *var; /* * "ethaddr" is passed via envp on RedBoot platforms @@ -312,7 +311,7 @@ ether_request_mac(device_t dev, uint8_t *mac) * hint.[dev].[unit].macaddr */ if (!resource_string_value(device_get_name(dev), - device_get_unit(dev), "macaddr", (const char **)&var)) { + device_get_unit(dev), "macaddr", &var)) { if(!macaddr_atoi(var, mac)) { printf("%s: use %s macaddr from hints\n", device_get_nameunit(dev), var); @@ -518,7 +517,6 @@ rt_attach(device_t dev) } } - callout_init(&sc->periodic_ch, 0); callout_init_mtx(&sc->tx_watchdog_ch, &sc->lock, 0); ifp = sc->ifp = if_alloc(IFT_ETHER); @@ -571,7 +569,6 @@ rt_attach(device_t dev) /* init task queue */ NET_TASK_INIT(&sc->rx_done_task, 0, rt_rx_done_task, sc); TASK_INIT(&sc->tx_done_task, 0, rt_tx_done_task, sc); - TASK_INIT(&sc->periodic_task, 0, rt_periodic_task, sc); sc->rx_process_limit = 100; @@ -581,6 +578,9 @@ rt_attach(device_t dev) taskqueue_start_threads(&sc->taskqueue, 1, PI_NET, "%s taskq", device_get_nameunit(sc->dev)); + TIMEOUT_TASK_INIT(sc->taskqueue, &sc->periodic_task, 0, + rt_periodic_task, sc); + rt_sysctl_attach(sc); /* set up interrupt */ @@ -709,22 +709,20 @@ rt_detach(device_t dev) RT_DPRINTF(sc, RT_DEBUG_ANY, "detaching\n"); RT_SOFTC_LOCK(sc); - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - - callout_stop(&sc->periodic_ch); callout_stop(&sc->tx_watchdog_ch); + RT_SOFTC_UNLOCK(sc); taskqueue_drain(sc->taskqueue, &sc->rx_done_task); taskqueue_drain(sc->taskqueue, &sc->tx_done_task); - taskqueue_drain(sc->taskqueue, &sc->periodic_task); + taskqueue_drain_timeout(sc->taskqueue, &sc->periodic_task); /* free Tx and Rx rings */ + RT_SOFTC_LOCK(sc); for (i = 0; i < RT_SOFTC_TX_RING_COUNT; i++) rt_free_tx_ring(sc, &sc->tx_ring[i]); for (i = 0; i < sc->rx_ring_count; i++) rt_free_rx_ring(sc, &sc->rx_ring[i]); - RT_SOFTC_UNLOCK(sc); #ifdef IF_RT_PHY_SUPPORT @@ -942,7 +940,7 @@ rt_init_locked(void *priv) sc->periodic_round = 0; - callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc); + taskqueue_enqueue_timeout(sc->taskqueue, &sc->periodic_task, hz / 10); return; @@ -981,7 +979,6 @@ rt_stop_locked(void *priv) RT_SOFTC_ASSERT_LOCKED(sc); sc->tx_timer = 0; ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - callout_stop(&sc->periodic_ch); callout_stop(&sc->tx_watchdog_ch); RT_SOFTC_UNLOCK(sc); taskqueue_block(sc->taskqueue); @@ -993,7 +990,9 @@ rt_stop_locked(void *priv) #ifdef notyet taskqueue_drain(sc->taskqueue, &sc->rx_done_task); taskqueue_drain(sc->taskqueue, &sc->tx_done_task); - taskqueue_drain(sc->taskqueue, &sc->periodic_task); + taskqueue_drain_timeout(sc->taskqueue, &sc->periodic_task); +#else + taskqueue_cancel_timeout(sc->taskqueue, &sc->periodic_task, NULL); #endif RT_SOFTC_LOCK(sc); @@ -1308,19 +1307,6 @@ rt_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) return (error); } -/* - * rt_periodic - Handler of PERIODIC interrupt - */ -static void -rt_periodic(void *arg) -{ - struct rt_softc *sc; - - sc = arg; - RT_DPRINTF(sc, RT_DEBUG_PERIODIC, "periodic\n"); - taskqueue_enqueue(sc->taskqueue, &sc->periodic_task); -} - /* * rt_tx_watchdog - Handler of TX Watchdog */ @@ -1836,7 +1822,7 @@ rt_periodic_task(void *context, int pending) } RT_SOFTC_UNLOCK(sc); - callout_reset(&sc->periodic_ch, hz / 10, rt_periodic, sc); + taskqueue_enqueue_timeout(sc->taskqueue, &sc->periodic_task, hz / 10); } /* diff --git a/sys/dev/rt/if_rtvar.h b/sys/dev/rt/if_rtvar.h index aa1fd8da00d6..216e9cb74bca 100644 --- a/sys/dev/rt/if_rtvar.h +++ b/sys/dev/rt/if_rtvar.h @@ -226,8 +226,7 @@ struct rt_softc struct task rx_done_task; int rx_process_limit; struct task tx_done_task; - struct task periodic_task; - struct callout periodic_ch; + struct timeout_task periodic_task; unsigned long periodic_round; struct taskqueue *taskqueue;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202109032210.183MADNU095147>