Skip to content

Commit

Permalink
remoteproc: Assign kref to rproc_vdev
Browse files Browse the repository at this point in the history
No functional change

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
  • Loading branch information
Bjorn Andersson committed Nov 15, 2016
1 parent be33c28 commit aab8d80
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 4 deletions.
10 changes: 10 additions & 0 deletions drivers/remoteproc/remoteproc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions drivers/remoteproc/remoteproc_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
10 changes: 6 additions & 4 deletions drivers/remoteproc/remoteproc_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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
Expand All @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions include/linux/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -487,13 +487,16 @@ 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
* @vring: the vrings for this vdev
* @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;
Expand Down

0 comments on commit aab8d80

Please sign in to comment.