Loading drivers/remoteproc/remoteproc_core.c +10 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -384,6 +386,14 @@ free_rvdev: 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 Loading drivers/remoteproc/remoteproc_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading drivers/remoteproc/remoteproc_virtio.c +6 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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 Loading @@ -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); Loading include/linux/remoteproc.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading Loading
drivers/remoteproc/remoteproc_core.c +10 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -384,6 +386,14 @@ free_rvdev: 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 Loading
drivers/remoteproc/remoteproc_internal.h +1 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
drivers/remoteproc/remoteproc_virtio.c +6 −4 Original line number Diff line number Diff line Loading @@ -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); } Loading @@ -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 Loading @@ -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); Loading
include/linux/remoteproc.h +3 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading