public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Kronos <kronos@kronoz.cjb.net>
To: Rusty Russell <rusty@rustcorp.com.au>
Cc: linux-kernel@vger.kernel.org,
	"Alexey N. Kuznetsov" <kuznet@ms2.inr.ac.ru>
Subject: Re: [RFC] Migrating net/sched to new module interface
Date: Sat, 4 Jan 2003 17:21:53 +0100	[thread overview]
Message-ID: <20030104162153.GA501@dreamland.darkstar.lan> (raw)
In-Reply-To: <20030104062027.90D922C37B@lists.samba.org>

Il Sat, Jan 04, 2003 at 05:09:41PM +1100, Rusty Russell ha scritto: 
> Then the patch to mark the "owner" should be straightforward.

Yes, it seems so :)

This is the patch:

diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_api.c linux-2.5/net/sched/cls_api.c
--- linux-2.5.orig/net/sched/cls_api.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_api.c	Fri Jan  3 17:19:07 2003
@@ -216,6 +216,13 @@
 			kfree(tp);
 			goto errout;
 		}
+
+		if (try_module_get(tp_ops->owner) == 0) {
+			err = -ENOSYS;
+			kfree(tp);
+			goto errout;
+		}
+		
 		memset(tp, 0, sizeof(*tp));
 		tp->ops = tp_ops;
 		tp->protocol = protocol;
@@ -225,6 +232,7 @@
 		tp->classid = parent;
 		err = tp_ops->init(tp);
 		if (err) {
+			module_put(tp_ops->owner);
 			kfree(tp);
 			goto errout;
 		}
@@ -248,6 +256,7 @@
 			write_unlock(&qdisc_tree_lock);
 
 			tp->ops->destroy(tp);
+			module_put(tp->ops->owner);
 			kfree(tp);
 			err = 0;
 			goto errout;
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_fw.c linux-2.5/net/sched/cls_fw.c
--- linux-2.5.orig/net/sched/cls_fw.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_fw.c	Sat Jan  4 16:49:11 2003
@@ -117,7 +117,6 @@
 
 static int fw_init(struct tcf_proto *tp)
 {
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -128,7 +127,6 @@
 	int h;
 
 	if (head == NULL) {
-		MOD_DEC_USE_COUNT;
 		return;
 	}
 
@@ -146,7 +144,6 @@
 		}
 	}
 	kfree(head);
-	MOD_DEC_USE_COUNT;
 }
 
 static int fw_delete(struct tcf_proto *tp, unsigned long arg)
@@ -351,18 +348,21 @@
 }
 
 struct tcf_proto_ops cls_fw_ops = {
-	NULL,
-	"fw",
-	fw_classify,
-	fw_init,
-	fw_destroy,
-
-	fw_get,
-	fw_put,
-	fw_change,
-	fw_delete,
-	fw_walk,
-	fw_dump
+	.next		= NULL,
+	.kind		= "fw",
+	.classify	= fw_classify,
+	.init		= fw_init,
+	.destroy	= fw_destroy,
+
+	.get		= fw_get,
+	.put		= fw_put,
+	.change		= fw_change,
+	.delete		= fw_delete,
+	.walk		= fw_walk,
+
+	.dump 		= fw_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_route.c linux-2.5/net/sched/cls_route.c
--- linux-2.5.orig/net/sched/cls_route.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_route.c	Sat Jan  4 16:47:29 2003
@@ -272,7 +272,6 @@
 
 static int route4_init(struct tcf_proto *tp)
 {
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -282,7 +281,6 @@
 	int h1, h2;
 
 	if (head == NULL) {
-		MOD_DEC_USE_COUNT;
 		return;
 	}
 
@@ -309,7 +307,6 @@
 		}
 	}
 	kfree(head);
-	MOD_DEC_USE_COUNT;
 }
 
 static int route4_delete(struct tcf_proto *tp, unsigned long arg)
