Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 30 May 2012 07:16:50 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r236298 - projects/pf/head/sys/contrib/altq/altq
Message-ID:  <201205300716.q4U7GoVu033259@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Wed May 30 07:16:49 2012
New Revision: 236298
URL: http://svn.freebsd.org/changeset/base/236298

Log:
  Use M_NOWAIT in altq_add() and tbr_set(). Currently altq(4) in
  FreeBSD is configured via pf(4) ioctls, which can't configure
  altq(4) w/o holding locks. A large redesign needed to achieve
  M_WAITOK usage here. Or an alternative (not pf(4)) configuration
  interface should be implemented.

Modified:
  projects/pf/head/sys/contrib/altq/altq/altq_cbq.c
  projects/pf/head/sys/contrib/altq/altq/altq_hfsc.c
  projects/pf/head/sys/contrib/altq/altq/altq_priq.c
  projects/pf/head/sys/contrib/altq/altq/altq_subr.c

Modified: projects/pf/head/sys/contrib/altq/altq/altq_cbq.c
==============================================================================
--- projects/pf/head/sys/contrib/altq/altq/altq_cbq.c	Wed May 30 07:11:27 2012	(r236297)
+++ projects/pf/head/sys/contrib/altq/altq/altq_cbq.c	Wed May 30 07:16:49 2012	(r236298)
@@ -271,10 +271,9 @@ cbq_add_altq(struct pf_altq *a)
 		return (ENODEV);
 
 	/* allocate and initialize cbq_state_t */
-	cbqp = malloc(sizeof(cbq_state_t), M_DEVBUF, M_WAITOK);
+	cbqp = malloc(sizeof(cbq_state_t), M_DEVBUF, M_NOWAIT | M_ZERO);
 	if (cbqp == NULL)
 		return (ENOMEM);
-	bzero(cbqp, sizeof(cbq_state_t));
 	CALLOUT_INIT(&cbqp->cbq_callout);
 	cbqp->cbq_qlen = 0;
 	cbqp->ifnp.ifq_ = &ifp->if_snd;	    /* keep the ifq */

Modified: projects/pf/head/sys/contrib/altq/altq/altq_hfsc.c
==============================================================================
--- projects/pf/head/sys/contrib/altq/altq/altq_hfsc.c	Wed May 30 07:11:27 2012	(r236297)
+++ projects/pf/head/sys/contrib/altq/altq/altq_hfsc.c	Wed May 30 07:16:49 2012	(r236298)
@@ -200,10 +200,9 @@ hfsc_add_altq(struct pf_altq *a)
 	if (!ALTQ_IS_READY(&ifp->if_snd))
 		return (ENODEV);
 
-	hif = malloc(sizeof(struct hfsc_if), M_DEVBUF, M_WAITOK);
+	hif = malloc(sizeof(struct hfsc_if), M_DEVBUF, M_NOWAIT | M_ZERO);
 	if (hif == NULL)
 		return (ENOMEM);
-	bzero(hif, sizeof(struct hfsc_if));
 
 	hif->hif_eligible = ellist_alloc();
 	if (hif->hif_eligible == NULL) {

Modified: projects/pf/head/sys/contrib/altq/altq/altq_priq.c
==============================================================================
--- projects/pf/head/sys/contrib/altq/altq/altq_priq.c	Wed May 30 07:11:27 2012	(r236297)
+++ projects/pf/head/sys/contrib/altq/altq/altq_priq.c	Wed May 30 07:16:49 2012	(r236298)
@@ -132,11 +132,9 @@ priq_add_altq(struct pf_altq *a)
 	if (!ALTQ_IS_READY(&ifp->if_snd))
 		return (ENODEV);
 
-	pif = malloc(sizeof(struct priq_if),
-	    M_DEVBUF, M_WAITOK);
+	pif = malloc(sizeof(struct priq_if), M_DEVBUF, M_NOWAIT | M_ZERO);
 	if (pif == NULL)
 		return (ENOMEM);
-	bzero(pif, sizeof(struct priq_if));
 	pif->pif_bandwidth = a->ifbandwidth;
 	pif->pif_maxpri = -1;
 	pif->pif_ifq = &ifp->if_snd;

Modified: projects/pf/head/sys/contrib/altq/altq/altq_subr.c
==============================================================================
--- projects/pf/head/sys/contrib/altq/altq/altq_subr.c	Wed May 30 07:11:27 2012	(r236297)
+++ projects/pf/head/sys/contrib/altq/altq/altq_subr.c	Wed May 30 07:16:49 2012	(r236298)
@@ -401,14 +401,11 @@ tbr_set(ifq, profile)
 		return (0);
 	}
 
-	IFQ_UNLOCK(ifq);
-	tbr = malloc(sizeof(struct tb_regulator),
-	       M_DEVBUF, M_WAITOK);
-	if (tbr == NULL) {		/* can not happen */
+	tbr = malloc(sizeof(struct tb_regulator), M_DEVBUF, M_NOWAIT | M_ZERO);
+	if (tbr == NULL) {
 		IFQ_UNLOCK(ifq);
 		return (ENOMEM);
 	}
-	bzero(tbr, sizeof(struct tb_regulator));
 
 	tbr->tbr_rate = TBR_SCALE(profile->rate / 8) / machclk_freq;
 	tbr->tbr_depth = TBR_SCALE(profile->depth);
@@ -420,7 +417,6 @@ tbr_set(ifq, profile)
 	tbr->tbr_last = read_machclk();
 	tbr->tbr_lastop = ALTDQ_REMOVE;
 
-	IFQ_LOCK(ifq);
 	otbr = ifq->altq_tbr;
 	ifq->altq_tbr = tbr;	/* set the new tbr */
 



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