Messages in this thread Patch in this message | | | Subject | [PATCH] firmware loader: Fix the race FW_STATUS_DONE is followed by class_timeout | From | Chuansheng Liu <> | Date | Thu, 08 Nov 2012 00:45:44 +0800 |
| |
There is a race condition as below when calling request_firmware():
CPU1 CPU2 write 0 > loading mutex_lock(&fw_lock); ... set_bit FW_STATUS_DONE class_timeout is coming set_bit FW_STATUS_ABORT complete_all &completion ... mutex_unlock(&fw_lock)
In this time, the bit FW_STATUS_DONE and FW_STATUS_ABORT are set, and request_firmware() will return failure due to condition in _request_firmware_load():
if (!buf->size || test_bit(FW_STATUS_ABORT, &buf->status)) retval = -ENOENT;
But from the above scenerio, it should be a succcessful requesting. So we need judge if the FW_STATUS_DONE is set before calling abort in timeout function firmware_class_timeout().
Signed-off-by: liu chuansheng <chuansheng.liu@intel.com> --- drivers/base/firmware_class.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 8945f4e..35fffd8 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -671,6 +671,13 @@ static void firmware_class_timeout(u_long data) { struct firmware_priv *fw_priv = (struct firmware_priv *) data; + mutex_lock(&fw_lock); + if (test_bit(FW_STATUS_DONE, &(fw_priv->buf->status))) { + mutex_unlock(&fw_lock); + return; + } + mutex_unlock(&fw_lock); + fw_load_abort(fw_priv); } -- 1.7.0.4
| |