diff options
Diffstat (limited to 'net/sched/ematch.c')
-rw-r--r-- | net/sched/ematch.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/sched/ematch.c b/net/sched/ematch.c index 24837391640d..f3a104e323bd 100644 --- a/net/sched/ematch.c +++ b/net/sched/ematch.c | |||
@@ -222,6 +222,19 @@ static int tcf_em_validate(struct tcf_proto *tp, | |||
222 | 222 | ||
223 | if (em->ops == NULL) { | 223 | if (em->ops == NULL) { |
224 | err = -ENOENT; | 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 | goto errout; | 238 | goto errout; |
226 | } | 239 | } |
227 | 240 | ||