@@ -607,18 +604,21 @@
 }
 
 struct tcf_proto_ops cls_route4_ops = {
-	NULL,
-	"route",
-	route4_classify,
-	route4_init,
-	route4_destroy,
-
-	route4_get,
-	route4_put,
-	route4_change,
-	route4_delete,
-	route4_walk,
-	route4_dump
+	.next		= NULL,
+	.kind		= "route",
+	.classify	= route4_classify,
+	.init		= route4_init,
+	.destroy	= route4_destroy,
+
+	.get		= route4_get,
+	.put		= route4_put,
+	.change		= route4_change,
+	.delete		= route4_delete,
+	.walk		= route4_walk,
+
+	.dump		= route4_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_rsvp.h linux-2.5/net/sched/cls_rsvp.h
--- linux-2.5.orig/net/sched/cls_rsvp.h	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_rsvp.h	Sat Jan  4 16:49:56 2003
@@ -247,14 +247,12 @@
 {
 	struct rsvp_head *data;
 
-	MOD_INC_USE_COUNT;
 	data = kmalloc(sizeof(struct rsvp_head), GFP_KERNEL);
 	if (data) {
 		memset(data, 0, sizeof(struct rsvp_head));
 		tp->root = data;
 		return 0;
 	}
-	MOD_DEC_USE_COUNT;
 	return -ENOBUFS;
 }
 
@@ -294,7 +292,6 @@
 		}
 	}
 	kfree(data);
-	MOD_DEC_USE_COUNT;
 }
 
 static int rsvp_delete(struct tcf_proto *tp, unsigned long arg)
@@ -673,18 +670,21 @@
 }
 
 struct tcf_proto_ops RSVP_OPS = {
-	NULL,
-	RSVP_ID,
-	rsvp_classify,
-	rsvp_init,
-	rsvp_destroy,
-
-	rsvp_get,
-	rsvp_put,
-	rsvp_change,
-	rsvp_delete,
-	rsvp_walk,
-	rsvp_dump
+	.next		= NULL,
+	.kind		= RSVP_ID,
+	.classify	= rsvp_classify,
+	.init		= rsvp_init,
+	.destroy	= rsvp_destroy,
+
+	.get		= rsvp_get,
+	.put		= rsvp_put,
+	.change		= rsvp_change,
+	.delete		= rsvp_delete,
+	.walk		= rsvp_walk,
+
+	.dump		= rsvp_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_tcindex.c linux-2.5/net/sched/cls_tcindex.c
--- linux-2.5.orig/net/sched/cls_tcindex.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_tcindex.c	Sat Jan  4 16:50:21 2003
@@ -144,10 +144,8 @@
 	struct tcindex_data *p;
 
 	DPRINTK("tcindex_init(tp %p)\n",tp);
-	MOD_INC_USE_COUNT;
 	p = kmalloc(sizeof(struct tcindex_data),GFP_KERNEL);
 	if (!p) {
-		MOD_DEC_USE_COUNT;
 		return -ENOMEM;
 	}
 	tp->root = p;
@@ -417,7 +415,6 @@
 		kfree(p->h);
 	kfree(p);
 	tp->root = NULL;
-	MOD_DEC_USE_COUNT;
 }
 
 
@@ -480,20 +477,22 @@
 }
 
 struct tcf_proto_ops cls_tcindex_ops = {
-	NULL,
-	"tcindex",
-	tcindex_classify,
-	tcindex_init,
-	tcindex_destroy,
-
-	tcindex_get,
-	tcindex_put,
-	tcindex_change,
-	tcindex_delete,
-	tcindex_walk,
-	tcindex_dump
-};
+	.next		= NULL,
+	.kind		= "tcindex",
+	.classify	= tcindex_classify,
+	.init		= tcindex_init,
+	.destroy	= tcindex_destroy,
+
+	.get		= tcindex_get,
+	.put		= tcindex_put,
+	.change		= tcindex_change,
+	.delete		= tcindex_delete,
+	.walk		= tcindex_walk,
+
+	.dump		= tcindex_dump,
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/cls_u32.c linux-2.5/net/sched/cls_u32.c
--- linux-2.5.orig/net/sched/cls_u32.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/cls_u32.c	Sat Jan  4 16:50:39 2003
@@ -262,15 +262,12 @@
 	struct tc_u_hnode *root_ht;
 	struct tc_u_common *tp_c;
 
