Tie the vdev (and hence vring) life cycle to the resource parsing and
resource cleanup operations, allowing us to safely register and
unregister virtio devices on the go.

Signed-off-by: Bjorn Andersson <bjorn.anders...@linaro.org>
---
 drivers/remoteproc/remoteproc_core.c | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/remoteproc_core.c 
b/drivers/remoteproc/remoteproc_core.c
index e4509c8dd8e8..1d2f4b2dd05d 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -377,6 +377,9 @@ static int rproc_handle_vdev(struct rproc *rproc, struct 
fw_rsc_vdev *rsc,
                        goto unwind_vring_allocations;
        }
 
+       /* track the rvdevs list reference */
+       kref_get(&rvdev->refcount);
+
        list_add_tail(&rvdev->node, &rproc->rvdevs);
 
        /* it is now safe to add the virtio device */
@@ -839,8 +842,10 @@ static void rproc_resource_cleanup(struct rproc *rproc)
        }
 
        /* clean up remote vdev entries */
-       list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node)
+       list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node) {
                rproc_remove_virtio_dev(rvdev);
+               kref_put(&rvdev->refcount, rproc_vdev_release);
+       }
 }
 
 /*
-- 
2.5.0

Reply via email to