Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a48b5a61 authored by Patrick McHardy's avatar Patrick McHardy Committed by David S. Miller
Browse files

[NET_SCHED]: Unline tcf_destroy



Uninline tcf_destroy and add a helper function to destroy an entire filter
chain.

Signed-off-by: default avatarPatrick McHardy <kaber@trash.net>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 3bebcda2
Loading
Loading
Loading
Loading
+2 −8
Original line number Diff line number Diff line
@@ -177,14 +177,8 @@ extern void qdisc_tree_decrease_qlen(struct Qdisc *qdisc, unsigned int n);
extern struct Qdisc *qdisc_alloc(struct net_device *dev, struct Qdisc_ops *ops);
extern struct Qdisc *qdisc_create_dflt(struct net_device *dev,
				       struct Qdisc_ops *ops, u32 parentid);

static inline void
tcf_destroy(struct tcf_proto *tp)
{
	tp->ops->destroy(tp);
	module_put(tp->ops->owner);
	kfree(tp);
}
extern void tcf_destroy(struct tcf_proto *tp);
extern void tcf_destroy_chain(struct tcf_proto *fl);

static inline int __qdisc_enqueue_tail(struct sk_buff *skb, struct Qdisc *sch,
				       struct sk_buff_head *list)
+18 −0
Original line number Diff line number Diff line
@@ -1220,6 +1220,24 @@ int tc_classify(struct sk_buff *skb, struct tcf_proto *tp,
	return -1;
}

void tcf_destroy(struct tcf_proto *tp)
{
	tp->ops->destroy(tp);
	module_put(tp->ops->owner);
	kfree(tp);
}

void tcf_destroy_chain(struct tcf_proto *fl)
{
	struct tcf_proto *tp;

	while ((tp = fl) != NULL) {
		fl = tp->next;
		tcf_destroy(tp);
	}
}
EXPORT_SYMBOL(tcf_destroy_chain);

#ifdef CONFIG_PROC_FS
static int psched_show(struct seq_file *seq, void *v)
{
+2 −15
Original line number Diff line number Diff line
@@ -158,19 +158,6 @@ static unsigned long atm_tc_bind_filter(struct Qdisc *sch,
	return atm_tc_get(sch,classid);
}


static void destroy_filters(struct atm_flow_data *flow)
{
	struct tcf_proto *filter;

	while ((filter = flow->filter_list)) {
		DPRINTK("destroy_filters: destroying filter %p\n",filter);
		flow->filter_list = filter->next;
		tcf_destroy(filter);
	}
}


/*
 * atm_tc_put handles all destructions, including the ones that are explicitly
 * requested (atm_tc_destroy, etc.). The assumption here is that we never drop
@@ -195,7 +182,7 @@ static void atm_tc_put(struct Qdisc *sch, unsigned long cl)
	*prev = flow->next;
	DPRINTK("atm_tc_put: qdisc %p\n",flow->q);
	qdisc_destroy(flow->q);
	destroy_filters(flow);
	tcf_destroy_chain(flow->filter_list);
	if (flow->sock) {
		DPRINTK("atm_tc_put: f_count %d\n",
		    file_count(flow->sock->file));
@@ -611,7 +598,7 @@ static void atm_tc_destroy(struct Qdisc *sch)
	DPRINTK("atm_tc_destroy(sch %p,[qdisc %p])\n",sch,p);
	/* races ? */
	while ((flow = p->flows)) {
		destroy_filters(flow);
		tcf_destroy_chain(flow->filter_list);
		if (flow->ref > 1)
			printk(KERN_ERR "atm_destroy: %p->ref = %d\n",flow,
			    flow->ref);
+2 −12
Original line number Diff line number Diff line
@@ -1717,23 +1717,13 @@ static unsigned long cbq_get(struct Qdisc *sch, u32 classid)
	return 0;
}

static void cbq_destroy_filters(struct cbq_class *cl)
{
	struct tcf_proto *tp;

	while ((tp = cl->filter_list) != NULL) {
		cl->filter_list = tp->next;
		tcf_destroy(tp);
	}
}

static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
{
	struct cbq_sched_data *q = qdisc_priv(sch);

	BUG_TRAP(!cl->filters);

	cbq_destroy_filters(cl);
	tcf_destroy_chain(cl->filter_list);
	qdisc_destroy(cl->q);
	qdisc_put_rtab(cl->R_tab);
#ifdef CONFIG_NET_ESTIMATOR
@@ -1760,7 +1750,7 @@ cbq_destroy(struct Qdisc* sch)
	 */
	for (h = 0; h < 16; h++)
		for (cl = q->classes[h]; cl; cl = cl->next)
			cbq_destroy_filters(cl);
			tcf_destroy_chain(cl->filter_list);

	for (h = 0; h < 16; h++) {
		struct cbq_class *next;
+1 −7
Original line number Diff line number Diff line
@@ -412,16 +412,10 @@ static void dsmark_reset(struct Qdisc *sch)
static void dsmark_destroy(struct Qdisc *sch)
{
	struct dsmark_qdisc_data *p = PRIV(sch);
	struct tcf_proto *tp;

	DPRINTK("dsmark_destroy(sch %p,[qdisc %p])\n", sch, p);

	while (p->filter_list) {
		tp = p->filter_list;
		p->filter_list = tp->next;
		tcf_destroy(tp);
	}

	tcf_destroy_chain(p->filter_list);
	qdisc_destroy(p->q);
	kfree(p->mask);
}
Loading