-	MOD_INC_USE_COUNT;
-
 	for (tp_c = u32_list; tp_c; tp_c = tp_c->next)
 		if (tp_c->q == tp->q)
 			break;
 
 	root_ht = kmalloc(sizeof(*root_ht), GFP_KERNEL);
 	if (root_ht == NULL) {
-		MOD_DEC_USE_COUNT;
 		return -ENOBUFS;
 	}
 	memset(root_ht, 0, sizeof(*root_ht));
@@ -282,7 +279,6 @@
 		tp_c = kmalloc(sizeof(*tp_c), GFP_KERNEL);
 		if (tp_c == NULL) {
 			kfree(root_ht);
-			MOD_DEC_USE_COUNT;
 			return -ENOBUFS;
 		}
 		memset(tp_c, 0, sizeof(*tp_c));
@@ -407,7 +403,6 @@
 		kfree(tp_c);
 	}
 
-	MOD_DEC_USE_COUNT;
 	tp->data = NULL;
 }
 
@@ -695,18 +690,21 @@
 }
 
 struct tcf_proto_ops cls_u32_ops = {
-	NULL,
-	"u32",
-	u32_classify,
-	u32_init,
-	u32_destroy,
-
-	u32_get,
-	u32_put,
-	u32_change,
-	u32_delete,
-	u32_walk,
-	u32_dump
+	.next		= NULL,
+	.kind		= "u32",
+	.classify	= u32_classify,
+	.init		= u32_init,
+	.destroy 	= u32_destroy,
+
+	.get		= u32_get,
+	.put		= u32_put,
+	.change		= u32_change,
+	.delete		= u32_delete,
+	.walk		= u32_walk,
+
+	.dump		= u32_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_api.c linux-2.5/net/sched/sch_api.c
--- linux-2.5.orig/net/sched/sch_api.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/sch_api.c	Sat Jan  4 16:53:23 2003
@@ -409,6 +409,10 @@
 	if (ops == NULL)
 		goto err_out;
 
+	err = -ENOSYS;
+	if (try_module_get(ops->owner) == 0)
+		goto err_module;
+
 	size = sizeof(*sch) + ops->priv_size;
 
 	sch = kmalloc(size, GFP_KERNEL);
@@ -416,12 +420,6 @@
 	if (!sch)
 		goto err_out;
 
-	/* Grrr... Resolve race condition with module unload */
-
-	err = -EINVAL;
-	if (ops != qdisc_lookup_ops(kind))
-		goto err_out;
-
 	memset(sch, 0, size);
 
 	skb_queue_head_init(&sch->q);
@@ -460,6 +458,8 @@
 	}
 
 err_out:
+	module_put(ops->owner);
+err_module:
 	*errp = err;
 	if (sch)
 		kfree(sch);
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_atm.c linux-2.5/net/sched/sch_atm.c
--- linux-2.5.orig/net/sched/sch_atm.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/sch_atm.c	Sat Jan  4 16:51:24 2003
@@ -575,7 +575,6 @@
 	p->link.ref = 1;
 	p->link.next = NULL;
 	tasklet_init(&p->task,sch_atm_dequeue,(unsigned long) sch);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -612,7 +611,6 @@
 		}
 	}
 	tasklet_kill(&p->task);
-	MOD_DEC_USE_COUNT;
 }
 
 
@@ -697,9 +695,10 @@
 	.destroy	= atm_tc_destroy,
 	.change		= NULL,
 
-	.dump		= atm_tc_dump
-};
+	.dump		= atm_tc_dump,
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
@@ -707,9 +706,10 @@
 	return register_qdisc(&atm_qdisc_ops);
 }
 
-
 void cleanup_module(void) 
 {
 	unregister_qdisc(&atm_qdisc_ops);
 }
 #endif
+
+MODULE_LICENSE("GPL");
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_cbq.c linux-2.5/net/sched/sch_cbq.c
--- linux-2.5.orig/net/sched/sch_cbq.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/sch_cbq.c	Sat Jan  4 16:51:30 2003
@@ -1411,9 +1411,7 @@
 
 	r = RTA_DATA(tb[TCA_CBQ_RATE-1]);
 
