static int io_zcrx_append_area(struct io_zcrx_ifq *ifq,
struct io_zcrx_area *area)
{
+ bool kern_readable = !area->mem.is_dmabuf;
+
if (WARN_ON_ONCE(ifq->area))
return -EINVAL;
+ if (WARN_ON_ONCE(ifq->kern_readable != kern_readable))
+ return -EINVAL;
+
ifq->area = area;
return 0;
}
if (ret)
goto err;
+ ifq->kern_readable = !(area.flags & IORING_ZCRX_AREA_DMABUF);
+
if (!(reg.flags & ZCRX_REG_NODEV)) {
ret = zcrx_register_netdev(ifq, ®, &area);
if (ret)
struct io_zcrx_area *area = ifq->area;
struct net_iov *niov = NULL;
- if (area->mem.is_dmabuf)
+ if (!ifq->kern_readable)
return NULL;
scoped_guard(spinlock_bh, &area->freelist_lock)
unsigned niov_shift;
struct user_struct *user;
struct mm_struct *mm_account;
+ bool kern_readable;
struct zcrx_rq rq ____cacheline_aligned_in_smp;