Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Mar 2015 13:47:49 +0000 (UTC)
From:      Andrew Rybchenko <arybchik@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r280604 - stable/10/sys/dev/sfxge
Message-ID:  <201503251347.t2PDlnDs086046@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: arybchik
Date: Wed Mar 25 13:47:48 2015
New Revision: 280604
URL: https://svnweb.freebsd.org/changeset/base/280604

Log:
  MFC: 280374
  
  sfxge: assert either kernel or internal copy of interface flags
  
  ioctl to put interface down sets ifp->if_flags which holds the intended
  administratively defined state and calls driver callback to apply it.
  When everything is done, driver updates internal copy of
  interface flags sc->if_flags which holds the operational state.
  So, transmit from Rx path is possible when interface is intended to be
  administratively down in accordance with ifp->if_flags, but not applied
  yet and the operational state is up in accordance with sc->if_flags.
  
  Sponsored by:   Solarflare Communications, Inc.
  Original Differential Revision: https://reviews.freebsd.org/D2075

Modified:
  stable/10/sys/dev/sfxge/sfxge_tx.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/sfxge/sfxge_tx.c
==============================================================================
--- stable/10/sys/dev/sfxge/sfxge_tx.c	Wed Mar 25 13:46:30 2015	(r280603)
+++ stable/10/sys/dev/sfxge/sfxge_tx.c	Wed Mar 25 13:47:48 2015	(r280604)
@@ -676,7 +676,16 @@ sfxge_if_transmit(struct ifnet *ifp, str
 
 	sc = (struct sfxge_softc *)ifp->if_softc;
 
-	KASSERT(ifp->if_flags & IFF_UP, ("interface not up"));
+	/*
+	 * Transmit may be called when interface is up from the kernel
+	 * point of view, but not yet up (in progress) from the driver
+	 * point of view. I.e. link aggregation bring up.
+	 * Transmit may be called when interface is up from the driver
+	 * point of view, but already down from the kernel point of
+	 * view. I.e. Rx when interface shutdown is in progress.
+	 */
+	KASSERT((ifp->if_flags & IFF_UP) || (sc->if_flags & IFF_UP),
+		("interface not up"));
 
 	/* Pick the desired transmit queue. */
 	if (m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA | CSUM_TSO)) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201503251347.t2PDlnDs086046>