-	MOD_INC_USE_COUNT;
 	if ((q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB-1])) == NULL) {
-		MOD_DEC_USE_COUNT;
 		return -EINVAL;
 	}
 
@@ -1749,7 +1747,6 @@
 	}
 
 	qdisc_put_rtab(q->link.R_tab);
-	MOD_DEC_USE_COUNT;
 }
 
 static void cbq_put(struct Qdisc *sch, unsigned long arg)
@@ -2099,6 +2096,8 @@
 	.change		= NULL,
 
 	.dump		= cbq_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_csz.c linux-2.5/net/sched/sch_csz.c
--- linux-2.5.orig/net/sched/sch_csz.c	Sat Jan  4 16:38:50 2003
+++ linux-2.5/net/sched/sch_csz.c	Sat Jan  4 16:53:35 2003
@@ -749,7 +749,7 @@
 static void
 csz_destroy(struct Qdisc* sch)
 {
-	MOD_DEC_USE_COUNT;
+	/* nop */
 }
 
 static int csz_init(struct Qdisc *sch, struct rtattr *opt)
@@ -791,7 +791,6 @@
 	q->wd_timer.data = (unsigned long)sch;
 	q->wd_timer.function = csz_watchdog;
 #endif
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -1046,8 +1045,9 @@
 	.change		= NULL,
 
 	.dump		= csz_dump,
-};
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_dsmark.c linux-2.5/net/sched/sch_dsmark.c
--- linux-2.5.orig/net/sched/sch_dsmark.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_dsmark.c	Sat Jan  4 16:51:43 2003
@@ -352,7 +352,6 @@
 	if (!(p->q = qdisc_create_dflt(sch->dev, &pfifo_qdisc_ops)))
 		p->q = &noop_qdisc;
 	DPRINTK("dsmark_init: qdisc %p\n",&p->q);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -381,7 +380,6 @@
 	qdisc_destroy(p->q);
 	p->q = &noop_qdisc;
 	kfree(p->mask);
-	MOD_DEC_USE_COUNT;
 }
 
 
@@ -466,7 +464,9 @@
 	.destroy	= dsmark_destroy,
 	.change		= NULL,
 
-	.dump		= dsmark_dump
+	.dump		= dsmark_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
@@ -474,7 +474,6 @@
 {
 	return register_qdisc(&dsmark_qdisc_ops);
 }
-
 
 void cleanup_module(void) 
 {
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_fifo.c linux-2.5/net/sched/sch_fifo.c
--- linux-2.5.orig/net/sched/sch_fifo.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_fifo.c	Sat Jan  4 16:14:50 2003
@@ -206,4 +206,6 @@
 	.change		= fifo_init,
 
 	.dump		= fifo_dump,
+
+	.owner		= THIS_MODULE,
 };
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_generic.c linux-2.5/net/sched/sch_generic.c
--- linux-2.5.orig/net/sched/sch_generic.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_generic.c	Sat Jan  4 16:54:10 2003
@@ -29,6 +29,7 @@
 #include <linux/skbuff.h>
 #include <linux/rtnetlink.h>
 #include <linux/init.h>
+#include <linux/module.h>
 #include <net/sock.h>
 #include <net/pkt_sched.h>
 
@@ -253,6 +254,8 @@
 	.enqueue	= noop_enqueue,
 	.dequeue	= noop_dequeue,
 	.requeue	= noop_requeue,
+
+	.owner		= THIS_MODULE,
 };
 
 struct Qdisc noqueue_qdisc =
@@ -356,6 +359,8 @@
 
 	.init		= pfifo_fast_init,
 	.reset		= pfifo_fast_reset,
+	
+	.owner		= THIS_MODULE,
 };
 
 struct Qdisc * qdisc_create_dflt(struct net_device *dev, struct Qdisc_ops *ops)
@@ -422,6 +427,7 @@
 		ops->reset(qdisc);
 	if (ops->destroy)
 		ops->destroy(qdisc);
+	module_put(ops->owner);
 	if (!(qdisc->flags&TCQ_F_BUILTIN))
 		kfree(qdisc);
 }
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_gred.c linux-2.5/net/sched/sch_gred.c
--- linux-2.5.orig/net/sched/sch_gred.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_gred.c	Sat Jan  4 16:51:58 2003
@@ -348,7 +348,6 @@
 		table->grio=sopt->grio; 
 		table->initd=0;
 		/* probably need to clear all the table DP entries as well */
