#include <linux/string.h>
 #include <linux/debugfs.h>
 #include <linux/devcoredump.h>
+#include <linux/rculist.h>
 #include <linux/remoteproc.h>
 #include <linux/iommu.h>
 #include <linux/idr.h>
        if (!np)
                return NULL;
 
-       mutex_lock(&rproc_list_mutex);
-       list_for_each_entry(r, &rproc_list, node) {
+       rcu_read_lock();
+       list_for_each_entry_rcu(r, &rproc_list, node) {
                if (r->dev.parent && r->dev.parent->of_node == np) {
                        /* prevent underlying implementation from being removed */
                        if (!try_module_get(r->dev.parent->driver->owner)) {
                        break;
                }
        }
-       mutex_unlock(&rproc_list_mutex);
+       rcu_read_unlock();
 
        of_node_put(np);
 
 
        /* expose to rproc_get_by_phandle users */
        mutex_lock(&rproc_list_mutex);
-       list_add(&rproc->node, &rproc_list);
+       list_add_rcu(&rproc->node, &rproc_list);
        mutex_unlock(&rproc_list_mutex);
 
        return 0;
 
        /* the rproc is downref'ed as soon as it's removed from the klist */
        mutex_lock(&rproc_list_mutex);
-       list_del(&rproc->node);
+       list_del_rcu(&rproc->node);
        mutex_unlock(&rproc_list_mutex);
 
+       /* Ensure that no readers of rproc_list are still active */
+       synchronize_rcu();
+
        device_del(&rproc->dev);
 
        return 0;