From owner-svn-src-projects@FreeBSD.ORG Wed Mar 23 19:05:35 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id EC0F61065676; Wed, 23 Mar 2011 19:05:34 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id CF3A48FC21; Wed, 23 Mar 2011 19:05:34 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p2NJ5YOI004285; Wed, 23 Mar 2011 19:05:34 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p2NJ5Yub004283; Wed, 23 Mar 2011 19:05:34 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201103231905.p2NJ5Yub004283@svn.freebsd.org> From: Attilio Rao Date: Wed, 23 Mar 2011 19:05:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219927 - projects/sv/sys/dev/e1000 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Mar 2011 19:05:35 -0000 Author: attilio Date: Wed Mar 23 19:05:34 2011 New Revision: 219927 URL: http://svn.freebsd.org/changeset/base/219927 Log: Improve deadlock robustness: force intimate polling functions to skip locking when possible. In this case RX_LOCK'ing in if_lem. Reported by: rstone Modified: projects/sv/sys/dev/e1000/if_lem.c Modified: projects/sv/sys/dev/e1000/if_lem.c ============================================================================== --- projects/sv/sys/dev/e1000/if_lem.c Wed Mar 23 18:08:54 2011 (r219926) +++ projects/sv/sys/dev/e1000/if_lem.c Wed Mar 23 19:05:34 2011 (r219927) @@ -95,6 +95,14 @@ if ((locking) != 0) \ EM_CORE_UNLOCK(adapter); \ } while (0) +#define EM_RX_LOCK_COND(adapter, locking) do { \ + if ((locking) != 0) \ + EM_RX_LOCK(adapter); \ +} while (0) +#define EM_RX_UNLOCK_COND(adapter, locking) do { \ + if ((locking) != 0) \ + EM_RX_UNLOCK(adapter); \ +} while (0) #define EM_TX_LOCK_COND(adapter, locking) do { \ if ((locking) != 0) \ EM_TX_LOCK(adapter); \ @@ -218,7 +226,8 @@ static void lem_txeof(struct adapter *); static void lem_tx_purge(struct adapter *); static int lem_allocate_receive_structures(struct adapter *); static int lem_allocate_transmit_structures(struct adapter *); -static bool lem_rxeof(struct adapter *, int, int *); +static bool _lem_rxeof_generic(struct adapter *, int, int *, int); +#define lem_rxeof(a, c, d) _lem_rxeof_generic(a, c, d, 1) #ifndef __NO_STRICT_ALIGNMENT static int lem_fixup_rx(struct adapter *); #endif @@ -1296,7 +1305,7 @@ _lem_poll_generic(struct ifnet *ifp, enu } EM_CORE_UNLOCK_COND(adapter, locking); - lem_rxeof(adapter, count, &rx_done); + _lem_rxeof_generic(adapter, count, &rx_done, locking); EM_TX_LOCK_COND(adapter, locking); lem_txeof(adapter); @@ -3475,7 +3484,7 @@ lem_free_receive_structures(struct adapt * For polling we also now return the number of cleaned packets *********************************************************************/ static bool -lem_rxeof(struct adapter *adapter, int count, int *done) +_lem_rxeof_generic(struct adapter *adapter, int count, int *done, int locking) { struct ifnet *ifp = adapter->ifp;; struct mbuf *mp; @@ -3484,7 +3493,7 @@ lem_rxeof(struct adapter *adapter, int c int i, rx_sent = 0; struct e1000_rx_desc *current_desc; - EM_RX_LOCK(adapter); + EM_RX_LOCK_COND(adapter, locking); i = adapter->next_rx_desc_to_check; current_desc = &adapter->rx_desc_base[i]; bus_dmamap_sync(adapter->rxdma.dma_tag, adapter->rxdma.dma_map, @@ -3493,7 +3502,7 @@ lem_rxeof(struct adapter *adapter, int c if (!((current_desc->status) & E1000_RXD_STAT_DD)) { if (done != NULL) *done = rx_sent; - EM_RX_UNLOCK(adapter); + EM_RX_UNLOCK_COND(adapter, locking); return (FALSE); } @@ -3634,9 +3643,9 @@ discard: /* Call into the stack */ if (m != NULL) { adapter->next_rx_desc_to_check = i; - EM_RX_UNLOCK(adapter); + EM_RX_UNLOCK_COND(adapter, locking); (*ifp->if_input)(ifp, m); - EM_RX_LOCK(adapter); + EM_RX_LOCK_COND(adapter, locking); rx_sent++; i = adapter->next_rx_desc_to_check; } @@ -3650,7 +3659,7 @@ discard: E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), i); if (done != NULL) *done = rx_sent; - EM_RX_UNLOCK(adapter); + EM_RX_UNLOCK_COND(adapter, locking); return ((status & E1000_RXD_STAT_DD) ? TRUE : FALSE); }