From 000deba73a85381d393d58ce0a2a5ccf6a096b5a Mon Sep 17 00:00:00 2001 From: "Kweh, Hock Leong" Date: Tue, 18 Nov 2014 10:56:59 +0800 Subject: firmware loader: fix hung task warning dump When using request_firmware_nowait() with FW_ACTION_NOHOTPLUG param to expose user helper interface, if the user do not react immediately, after 120 seconds there will be a hung task warning message dumped as below: [ 3000.784235] INFO: task kworker/0:0:8259 blocked for more than 120 seconds. [ 3000.791281] Tainted: G E 3.16.0-rc1-yocto-standard #41 [ 3000.798082] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 3000.806072] kworker/0:0 D cd0075c8 0 8259 2 0x00000000 [ 3000.812765] Workqueue: events request_firmware_work_func [ 3000.818253] cd375e18 00000046 0000000e cd0075c8 000000f0 cd40ea00 cd375fec 1b883e89 [ 3000.826374] 0000026b cd40ea00 80000000 00000001 cd0075c8 00000000 cd375de4 c119917f [ 3000.834492] cd563360 cd375df4 c119a0ab cd563360 00000000 cd375e24 c119a1d6 00000000 [ 3000.842616] Call Trace: [ 3000.845252] [] ? kernfs_next_descendant_post+0x3f/0x50 [ 3000.851543] [] ? kernfs_activate+0x6b/0xc0 [ 3000.856790] [] ? kernfs_add_one+0xd6/0x130 [ 3000.862047] [] schedule+0x22/0x60 [ 3000.866548] [] schedule_timeout+0x175/0x1d0 [ 3000.871887] [] ? __kernfs_create_file+0x71/0xa0 [ 3000.877574] [] ? sysfs_add_file_mode_ns+0xaa/0x180 [ 3000.883533] [] wait_for_completion+0x6f/0xb0 [ 3000.888961] [] ? wake_up_process+0x40/0x40 [ 3000.894219] [] _request_firmware+0x750/0x9f0 [ 3000.899666] [] ? n_tty_receive_buf2+0x1f/0x30 [ 3000.905200] [] request_firmware_work_func+0x22/0x50 [ 3000.911235] [] process_one_work+0x122/0x380 [ 3000.916571] [] worker_thread+0xf9/0x470 [ 3000.921555] [] ? create_and_start_worker+0x50/0x50 [ 3000.927497] [] ? create_and_start_worker+0x50/0x50 [ 3000.933448] [] kthread+0x9f/0xc0 [ 3000.937850] [] ret_from_kernel_thread+0x20/0x30 [ 3000.943548] [] ? kthread_worker_fn+0x100/0x100 This patch change the wait_for_completion() function call to wait_for_completion_interruptible() function call for solving the issue. Cc: Matt Fleming Signed-off-by: Kweh, Hock Leong Acked-by: Ming Lei Acked-by: Greg Kroah-Hartman Signed-off-by: Greg Kroah-Hartman --- drivers/base/firmware_class.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'drivers/base/firmware_class.c') diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 3d785ebb48d3..9962744b59aa 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -925,7 +925,7 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); } - wait_for_completion(&buf->completion); + retval = wait_for_completion_interruptible(&buf->completion); cancel_delayed_work_sync(&fw_priv->timeout_work); if (is_fw_load_aborted(buf)) @@ -1004,7 +1004,7 @@ static int sync_cached_firmware_buf(struct firmware_buf *buf) break; } mutex_unlock(&fw_lock); - wait_for_completion(&buf->completion); + ret = wait_for_completion_interruptible(&buf->completion); mutex_lock(&fw_lock); } mutex_unlock(&fw_lock); -- cgit v1.2.3 From daa3d67fa3b5a997761ba594c6bca41b3e78963f Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Wed, 19 Nov 2014 11:38:38 +0100 Subject: firmware class: Deletion of an unnecessary check before the function call "vunmap" The vunmap() function performes also input parameter validation. Thus the test around the call is not needed. This issue was detected by using the Coccinelle software. Signed-off-by: Markus Elfring Signed-off-by: Greg Kroah-Hartman --- drivers/base/firmware_class.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'drivers/base/firmware_class.c') diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 9962744b59aa..58470c395301 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -591,8 +591,7 @@ static int fw_map_pages_buf(struct firmware_buf *buf) if (!buf->is_paged_buf) return 0; - if (buf->data) - vunmap(buf->data); + vunmap(buf->data); buf->data = vmap(buf->pages, buf->nr_pages, 0, PAGE_KERNEL_RO); if (!buf->data) return -ENOMEM; -- cgit v1.2.3