Message ID | 20190607113835.15376-1-geert+renesas@glider.be (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Series | [PATCH/RFC] dmaengine: Create symlinks from DMA channels to slaves | expand |
On 07-06-19, 13:38, Geert Uytterhoeven wrote: > Currently it is not easy to find out which DMA channels are in use, and > by which slave devices. > > Fix this by creating in sysfs a "slave" symlink from the DMA channel to > the actual slave device when a channel is requested, and removing it > again when the channel is released. > > For now this is limited to DT and ACPI. > > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> > --- > Questions: > 1. Do you think this is useful? Yes for me at least :) > 2. Should backlinks (e.g. "dma:<name>") be created from the slave > device to the DMA channel? > This requires storing the name in struct dma_chan, for later > symlink removal. that would certainly be more helpful > 3. Should this be extended to other ways of requesting channels? > In many cases, no device pointer is available, so a device pointer > parameter has to be added to all DMA channel request APIs that > don't have it yet. I think that would need to be done. > --- > drivers/dma/dmaengine.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c > index 03ac4b96117cd8db..c11476f76fc96bcf 100644 > --- a/drivers/dma/dmaengine.c > +++ b/drivers/dma/dmaengine.c > @@ -706,6 +706,10 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) > > if (chan) { > /* Valid channel found or requester needs to be deferred */ > + if (!IS_ERR(chan) && > + sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, > + "slave")) > + dev_err(dev, "Cannot create DMA slave symlink\n"); > if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) > return chan; > } > @@ -786,6 +790,7 @@ void dma_release_channel(struct dma_chan *chan) > /* drop PRIVATE cap enabled by __dma_request_channel() */ > if (--chan->device->privatecnt == 0) > dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); > + sysfs_remove_link(&chan->dev->device.kobj, "slave"); > mutex_unlock(&dma_list_mutex); > } > EXPORT_SYMBOL_GPL(dma_release_channel); > -- > 2.17.1
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 03ac4b96117cd8db..c11476f76fc96bcf 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c @@ -706,6 +706,10 @@ struct dma_chan *dma_request_chan(struct device *dev, const char *name) if (chan) { /* Valid channel found or requester needs to be deferred */ + if (!IS_ERR(chan) && + sysfs_create_link(&chan->dev->device.kobj, &dev->kobj, + "slave")) + dev_err(dev, "Cannot create DMA slave symlink\n"); if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER) return chan; } @@ -786,6 +790,7 @@ void dma_release_channel(struct dma_chan *chan) /* drop PRIVATE cap enabled by __dma_request_channel() */ if (--chan->device->privatecnt == 0) dma_cap_clear(DMA_PRIVATE, chan->device->cap_mask); + sysfs_remove_link(&chan->dev->device.kobj, "slave"); mutex_unlock(&dma_list_mutex); } EXPORT_SYMBOL_GPL(dma_release_channel);
Currently it is not easy to find out which DMA channels are in use, and by which slave devices. Fix this by creating in sysfs a "slave" symlink from the DMA channel to the actual slave device when a channel is requested, and removing it again when the channel is released. For now this is limited to DT and ACPI. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> --- Questions: 1. Do you think this is useful? 2. Should backlinks (e.g. "dma:<name>") be created from the slave device to the DMA channel? This requires storing the name in struct dma_chan, for later symlink removal. 3. Should this be extended to other ways of requesting channels? In many cases, no device pointer is available, so a device pointer parameter has to be added to all DMA channel request APIs that don't have it yet. --- drivers/dma/dmaengine.c | 5 +++++ 1 file changed, 5 insertions(+)