-		MOD_INC_USE_COUNT;
 		return 0;
 	    }
 
@@ -490,7 +489,6 @@
 		table->def=sopt->def_DP; 
 		table->grio=sopt->grio; 
 		table->initd=0;
-		MOD_INC_USE_COUNT;
 		return 0;
 	}
 
@@ -602,7 +600,6 @@
 		if (table->tab[i])
 			kfree(table->tab[i]);
 	}
-	MOD_DEC_USE_COUNT;
 }
 
 struct Qdisc_ops gred_qdisc_ops =
@@ -623,8 +620,9 @@
 	.change		= gred_change,
 
 	.dump		= gred_dump,
+	
+	.owner		= THIS_MODULE,
 };
-
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_htb.c linux-2.5/net/sched/sch_htb.c
--- linux-2.5.orig/net/sched/sch_htb.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_htb.c	Sat Jan  4 16:55:04 2003
@@ -1181,7 +1181,6 @@
 		q->rate2quantum = 1;
 	q->defcls = gopt->defcls;
 
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -1366,7 +1365,6 @@
 
 	htb_destroy_filters(&q->filter_list);
 	__skb_queue_purge(&q->direct_queue);
-	MOD_DEC_USE_COUNT;
 }
 
 static int htb_delete(struct Qdisc *sch, unsigned long arg)
@@ -1600,39 +1598,41 @@
 
 static struct Qdisc_class_ops htb_class_ops =
 {
-    htb_graft,
-    htb_leaf,
-    htb_get,
-    htb_put,
-    htb_change_class,
-    htb_delete,
-    htb_walk,
-
-    htb_find_tcf,
-    htb_bind_filter,
-    htb_unbind_filter,
+	.graft		= htb_graft,
+	.leaf		= htb_leaf,
+	.get		= htb_get,
+	.put		= htb_put,
+	.change		= htb_change_class,
+	.delete		= htb_delete,
+	.walk		= htb_walk,
+
+	.tcf_chain	= htb_find_tcf,
+	.bind_tcf	= htb_bind_filter,
+	.unbind_tcf	= htb_unbind_filter,
 
-    htb_dump_class,
+	.dump		= htb_dump_class,
 };
 
 struct Qdisc_ops htb_qdisc_ops =
 {
-    NULL,
-    &htb_class_ops,
-    "htb",
-    sizeof(struct htb_sched),
-
-    htb_enqueue,
-    htb_dequeue,
-    htb_requeue,
-    htb_drop,
-
-    htb_init,
-    htb_reset,
-    htb_destroy,
-    NULL /* htb_change */,
+	.next 		= NULL,
+	.cl_ops 	= &htb_class_ops,
+	.id		= "htb",
+	.priv_size	= sizeof(struct htb_sched),
+
+	.enqueue	= htb_enqueue,
+	.dequeue	= htb_dequeue,
+	.requeue	= htb_requeue,
+	.drop		= htb_drop,
+
+	.init		= htb_init,
+	.reset		= htb_reset,
+	.destroy	= htb_destroy,
+	.change		= NULL,
 
-    htb_dump,
+	.dump		= htb_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_ingress.c linux-2.5/net/sched/sch_ingress.c
--- linux-2.5.orig/net/sched/sch_ingress.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_ingress.c	Sat Jan  4 16:52:49 2003
@@ -257,7 +257,6 @@
 	memset(p, 0, sizeof(*p));
 	p->filter_list = NULL;
 	p->q = &noop_qdisc;
-	MOD_INC_USE_COUNT;
 	return 0;
 error:
 	return -EINVAL;
@@ -304,8 +303,6 @@
 	qdisc_destroy(p->q);
 #endif
  
-	MOD_DEC_USE_COUNT;
-
 }
 
 
@@ -359,22 +356,20 @@
 	.change		= NULL,
 
 	.dump		= ingress_dump,
