svn commit: r318309 - stable/9/sys/dev/qlxgbe
David C Somayajulu
davidcs at FreeBSD.org
Mon May 15 18:24:16 UTC 2017
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) {
More information about the svn-src-stable-9
mailing list