Date: Thu, 2 Jun 2016 11:16:36 +0000 (UTC) From: =?UTF-8?Q?Roger_Pau_Monn=c3=a9?= <royger@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r301198 - head/sys/dev/xen/netfront Message-ID: <201606021116.u52BGajD047287@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: royger Date: Thu Jun 2 11:16:35 2016 New Revision: 301198 URL: https://svnweb.freebsd.org/changeset/base/301198 Log: xen-netfront: switch to using an interrupt handler In order to use custom taskqueues we would have to mask the interrupt, which is basically what is already done for an interrupt handler, or else we risk loosing interrupts. This switches netfront to the same interrupt handling that was done before multiqueue support was added. Reviewed by: Wei Liu <wei.liu2@citrix.com> Sponsored by: Citrix Systems R&D Modified: head/sys/dev/xen/netfront/netfront.c Modified: head/sys/dev/xen/netfront/netfront.c ============================================================================== --- head/sys/dev/xen/netfront/netfront.c Thu Jun 2 11:14:26 2016 (r301197) +++ head/sys/dev/xen/netfront/netfront.c Thu Jun 2 11:16:35 2016 (r301198) @@ -121,9 +121,9 @@ static void xn_alloc_rx_buffers_callout( static void xn_release_rx_bufs(struct netfront_rxq *); static void xn_release_tx_bufs(struct netfront_txq *); -static void xn_rxq_intr(void *); -static void xn_txq_intr(void *); -static int xn_intr(void *); +static void xn_rxq_intr(struct netfront_rxq *); +static void xn_txq_intr(struct netfront_txq *); +static void xn_intr(void *); static inline int xn_count_frags(struct mbuf *m); static int xn_assemble_tx_request(struct netfront_txq *, struct mbuf *); static int xn_ioctl(struct ifnet *, u_long, caddr_t); @@ -188,9 +188,6 @@ struct netfront_rxq { struct lro_ctrl lro; - struct taskqueue *tq; - struct task intrtask; - struct callout rx_refill; struct xn_rx_stats stats; @@ -214,7 +211,6 @@ struct netfront_txq { struct buf_ring *br; struct taskqueue *tq; - struct task intrtask; struct task defrtask; bool full; @@ -621,9 +617,8 @@ talk_to_backend(device_t dev, struct net } static void -xn_rxq_tq_intr(void *xrxq, int pending) +xn_rxq_intr(struct netfront_rxq *rxq) { - struct netfront_rxq *rxq = xrxq; XN_RX_LOCK(rxq); xn_rxeof(rxq); @@ -642,9 +637,8 @@ xn_txq_start(struct netfront_txq *txq) } static void -xn_txq_tq_intr(void *xtxq, int pending) +xn_txq_intr(struct netfront_txq *txq) { - struct netfront_txq *txq = xtxq; XN_TX_LOCK(txq); if (RING_HAS_UNCONSUMED_RESPONSES(&txq->ring)) @@ -684,8 +678,6 @@ destroy_rxq(struct netfront_rxq *rxq) callout_drain(&rxq->rx_refill); free(rxq->ring.sring, M_DEVBUF); - taskqueue_drain_all(rxq->tq); - taskqueue_free(rxq->tq); } static void @@ -749,27 +741,11 @@ setup_rxqs(device_t dev, struct netfront goto fail_grant_ring; } - TASK_INIT(&rxq->intrtask, 0, xn_rxq_tq_intr, rxq); - rxq->tq = taskqueue_create_fast(rxq->name, M_WAITOK, - taskqueue_thread_enqueue, &rxq->tq); - callout_init(&rxq->rx_refill, 1); - - error = taskqueue_start_threads(&rxq->tq, 1, PI_NET, - "%s rxq %d", device_get_nameunit(dev), rxq->id); - if (error != 0) { - device_printf(dev, "failed to start rx taskq %d\n", - rxq->id); - goto fail_start_thread; - } } return (0); -fail_start_thread: - gnttab_end_foreign_access_ref(rxq->ring_ref); - taskqueue_drain_all(rxq->tq); - taskqueue_free(rxq->tq); fail_grant_ring: gnttab_free_grant_references(rxq->gref_head); free(rxq->ring.sring, M_DEVBUF); @@ -871,9 +847,8 @@ setup_txqs(device_t dev, struct netfront txq->br = buf_ring_alloc(NET_TX_RING_SIZE, M_DEVBUF, M_WAITOK, &txq->lock); TASK_INIT(&txq->defrtask, 0, xn_txq_tq_deferred, txq); - TASK_INIT(&txq->intrtask, 0, xn_txq_tq_intr, txq); - txq->tq = taskqueue_create_fast(txq->name, M_WAITOK, + txq->tq = taskqueue_create(txq->name, M_WAITOK, taskqueue_thread_enqueue, &txq->tq); error = taskqueue_start_threads(&txq->tq, 1, PI_NET, @@ -885,10 +860,9 @@ setup_txqs(device_t dev, struct netfront } error = xen_intr_alloc_and_bind_local_port(dev, - xenbus_get_otherend_id(dev), xn_intr, /* handler */ NULL, - &info->txq[q], - INTR_TYPE_NET | INTR_MPSAFE | INTR_ENTROPY, - &txq->xen_intr_handle); + xenbus_get_otherend_id(dev), /* filter */ NULL, xn_intr, + &info->txq[q], INTR_TYPE_NET | INTR_MPSAFE | INTR_ENTROPY, + &txq->xen_intr_handle); if (error != 0) { device_printf(dev, "xen_intr_alloc_and_bind_local_port failed\n"); @@ -1356,28 +1330,11 @@ xn_txeof(struct netfront_txq *txq) if (txq->full && ((txq->ring.sring->req_prod - prod) < NET_TX_RING_SIZE)) { txq->full = false; - taskqueue_enqueue(txq->tq, &txq->intrtask); + xn_txq_start(txq); } } - static void -xn_rxq_intr(void *xrxq) -{ - struct netfront_rxq *rxq = xrxq; - - taskqueue_enqueue(rxq->tq, &rxq->intrtask); -} - -static void -xn_txq_intr(void *xtxq) -{ - struct netfront_txq *txq = xtxq; - - taskqueue_enqueue(txq->tq, &txq->intrtask); -} - -static int xn_intr(void *xsc) { struct netfront_txq *txq = xsc; @@ -1387,8 +1344,6 @@ xn_intr(void *xsc) /* kick both tx and rx */ xn_rxq_intr(rxq); xn_txq_intr(txq); - - return (FILTER_HANDLED); } static void @@ -1760,7 +1715,7 @@ xn_ifinit_locked(struct netfront_info *n xn_alloc_rx_buffers(rxq); rxq->ring.sring->rsp_event = rxq->ring.rsp_cons + 1; if (RING_HAS_UNCONSUMED_RESPONSES(&rxq->ring)) - taskqueue_enqueue(rxq->tq, &rxq->intrtask); + xn_rxeof(rxq); XN_RX_UNLOCK(rxq); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201606021116.u52BGajD047287>