-};
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
 {
 	int ret = 0;
 
-	if ((ret = register_qdisc(&ingress_qdisc_ops)) < 0) {
-		printk("Unable to register Ingress qdisc\n");
-		return ret;
-	}
+	if ((ret = register_qdisc(&ingress_qdisc_ops)) < 0)
+		printk(KERN_ERR "Unable to register Ingress qdisc\n");
 
 	return ret;
 }
-
 
 void cleanup_module(void) 
 {
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_prio.c linux-2.5/net/sched/sch_prio.c
--- linux-2.5.orig/net/sched/sch_prio.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_prio.c	Sat Jan  4 16:52:53 2003
@@ -163,7 +163,6 @@
 		qdisc_destroy(q->queues[prio]);
 		q->queues[prio] = &noop_qdisc;
 	}
-	MOD_DEC_USE_COUNT;
 }
 
 static int prio_tune(struct Qdisc *sch, struct rtattr *opt)
@@ -227,7 +226,6 @@
 		if ((err= prio_tune(sch, opt)) != 0)
 			return err;
 	}
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -399,10 +397,11 @@
 	.change		= prio_tune,
 
 	.dump		= prio_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
-
 int init_module(void)
 {
 	return register_qdisc(&prio_qdisc_ops);
@@ -412,6 +411,5 @@
 {
 	unregister_qdisc(&prio_qdisc_ops);
 }
-
 #endif
 MODULE_LICENSE("GPL");
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_red.c linux-2.5/net/sched/sch_red.c
--- linux-2.5.orig/net/sched/sch_red.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_red.c	Sat Jan  4 16:52:57 2003
@@ -407,14 +407,7 @@
 
 static int red_init(struct Qdisc* sch, struct rtattr *opt)
 {
-	int err;
-
-	MOD_INC_USE_COUNT;
-
-	if ((err = red_change(sch, opt)) != 0) {
-		MOD_DEC_USE_COUNT;
-	}
-	return err;
+	return red_change(sch, opt);
 }
 
 
@@ -458,7 +451,7 @@
 
 static void red_destroy(struct Qdisc *sch)
 {
-	MOD_DEC_USE_COUNT;
+	/* nop */
 }
 
 struct Qdisc_ops red_qdisc_ops =
@@ -479,8 +472,9 @@
 	.change		= red_change,
 
 	.dump		= red_dump,
-};
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_sfq.c linux-2.5/net/sched/sch_sfq.c
--- linux-2.5.orig/net/sched/sch_sfq.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_sfq.c	Sat Jan  4 16:53:02 2003
@@ -435,7 +435,6 @@
 	}
 	for (i=0; i<SFQ_DEPTH; i++)
 		sfq_link(q, i);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -443,7 +442,6 @@
 {
 	struct sfq_sched_data *q = (struct sfq_sched_data *)sch->data;
 	del_timer(&q->perturb_timer);
-	MOD_DEC_USE_COUNT;
 }
 
 static int sfq_dump(struct Qdisc *sch, struct sk_buff *skb)
@@ -486,6 +484,8 @@
 	.change		= NULL,
 
 	.dump		= sfq_dump,
+
+	.owner		= THIS_MODULE,
 };
 
 #ifdef MODULE
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_tbf.c linux-2.5/net/sched/sch_tbf.c
--- linux-2.5.orig/net/sched/sch_tbf.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_tbf.c	Sat Jan  4 16:53:06 2003
@@ -330,23 +330,17 @@
 
 static int tbf_init(struct Qdisc* sch, struct rtattr *opt)
 {
-	int err;
 	struct tbf_sched_data *q = (struct tbf_sched_data *)sch->data;
 	
 	if (opt == NULL)
 		return -EINVAL;
 	
-	MOD_INC_USE_COUNT;
-	
 	PSCHED_GET_TIME(q->t_c);
 	init_timer(&q->wd_timer);
 	q->wd_timer.function = tbf_watchdog;
 	q->wd_timer.data = (unsigned long)sch;
 	
-	if ((err = tbf_change(sch, opt)) != 0) {
-		MOD_DEC_USE_COUNT;
-	}
-	return err;
+	return tbf_change(sch, opt); 
 }
 
 static void tbf_destroy(struct Qdisc *sch)
