Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aab8d802 authored by Bjorn Andersson's avatar Bjorn Andersson
Browse files

remoteproc: Assign kref to rproc_vdev



No functional change

Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent be33c28f
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -356,6 +356,8 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
	if (!rvdev)
		return -ENOMEM;

	kref_init(&rvdev->refcount);

	rvdev->rproc = rproc;

	/* parse the vrings */
@@ -384,6 +386,14 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,
	return ret;
}

void rproc_vdev_release(struct kref *ref)
{
	struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount);

	list_del(&rvdev->node);
	kfree(rvdev);
}

/**
 * rproc_handle_trace() - handle a shared trace buffer resource
 * @rproc: the remote processor
+1 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ struct rproc_fw_ops {
void rproc_release(struct kref *kref);
irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
int rproc_boot_nowait(struct rproc *rproc);
void rproc_vdev_release(struct kref *ref);

/* from remoteproc_virtio.c */
int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id);
+6 −4
Original line number Diff line number Diff line
@@ -282,14 +282,13 @@ static const struct virtio_config_ops rproc_virtio_config_ops = {
 * Never call this function directly; it will be called by the driver
 * core when needed.
 */
static void rproc_vdev_release(struct device *dev)
static void rproc_virtio_dev_release(struct device *dev)
{
	struct virtio_device *vdev = dev_to_virtio(dev);
	struct rproc_vdev *rvdev = vdev_to_rvdev(vdev);
	struct rproc *rproc = vdev_to_rproc(vdev);

	list_del(&rvdev->node);
	kfree(rvdev);
	kref_put(&rvdev->refcount, rproc_vdev_release);

	put_device(&rproc->dev);
}
@@ -313,7 +312,7 @@ int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id)
	vdev->id.device	= id,
	vdev->config = &rproc_virtio_config_ops,
	vdev->dev.parent = dev;
	vdev->dev.release = rproc_vdev_release;
	vdev->dev.release = rproc_virtio_dev_release;

	/*
	 * We're indirectly making a non-temporary copy of the rproc pointer
@@ -325,6 +324,9 @@ int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id)
	 */
	get_device(&rproc->dev);

	/* Reference the vdev and vring allocations */
	kref_get(&rvdev->refcount);

	ret = register_virtio_device(vdev);
	if (ret) {
		put_device(&rproc->dev);
+3 −0
Original line number Diff line number Diff line
@@ -487,6 +487,7 @@ struct rproc_vring {

/**
 * struct rproc_vdev - remoteproc state for a supported virtio device
 * @refcount: reference counter for the vdev and vring allocations
 * @node: list node
 * @rproc: the rproc handle
 * @vdev: the virio device
@@ -494,6 +495,8 @@ struct rproc_vring {
 * @rsc_offset: offset of the vdev's resource entry
 */
struct rproc_vdev {
	struct kref refcount;

	struct list_head node;
	struct rproc *rproc;
	struct virtio_device vdev;