瀏覽代碼

[NET_SCHED]: ematch: module autoloading

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Patrick McHardy 18 年之前
父節點
當前提交
db3d99c090
共有 8 個文件被更改,包括 31 次插入10 次删除
  1. 7 10
      include/linux/pkt_cls.h
  2. 2 0
      include/net/pkt_cls.h
  3. 1 0
      net/sched/em_cmp.c
  4. 2 0
      net/sched/em_meta.c
  5. 2 0
      net/sched/em_nbyte.c
  6. 2 0
      net/sched/em_text.c
  7. 2 0
      net/sched/em_u32.c
  8. 13 0
      net/sched/ematch.c

+ 7 - 10
include/linux/pkt_cls.h

@@ -403,16 +403,13 @@ enum
  *   1..32767		Reserved for ematches inside kernel tree
  *   1..32767		Reserved for ematches inside kernel tree
  *   32768..65535	Free to use, not reliable
  *   32768..65535	Free to use, not reliable
  */
  */
-enum
-{
-	TCF_EM_CONTAINER,
-	TCF_EM_CMP,
-	TCF_EM_NBYTE,
-	TCF_EM_U32,
-	TCF_EM_META,
-	TCF_EM_TEXT,
-	__TCF_EM_MAX
-};
+#define	TCF_EM_CONTAINER	0
+#define	TCF_EM_CMP		1
+#define	TCF_EM_NBYTE		2
+#define	TCF_EM_U32		3
+#define	TCF_EM_META		4
+#define	TCF_EM_TEXT		5
+#define	TCF_EM_MAX		5
 
 
 enum
 enum
 {
 {

+ 2 - 0
include/net/pkt_cls.h

@@ -306,6 +306,8 @@ static inline int tcf_em_tree_match(struct sk_buff *skb,
 		return 1;
 		return 1;
 }
 }
 
 
+#define MODULE_ALIAS_TCF_EMATCH(kind)	MODULE_ALIAS("ematch-kind-" __stringify(kind))
+
 #else /* CONFIG_NET_EMATCH */
 #else /* CONFIG_NET_EMATCH */
 
 
 struct tcf_ematch_tree
 struct tcf_ematch_tree

+ 1 - 0
net/sched/em_cmp.c

@@ -98,3 +98,4 @@ MODULE_LICENSE("GPL");
 module_init(init_em_cmp);
 module_init(init_em_cmp);
 module_exit(exit_em_cmp);
 module_exit(exit_em_cmp);
 
 
+MODULE_ALIAS_TCF_EMATCH(TCF_EM_CMP);

+ 2 - 0
net/sched/em_meta.c

@@ -848,3 +848,5 @@ MODULE_LICENSE("GPL");
 
 
 module_init(init_em_meta);
 module_init(init_em_meta);
 module_exit(exit_em_meta);
 module_exit(exit_em_meta);
+
+MODULE_ALIAS_TCF_EMATCH(TCF_EM_META);

+ 2 - 0
net/sched/em_nbyte.c

@@ -76,3 +76,5 @@ MODULE_LICENSE("GPL");
 
 
 module_init(init_em_nbyte);
 module_init(init_em_nbyte);
 module_exit(exit_em_nbyte);
 module_exit(exit_em_nbyte);
+
+MODULE_ALIAS_TCF_EMATCH(TCF_EM_NBYTE);

+ 2 - 0
net/sched/em_text.c

@@ -150,3 +150,5 @@ MODULE_LICENSE("GPL");
 
 
 module_init(init_em_text);
 module_init(init_em_text);
 module_exit(exit_em_text);
 module_exit(exit_em_text);
+
+MODULE_ALIAS_TCF_EMATCH(TCF_EM_TEXT);

+ 2 - 0
net/sched/em_u32.c

@@ -60,3 +60,5 @@ MODULE_LICENSE("GPL");
 
 
 module_init(init_em_u32);
 module_init(init_em_u32);
 module_exit(exit_em_u32);
 module_exit(exit_em_u32);
+
+MODULE_ALIAS_TCF_EMATCH(TCF_EM_U32);

+ 13 - 0
net/sched/ematch.c

@@ -222,6 +222,19 @@ static int tcf_em_validate(struct tcf_proto *tp,
 
 
 		if (em->ops == NULL) {
 		if (em->ops == NULL) {
 			err = -ENOENT;
 			err = -ENOENT;
+#ifdef CONFIG_KMOD
+			__rtnl_unlock();
+			request_module("ematch-kind-%u", em_hdr->kind);
+			rtnl_lock();
+			em->ops = tcf_em_lookup(em_hdr->kind);
+			if (em->ops) {
+				/* We dropped the RTNL mutex in order to
+				 * perform the module load. Tell the caller
+				 * to replay the request. */
+				module_put(em->ops->owner);
+				err = -EAGAIN;
+			}
+#endif
 			goto errout;
 			goto errout;
 		}
 		}