@@ -359,8 +353,6 @@
 		qdisc_put_rtab(q->P_tab);
 	if (q->R_tab)
 		qdisc_put_rtab(q->R_tab);
-
-	MOD_DEC_USE_COUNT;
 }
 
 static int tbf_dump(struct Qdisc *sch, struct sk_buff *skb)
@@ -409,8 +401,9 @@
 	.change		= tbf_change,
 
 	.dump		= tbf_dump,
-};
 
+	.owner		= THIS_MODULE,
+};
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/net/sched/sch_teql.c linux-2.5/net/sched/sch_teql.c
--- linux-2.5.orig/net/sched/sch_teql.c	Sat Jan  4 16:38:51 2003
+++ linux-2.5/net/sched/sch_teql.c	Sat Jan  4 16:34:52 2003
@@ -178,7 +178,6 @@
 		} while ((prev = q) != master->slaves);
 	}
 
-	MOD_DEC_USE_COUNT;
 }
 
 static int teql_qdisc_init(struct Qdisc *sch, struct rtattr *opt)
@@ -223,7 +222,6 @@
 		m->dev.flags = (m->dev.flags&~FMASK)|(dev->flags&FMASK);
 	}
 	
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
@@ -454,8 +452,9 @@
 	.reset		= teql_reset,
 	.destroy	= teql_destroy,
 	.dump		= NULL,
-},};
 
+	.owner		= THIS_MODULE,
+},};
 
 #ifdef MODULE
 int init_module(void)
diff --exclude-from=diff.exclude -ru linux-2.5.orig/include/net/pkt_cls.h linux-2.5/include/net/pkt_cls.h
--- linux-2.5.orig/include/net/pkt_cls.h	Sat Jan  4 16:38:51 2003
+++ linux-2.5/include/net/pkt_cls.h	Fri Jan  3 17:20:03 2003
@@ -3,6 +3,7 @@
 
 
 #include <linux/pkt_cls.h>
+#include <linux/module.h>
 
 struct rtattr;
 struct tcmsg;
@@ -56,6 +57,8 @@
 
 	/* rtnetlink specific */
 	int			(*dump)(struct tcf_proto*, unsigned long, struct sk_buff *skb, struct tcmsg*);
+
+	struct module		*owner;
 };
 
 /* Main classifier routine: scans classifier chain attached
diff --exclude-from=diff.exclude -ru linux-2.5.orig/include/net/pkt_sched.h linux-2.5/include/net/pkt_sched.h
--- linux-2.5.orig/include/net/pkt_sched.h	Sat Jan  4 16:38:51 2003
+++ linux-2.5/include/net/pkt_sched.h	Thu Jan  2 22:50:57 2003
@@ -10,6 +10,7 @@
 #include <linux/config.h>
 #include <linux/types.h>
 #include <linux/pkt_sched.h>
+#include <linux/module.h>
 #include <net/pkt_cls.h>
 
 #ifdef CONFIG_X86_TSC
@@ -67,6 +68,8 @@
 	int			(*change)(struct Qdisc *, struct rtattr *arg);
 
 	int			(*dump)(struct Qdisc *, struct sk_buff *);
+	/* Protects callbacks */
+	struct module 		*owner;
 };
 
 extern rwlock_t qdisc_tree_lock;


I've  tested  it   a  bit  and  seems  to  work   ok. TEQL  queue  still
uses   MOD_{INC,DEC}_USE_COUNT  because   it  register   a  device   and
register_netdevice doesn't use the new interface yet.

