Commit db3d99c090e0cdb34b1274767e062bfddbb384bc

Authored by Patrick McHardy
Committed by David S. Miller
1 parent 662ad4f8ef

[NET_SCHED]: ematch: module autoloading

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 8 changed files with 31 additions and 10 deletions Side-by-side Diff

include/linux/pkt_cls.h
... ... @@ -403,16 +403,13 @@
403 403 * 1..32767 Reserved for ematches inside kernel tree
404 404 * 32768..65535 Free to use, not reliable
405 405 */
406   -enum
407   -{
408   - TCF_EM_CONTAINER,
409   - TCF_EM_CMP,
410   - TCF_EM_NBYTE,
411   - TCF_EM_U32,
412   - TCF_EM_META,
413   - TCF_EM_TEXT,
414   - __TCF_EM_MAX
415   -};
  406 +#define TCF_EM_CONTAINER 0
  407 +#define TCF_EM_CMP 1
  408 +#define TCF_EM_NBYTE 2
  409 +#define TCF_EM_U32 3
  410 +#define TCF_EM_META 4
  411 +#define TCF_EM_TEXT 5
  412 +#define TCF_EM_MAX 5
416 413  
417 414 enum
418 415 {
include/net/pkt_cls.h
... ... @@ -306,6 +306,8 @@
306 306 return 1;
307 307 }
308 308  
  309 +#define MODULE_ALIAS_TCF_EMATCH(kind) MODULE_ALIAS("ematch-kind-" __stringify(kind))
  310 +
309 311 #else /* CONFIG_NET_EMATCH */
310 312  
311 313 struct tcf_ematch_tree
... ... @@ -97,4 +97,6 @@
97 97  
98 98 module_init(init_em_cmp);
99 99 module_exit(exit_em_cmp);
  100 +
  101 +MODULE_ALIAS_TCF_EMATCH(TCF_EM_CMP);
... ... @@ -848,4 +848,6 @@
848 848  
849 849 module_init(init_em_meta);
850 850 module_exit(exit_em_meta);
  851 +
  852 +MODULE_ALIAS_TCF_EMATCH(TCF_EM_META);
net/sched/em_nbyte.c
... ... @@ -76,4 +76,6 @@
76 76  
77 77 module_init(init_em_nbyte);
78 78 module_exit(exit_em_nbyte);
  79 +
  80 +MODULE_ALIAS_TCF_EMATCH(TCF_EM_NBYTE);
... ... @@ -150,4 +150,6 @@
150 150  
151 151 module_init(init_em_text);
152 152 module_exit(exit_em_text);
  153 +
  154 +MODULE_ALIAS_TCF_EMATCH(TCF_EM_TEXT);
... ... @@ -60,4 +60,6 @@
60 60  
61 61 module_init(init_em_u32);
62 62 module_exit(exit_em_u32);
  63 +
  64 +MODULE_ALIAS_TCF_EMATCH(TCF_EM_U32);
... ... @@ -222,6 +222,19 @@
222 222  
223 223 if (em->ops == NULL) {
224 224 err = -ENOENT;
  225 +#ifdef CONFIG_KMOD
  226 + __rtnl_unlock();
  227 + request_module("ematch-kind-%u", em_hdr->kind);
  228 + rtnl_lock();
  229 + em->ops = tcf_em_lookup(em_hdr->kind);
  230 + if (em->ops) {
  231 + /* We dropped the RTNL mutex in order to
  232 + * perform the module load. Tell the caller
  233 + * to replay the request. */
  234 + module_put(em->ops->owner);
  235 + err = -EAGAIN;
  236 + }
  237 +#endif
225 238 goto errout;
226 239 }
227 240