From 9275f515abe8cae6b7a06bc94290bc587dd0e912 Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Fri, 28 Dec 2012 11:08:35 +0800 Subject: [PATCH] ifq: Add ifq_purge_all(); currently it's same as ifq_purge() This paves the way for the multiple transmission queues support. ifq_purge_all() is used when ALTQ packet scheduler is changed, interface routing is changed and pseudo devices are closed. --- sys/net/altq/altq_cbq.c | 2 +- sys/net/altq/altq_fairq.c | 2 +- sys/net/altq/altq_hfsc.c | 2 +- sys/net/altq/altq_priq.c | 2 +- sys/net/altq/altq_subr.c | 4 ++-- sys/net/if.c | 4 ++-- sys/net/ifq_var.h | 18 ++++++++++++++++++ sys/net/sppp/if_spppsubr.c | 2 +- sys/net/tap/if_tap.c | 2 +- sys/net/tun/if_tun.c | 2 +- 10 files changed, 29 insertions(+), 11 deletions(-) diff --git a/sys/net/altq/altq_cbq.c b/sys/net/altq/altq_cbq.c index 41c958eb4b..f6c23e07bc 100644 --- a/sys/net/altq/altq_cbq.c +++ b/sys/net/altq/altq_cbq.c @@ -223,7 +223,7 @@ cbq_add_altq(struct pf_altq *a) callout_init(&cbqp->cbq_callout); cbqp->cbq_qlen = 0; cbqp->ifnp.ifq_ = &ifp->if_snd; /* keep the ifq */ - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); /* keep the state in pf_altq */ a->altq_disc = cbqp; diff --git a/sys/net/altq/altq_fairq.c b/sys/net/altq/altq_fairq.c index bd197d52e7..71ac80b6e5 100644 --- a/sys/net/altq/altq_fairq.c +++ b/sys/net/altq/altq_fairq.c @@ -162,7 +162,7 @@ fairq_add_altq(struct pf_altq *a) pif->pif_bandwidth = a->ifbandwidth; pif->pif_maxpri = -1; pif->pif_ifq = &ifp->if_snd; - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); /* keep the state in pf_altq */ a->altq_disc = pif; diff --git a/sys/net/altq/altq_hfsc.c b/sys/net/altq/altq_hfsc.c index 2c3d69a643..b0f32d550d 100644 --- a/sys/net/altq/altq_hfsc.c +++ b/sys/net/altq/altq_hfsc.c @@ -159,7 +159,7 @@ hfsc_add_altq(struct pf_altq *a) hif->hif_eligible = ellist_alloc(); hif->hif_ifq = &ifp->if_snd; - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); /* keep the state in pf_altq */ a->altq_disc = hif; diff --git a/sys/net/altq/altq_priq.c b/sys/net/altq/altq_priq.c index 84eae1bb73..fd6d29a4d3 100644 --- a/sys/net/altq/altq_priq.c +++ b/sys/net/altq/altq_priq.c @@ -99,7 +99,7 @@ priq_add_altq(struct pf_altq *a) pif->pif_bandwidth = a->ifbandwidth; pif->pif_maxpri = -1; pif->pif_ifq = &ifp->if_snd; - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); /* keep the state in pf_altq */ a->altq_disc = pif; diff --git a/sys/net/altq/altq_subr.c b/sys/net/altq/altq_subr.c index dab44930c3..b6f36fb516 100644 --- a/sys/net/altq/altq_subr.c +++ b/sys/net/altq/altq_subr.c @@ -164,7 +164,7 @@ altq_enable_locked(struct ifaltq *ifq) if (ifq_is_enabled(ifq)) return 0; - ifq_purge_locked(ifq); + ifq_purge_all_locked(ifq); KKASSERT(ifq->ifq_len == 0); ifq->altq_flags |= ALTQF_ENABLED; @@ -190,7 +190,7 @@ altq_disable_locked(struct ifaltq *ifq) if (!ifq_is_enabled(ifq)) return 0; - ifq_purge_locked(ifq); + ifq_purge_all_locked(ifq); KKASSERT(ifq->ifq_len == 0); ifq->altq_flags &= ~(ALTQF_ENABLED|ALTQF_CLASSIFY); return 0; diff --git a/sys/net/if.c b/sys/net/if.c index 0e57a88050..12163f32b6 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1315,7 +1315,7 @@ if_unroute(struct ifnet *ifp, int flag, int fam) if (fam == PF_UNSPEC || (fam == ifa->ifa_addr->sa_family)) kpfctlinput(PRC_IFDOWN, ifa->ifa_addr); } - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); rt_ifmsg(ifp); } @@ -1329,7 +1329,7 @@ if_route(struct ifnet *ifp, int flag, int fam) { struct ifaddr_container *ifac; - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); ifp->if_flags |= flag; getmicrotime(&ifp->if_lastchange); TAILQ_FOREACH(ifac, &ifp->if_addrheads[mycpuid], ifa_link) { diff --git a/sys/net/ifq_var.h b/sys/net/ifq_var.h index 4b931c8b72..38a9b77c6a 100644 --- a/sys/net/ifq_var.h +++ b/sys/net/ifq_var.h @@ -238,6 +238,24 @@ ifq_purge(struct ifaltq *_ifq) ALTQ_UNLOCK(_ifq); } +/* + * WARNING: Should only be called in an MPSAFE manner. + */ +static __inline void +ifq_purge_all_locked(struct ifaltq *_ifq) +{ + /* XXX temporary */ + ifq_purge_locked(_ifq); +} + +static __inline void +ifq_purge_all(struct ifaltq *_ifq) +{ + ALTQ_LOCK(_ifq); + ifq_purge_all_locked(_ifq); + ALTQ_UNLOCK(_ifq); +} + /* * WARNING: Should only be called in an MPSAFE manner. */ diff --git a/sys/net/sppp/if_spppsubr.c b/sys/net/sppp/if_spppsubr.c index d8d847b1a7..c599162ebd 100644 --- a/sys/net/sppp/if_spppsubr.c +++ b/sys/net/sppp/if_spppsubr.c @@ -1063,7 +1063,7 @@ sppp_flush(struct ifnet *ifp) { struct sppp *sp = (struct sppp*) ifp; - ifq_purge(&sp->pp_if.if_snd); + ifq_purge_all(&sp->pp_if.if_snd); IF_DRAIN(&sp->pp_fastq); IF_DRAIN(&sp->pp_cpq); } diff --git a/sys/net/tap/if_tap.c b/sys/net/tap/if_tap.c index a7cb035821..14ad923a6c 100644 --- a/sys/net/tap/if_tap.c +++ b/sys/net/tap/if_tap.c @@ -400,7 +400,7 @@ tapclose(struct dev_close_args *ap) get_mplock(); /* Junk all pending output */ - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); /* * Do not bring the interface down, and do not anything with diff --git a/sys/net/tun/if_tun.c b/sys/net/tun/if_tun.c index 3387a888e5..1819ed2804 100644 --- a/sys/net/tun/if_tun.c +++ b/sys/net/tun/if_tun.c @@ -208,7 +208,7 @@ tunclose(struct dev_close_args *ap) tp->tun_pid = 0; /* Junk all pending output. */ - ifq_purge(&ifp->if_snd); + ifq_purge_all(&ifp->if_snd); if (ifp->if_flags & IFF_UP) if_down(ifp); -- 2.41.0