> Date: Mon, 26 Dec 2016 09:13:50 +0100
> From: Stefan Sperling <[email protected]>
>
> I do not see a good reason for using multiple custom task queues
> in this driver, and at the same time it is using systq for tasks.
>
> This moves all tasks to one custom queue to make things consistent.
> Except I'm leaving the init_task on systq because this task is kind
> of special (e.g. it might be added during resume and I'm not sure
> if that requires IPL_HIGH).
> Perhaps the custom queue would be fine for init_task, too? Not sure.
Are you certain you don't need work times to be processed while
processing other work items. For example, to process state
transitions while scanning? Using a single taskq could lead to a
deadlock in that case...
> Index: if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.155
> diff -u -p -r1.155 if_iwm.c
> --- if_iwm.c 18 Dec 2016 10:37:42 -0000 1.155
> +++ if_iwm.c 26 Dec 2016 07:56:41 -0000
> @@ -2480,7 +2480,7 @@ iwm_update_htprot(struct ieee80211com *i
> struct iwm_softc *sc = ic->ic_softc;
>
> /* assumes that ni == ic->ic_bss */
> - task_add(systq, &sc->htprot_task);
> + task_add(sc->taskq, &sc->htprot_task);
> }
>
> void
> @@ -2513,7 +2513,7 @@ iwm_ampdu_rx_start(struct ieee80211com *
> sc->ba_start = 1;
> sc->ba_tid = tid;
> sc->ba_ssn = htole16(ba->ba_winstart);
> - task_add(systq, &sc->ba_task);
> + task_add(sc->taskq, &sc->ba_task);
>
> return EBUSY;
> }
> @@ -2530,7 +2530,7 @@ iwm_ampdu_rx_stop(struct ieee80211com *i
>
> sc->ba_start = 0;
> sc->ba_tid = tid;
> - task_add(systq, &sc->ba_task);
> + task_add(sc->taskq, &sc->ba_task);
> }
>
> void
> @@ -3432,7 +3432,7 @@ iwm_rx_tx_cmd_single(struct iwm_softc *s
> * the firwmare's LQ rate table from process context.
> */
> if (omcs != ni->ni_txmcs)
> - task_add(systq, &sc->setrates_task);
> + task_add(sc->taskq, &sc->setrates_task);
> }
>
> if (txfail)
> @@ -5323,7 +5323,7 @@ iwm_calib_timeout(void *arg)
> * the firwmare's LQ rate table from process context.
> */
> if (otxrate != ni->ni_txrate)
> - task_add(systq, &sc->setrates_task);
> + task_add(sc->taskq, &sc->setrates_task);
> }
> splx(s);
>
> @@ -5638,7 +5638,7 @@ iwm_newstate(struct ieee80211com *ic, en
> sc->ns_nstate = nstate;
> sc->ns_arg = arg;
>
> - task_add(sc->sc_nswq, &sc->newstate_task);
> + task_add(sc->taskq, &sc->newstate_task);
>
> return 0;
> }
> @@ -6118,11 +6118,11 @@ iwm_stop(struct ifnet *ifp, int disable)
> in->in_phyctxt = NULL;
>
> task_del(systq, &sc->init_task);
> - task_del(sc->sc_nswq, &sc->newstate_task);
> - task_del(sc->sc_eswq, &sc->sc_eswk);
> - task_del(systq, &sc->setrates_task);
> - task_del(systq, &sc->ba_task);
> - task_del(systq, &sc->htprot_task);
> + task_del(sc->taskq, &sc->newstate_task);
> + task_del(sc->taskq, &sc->endscan_task);
> + task_del(sc->taskq, &sc->setrates_task);
> + task_del(sc->taskq, &sc->ba_task);
> + task_del(sc->taskq, &sc->htprot_task);
>
> sc->sc_newstate(ic, IEEE80211_S_INIT, -1);
>
> @@ -6672,14 +6672,14 @@ iwm_notif_intr(struct iwm_softc *sc)
> case IWM_SCAN_ITERATION_COMPLETE: {
> struct iwm_lmac_scan_complete_notif *notif;
> SYNC_RESP_STRUCT(notif, pkt);
> - task_add(sc->sc_eswq, &sc->sc_eswk);
> + task_add(sc->taskq, &sc->endscan_task);
> break;
> }
>
> case IWM_SCAN_COMPLETE_UMAC: {
> struct iwm_umac_scan_complete *notif;
> SYNC_RESP_STRUCT(notif, pkt);
> - task_add(sc->sc_eswq, &sc->sc_eswk);
> + task_add(sc->taskq, &sc->endscan_task);
> break;
> }
>
> @@ -6687,7 +6687,7 @@ iwm_notif_intr(struct iwm_softc *sc)
> struct iwm_umac_scan_iter_complete_notif *notif;
> SYNC_RESP_STRUCT(notif, pkt);
>
> - task_add(sc->sc_eswq, &sc->sc_eswk);
> + task_add(sc->taskq, &sc->endscan_task);
> break;
> }
>
> @@ -6995,7 +6995,7 @@ iwm_attach(struct device *parent, struct
> sc->sc_pcitag = pa->pa_tag;
> sc->sc_dmat = pa->pa_dmat;
>
> - task_set(&sc->sc_eswk, iwm_endscan_cb, sc);
> + task_set(&sc->endscan_task, iwm_endscan_cb, sc);
> rw_init(&sc->ioctl_rwl, "iwmioctl");
>
> err = pci_get_capability(sc->sc_pct, sc->sc_pcitag,
> @@ -7192,11 +7192,8 @@ iwm_attach(struct device *parent, struct
> goto fail4;
> }
>
> - sc->sc_eswq = taskq_create("iwmes", 1, IPL_NET, 0);
> - if (sc->sc_eswq == NULL)
> - goto fail4;
> - sc->sc_nswq = taskq_create("iwmns", 1, IPL_NET, 0);
> - if (sc->sc_nswq == NULL)
> + sc->taskq = taskq_create("iwm", 1, IPL_NET, 0);
> + if (sc->taskq == NULL)
> goto fail4;
>
> /* Clear pending interrupts. */
> Index: if_iwmvar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwmvar.h,v
> retrieving revision 1.25
> diff -u -p -r1.25 if_iwmvar.h
> --- if_iwmvar.h 30 Nov 2016 14:31:51 -0000 1.25
> +++ if_iwmvar.h 26 Dec 2016 07:52:22 -0000
> @@ -358,6 +358,7 @@ struct iwm_softc {
> struct task init_task;
> struct task newstate_task;
> struct task setrates_task;
> + struct task endscan_task;
> enum ieee80211_state ns_nstate;
> int ns_arg;
>
> @@ -462,8 +463,7 @@ struct iwm_softc {
> uint8_t sc_cmd_resp[IWM_CMD_RESP_MAX];
> int sc_wantresp;
>
> - struct taskq *sc_nswq, *sc_eswq;
> - struct task sc_eswk;
> + struct taskq *taskq;
>
> struct iwm_rx_phy_info sc_last_phy_info;
> int sc_ampdu_ref;
>
>