ciao,
Luca
-- 
Reply-To: kronos@kronoz.cjb.net
Home: http://kronoz.cjb.net
The trouble with computers is that they do what you tell them, 
not what you want.
D. Cohen

  reply	other threads:[~2003-01-04 16:14 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-01-02 22:50 [RFC] Migrating net/sched to new module interface Kronos
2003-01-03  5:10 ` Rusty Russell
2003-01-03  8:37   ` David S. Miller
2003-01-04  6:09     ` Rusty Russell
2003-01-04 16:21       ` Kronos [this message]
2003-01-13 22:32   ` kuznet
2003-01-13 23:23     ` Max Krasnyansky
2003-01-14 17:49     ` Kronos
2003-01-15  0:21       ` Roman Zippel
2003-01-15  1:19         ` kuznet
2003-01-15  7:31           ` Werner Almesberger
2003-01-15  8:16             ` Rusty Russell
2003-01-15  9:33               ` Werner Almesberger
2003-01-16  1:12                 ` Rusty Russell
2003-01-16  2:42                   ` Werner Almesberger
2003-01-16  3:31                     ` Rusty Russell
2003-01-16  4:20                       ` Werner Almesberger
2003-01-16  4:25                       ` David S. Miller
2003-01-16  4:49                         ` Werner Almesberger
2003-01-16 16:05                         ` Roman Zippel
2003-01-16 18:15                     ` Roman Zippel
2003-01-16 18:58                       ` Werner Almesberger
2003-01-16 23:53                         ` Roman Zippel
2003-01-17  1:04                           ` Greg KH
2003-01-17  2:27                     ` Rusty Russell
2003-01-17 21:40                       ` Roman Zippel
2003-02-13 23:16                       ` Werner Almesberger
2003-02-14  1:57                         ` Rusty Russell
2003-02-14  3:44                           ` Werner Almesberger
2003-02-14 11:16                           ` Roman Zippel
2003-02-14 12:04                             ` Rusty Russell
2003-02-14 12:49                               ` Roman Zippel
2003-02-17  1:59                                 ` Rusty Russell
2003-02-17 10:53                                   ` Roman Zippel
2003-02-17 23:31                                     ` Rusty Russell
2003-02-18 12:26                                       ` Roman Zippel
2003-02-14 13:21                               ` Roman Zippel
2003-02-14 13:53                                 ` Werner Almesberger
2003-02-14 14:24                                   ` Roman Zippel
2003-02-14 18:30                                     ` Werner Almesberger
2003-02-14 20:09                                       ` Roman Zippel
2003-02-15  0:12                                         ` Werner Almesberger
2003-02-15  0:51                                           ` Roman Zippel
2003-02-15  2:28                                             ` Werner Almesberger
2003-02-15 23:20                                               ` Roman Zippel
2003-02-17 17:04                                                 ` Werner Almesberger
2003-02-17 23:09                                                   ` [RFC] Is an alternative module interface needed/possible? Roman Zippel
2003-02-18  1:18                                                     ` Werner Almesberger
2003-02-18  4:54                                                       ` Rusty Russell
2003-02-18  7:20                                                         ` Werner Almesberger
2003-02-18 12:06                                                           ` Roman Zippel
2003-02-18 14:12                                                             ` Werner Almesberger
2003-02-18 12:45                                                               ` Thomas Molina
2003-02-18 17:22                                                               ` Werner Almesberger
2003-02-19  3:30                                                                 ` Rusty Russell
2003-02-19  4:11                                                                   ` Werner Almesberger
2003-02-19 23:38                                                                     ` Rusty Russell
2003-02-20  9:46                                                                       ` Roman Zippel
2003-02-20  0:40                                                                 ` Roman Zippel
2003-02-20  2:17                                                                   ` Werner Almesberger
2003-02-23 16:02                                                                     ` Roman Zippel
2003-02-26 23:26                                                                       ` Werner Almesberger
2003-02-27 12:34                                                                         ` Roman Zippel
2003-02-27 13:20                                                                           ` Werner Almesberger
2003-02-27 14:33                                                                             ` Roman Zippel
2003-02-23 23:34                                                                 ` Kevin O'Connor
2003-02-24 12:14                                                                   ` Roman Zippel
2003-02-18 12:35                                                           ` Roman Zippel
2003-02-18 14:14                                                             ` Werner Almesberger
2003-02-19  1:48                                                       ` Roman Zippel
2003-02-19  2:27                                                         ` Werner Almesberger
2003-01-16 13:44                   ` [RFC] Migrating net/sched to new module interface Roman Zippel
2003-01-15 17:04               ` Roman Zippel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20030104162153.GA501@dreamland.darkstar.lan \
    --to=kronos@kronoz.cjb.net \
    --cc=kuznet@ms2.inr.ac.ru \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rusty@rustcorp.com.au \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox