Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 May 2017 18:24:14 +0000 (UTC)
From:      David C Somayajulu <davidcs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r318309 - stable/9/sys/dev/qlxgbe
Message-ID:  <201705151824.v4FIOEWi059614@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidcs
Date: Mon May 15 18:24:14 2017
New Revision: 318309
URL: https://svnweb.freebsd.org/changeset/base/318309

Log:
  MFC r317996
  Fix bug where MTX_DEF lock was held while taskqueue_drain() was invoked.
  Check IFF_DRV_RUNNING flag is set prior to calling ql_hw_set_multi()

Modified:
  stable/9/sys/dev/qlxgbe/ql_isr.c
  stable/9/sys/dev/qlxgbe/ql_os.c
Directory Properties:
  stable/9/   (props changed)
  stable/9/sys/   (props changed)

Modified: stable/9/sys/dev/qlxgbe/ql_isr.c
==============================================================================
--- stable/9/sys/dev/qlxgbe/ql_isr.c	Mon May 15 18:21:36 2017	(r318308)
+++ stable/9/sys/dev/qlxgbe/ql_isr.c	Mon May 15 18:24:14 2017	(r318309)
@@ -983,7 +983,8 @@ ql_isr(void *arg)
 
 	fp = &ha->tx_fp[idx];
 
-	if (fp->fp_taskqueue != NULL)
+	if ((fp->fp_taskqueue != NULL) &&
+		(ifp->if_drv_flags & IFF_DRV_RUNNING))
 		taskqueue_enqueue(fp->fp_taskqueue, &fp->fp_task);
 
 	return;

Modified: stable/9/sys/dev/qlxgbe/ql_os.c
==============================================================================
--- stable/9/sys/dev/qlxgbe/ql_os.c	Mon May 15 18:21:36 2017	(r318308)
+++ stable/9/sys/dev/qlxgbe/ql_os.c	Mon May 15 18:24:14 2017	(r318309)
@@ -930,7 +930,9 @@ qla_set_multi(qla_host_t *ha, uint32_t a
 	if_maddr_runlock(ifp);
 
 	QLA_LOCK(ha);
-	ret = ql_hw_set_multi(ha, mta, mcnt, add_multi);
+	if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+		ret = ql_hw_set_multi(ha, mta, mcnt, add_multi);
+	}
 	QLA_UNLOCK(ha);
 
 	return (ret);
@@ -1036,20 +1038,16 @@ qla_ioctl(struct ifnet *ifp, u_long cmd,
 		QL_DPRINT4(ha, (ha->pci_dev,
 			"%s: %s (0x%lx)\n", __func__, "SIOCADDMULTI", cmd));
 
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-			if (qla_set_multi(ha, 1))
-				ret = EINVAL;
-		}
+		if (qla_set_multi(ha, 1))
+			ret = EINVAL;
 		break;
 
 	case SIOCDELMULTI:
 		QL_DPRINT4(ha, (ha->pci_dev,
 			"%s: %s (0x%lx)\n", __func__, "SIOCDELMULTI", cmd));
 
-		if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-			if (qla_set_multi(ha, 0))
-				ret = EINVAL;
-		}
+		if (qla_set_multi(ha, 0))
+			ret = EINVAL;
 		break;
 
 	case SIOCSIFMEDIA:
@@ -1550,9 +1548,9 @@ qla_stop(qla_host_t *ha)
 
 	ha->flags.qla_interface_up = 0;
 
+	QLA_UNLOCK(ha);
 	qla_drain_fp_taskqueues(ha);
-
-	ql_hw_stop_rcv(ha);
+	QLA_LOCK(ha);
 
 	ql_del_hw_if(ha);
 
@@ -1943,8 +1941,6 @@ qla_error_recovery(void *context, int pe
 		ha->hw.imd_compl = 1;
 		qla_mdelay(__func__, 300);
 
-		ql_hw_stop_rcv(ha);
-
 	        ifp->if_drv_flags &= ~(IFF_DRV_OACTIVE | IFF_DRV_RUNNING);
 
 		for (i = 0; i < ha->hw.num_sds_rings; i++) {
@@ -1964,6 +1960,8 @@ qla_error_recovery(void *context, int pe
 
         QLA_UNLOCK(ha);
 
+	qla_drain_fp_taskqueues(ha);
+
 	if ((ha->pci_func & 0x1) == 0) {
 
 		if (!ha->msg_from_peer) {



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