1
0
Fork 0

remoteproc: Fix potential race condition in rproc_add

rproc_add adds the newly created remoteproc to a list for use by
rproc_get_by_phandle and then does some additional processing to finish
adding the remoteproc. This leaves a small window of time in which the
rproc is available in the list but not yet fully initialized, so if
another driver comes along and gets a handle to the rproc, it will be
invalid. Rearrange the code in rproc_add to make sure the rproc is added
to the list only after it has been successfuly initialized.

Fixes: fec47d8635 ("remoteproc: introduce rproc_get_by_phandle API")
Cc: stable@vger.kernel.org
Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
hifive-unleashed-5.1
Dave Gerlach 2016-05-25 15:41:28 -05:00 committed by Bjorn Andersson
parent 15ebc72dba
commit d2e12e66a9
1 changed files with 9 additions and 6 deletions

View File

@ -1264,11 +1264,6 @@ int rproc_add(struct rproc *rproc)
if (ret < 0)
return ret;
/* expose to rproc_get_by_phandle users */
mutex_lock(&rproc_list_mutex);
list_add(&rproc->node, &rproc_list);
mutex_unlock(&rproc_list_mutex);
dev_info(dev, "%s is available\n", rproc->name);
dev_info(dev, "Note: remoteproc is still under development and considered experimental.\n");
@ -1276,8 +1271,16 @@ int rproc_add(struct rproc *rproc)
/* create debugfs entries */
rproc_create_debug_dir(rproc);
ret = rproc_add_virtio_devices(rproc);
if (ret < 0)
return ret;
return rproc_add_virtio_devices(rproc);
/* expose to rproc_get_by_phandle users */
mutex_lock(&rproc_list_mutex);
list_add(&rproc->node, &rproc_list);
mutex_unlock(&rproc_list_mutex);
return 0;
}
EXPORT_SYMBOL(rproc_add);