|
@@ -370,6 +370,13 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
|
|
|
/* remember the resource offset*/
|
|
|
rvdev->rsc_offset = offset;
|
|
|
|
|
|
+ /* allocate the vring resources */
|
|
|
+ for (i = 0; i < rsc->num_of_vrings; i++) {
|
|
|
+ ret = rproc_alloc_vring(rvdev, i);
|
|
|
+ if (ret)
|
|
|
+ goto unwind_vring_allocations;
|
|
|
+ }
|
|
|
+
|
|
|
list_add_tail(&rvdev->node, &rproc->rvdevs);
|
|
|
|
|
|
/* it is now safe to add the virtio device */
|
|
@@ -379,6 +386,9 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+unwind_vring_allocations:
|
|
|
+ for (i--; i >= 0; i--)
|
|
|
+ rproc_free_vring(&rvdev->vring[i]);
|
|
|
remove_rvdev:
|
|
|
list_del(&rvdev->node);
|
|
|
free_rvdev:
|
|
@@ -389,6 +399,16 @@ free_rvdev:
|
|
|
void rproc_vdev_release(struct kref *ref)
|
|
|
{
|
|
|
struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount);
|
|
|
+ struct rproc_vring *rvring;
|
|
|
+ int id;
|
|
|
+
|
|
|
+ for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) {
|
|
|
+ rvring = &rvdev->vring[id];
|
|
|
+ if (!rvring->va)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ rproc_free_vring(rvring);
|
|
|
+ }
|
|
|
|
|
|
list_del(&rvdev->node);
|
|
|
kfree(rvdev);
|