On Tue, Mar 5, 2024, at 03:01, Mina Almasry wrote:
+int netdev_bind_dmabuf(struct net_device *dev, unsigned int dmabuf_fd,
struct netdev_dmabuf_binding **out)
+{
- struct netdev_dmabuf_binding *binding;
- static u32 id_alloc_next;
- struct scatterlist *sg;
- struct dma_buf *dmabuf;
- unsigned int sg_idx, i;
- unsigned long virtual;
- int err;
- if (!capable(CAP_NET_ADMIN))
return -EPERM;
- dmabuf = dma_buf_get(dmabuf_fd);
- if (IS_ERR_OR_NULL(dmabuf))
return -EBADFD;
You should never need to use IS_ERR_OR_NULL() for a properly defined kernel interface. This one should always return an error or a valid pointer, so don't check for NULL.
- binding->attachment = dma_buf_attach(binding->dmabuf, dev->dev.parent);
- if (IS_ERR(binding->attachment)) {
err = PTR_ERR(binding->attachment);
goto err_free_id;
- }
- binding->sgt =
dma_buf_map_attachment(binding->attachment, DMA_BIDIRECTIONAL);
- if (IS_ERR(binding->sgt)) {
err = PTR_ERR(binding->sgt);
goto err_detach;
- }
Should there be a check to verify that this buffer is suitable for network data?
In general, dmabuf allows buffers that are uncached or reside in MMIO space of another device, but I think this would break when you get an skb with those buffers and try to parse the data inside of the kernel on architectures where MMIO space is not a normal pointer or unaligned access is disallowed on uncached data.
Arnd