diff options
author | Richard Weinberger <richard@nod.at> | 2014-03-20 19:42:54 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-04-15 14:39:09 -0400 |
commit | 29d1e7209e1866a1b6b686107cce9f5a9b886a53 (patch) | |
tree | cb1c0bc67dad329586550cbf97d3e88113eea018 | |
parent | c9eaa447e77efe77b7fa4c953bd62de8297fd6c5 (diff) |
staging/rtl8821ae: Fix OOM handling in _rtl_init_deferred_work()
alloc_workqueue() can fail, handle this case.
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/staging/rtl8821ae/base.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/staging/rtl8821ae/base.c b/drivers/staging/rtl8821ae/base.c index e5073fe24770..a4c9cc437bc6 100644 --- a/drivers/staging/rtl8821ae/base.c +++ b/drivers/staging/rtl8821ae/base.c | |||
@@ -388,7 +388,7 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw) | |||
388 | 388 | ||
389 | } | 389 | } |
390 | 390 | ||
391 | static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | 391 | static int _rtl_init_deferred_work(struct ieee80211_hw *hw) |
392 | { | 392 | { |
393 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 393 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
394 | 394 | ||
@@ -410,6 +410,9 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | |||
410 | rtlpriv->works.rtl_wq = create_workqueue(rtlpriv->cfg->name); | 410 | rtlpriv->works.rtl_wq = create_workqueue(rtlpriv->cfg->name); |
411 | #endif | 411 | #endif |
412 | /*<delete in kernel end>*/ | 412 | /*<delete in kernel end>*/ |
413 | if (!rtlpriv->works.rtl_wq) | ||
414 | return -ENOMEM; | ||
415 | |||
413 | INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, | 416 | INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, |
414 | (void *)rtl_watchdog_wq_callback); | 417 | (void *)rtl_watchdog_wq_callback); |
415 | INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, | 418 | INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, |
@@ -421,6 +424,8 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw) | |||
421 | INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, | 424 | INIT_DELAYED_WORK(&rtlpriv->works.fwevt_wq, |
422 | (void *)rtl_fwevt_wq_callback); | 425 | (void *)rtl_fwevt_wq_callback); |
423 | 426 | ||
427 | return 0; | ||
428 | |||
424 | } | 429 | } |
425 | 430 | ||
426 | void rtl_deinit_deferred_work(struct ieee80211_hw *hw) | 431 | void rtl_deinit_deferred_work(struct ieee80211_hw *hw) |
@@ -519,7 +524,8 @@ int rtl_init_core(struct ieee80211_hw *hw) | |||
519 | INIT_LIST_HEAD(&rtlpriv->entry_list); | 524 | INIT_LIST_HEAD(&rtlpriv->entry_list); |
520 | 525 | ||
521 | /* <6> init deferred work */ | 526 | /* <6> init deferred work */ |
522 | _rtl_init_deferred_work(hw); | 527 | if (_rtl_init_deferred_work(hw)) |
528 | return 1; | ||
523 | 529 | ||
524 | /* <7> */ | 530 | /* <7> */ |
525 | #ifdef VIF_TODO | 531 | #ifdef VIF_TODO |