Hi Kenneth, sorry for waking up late on this patchset. On Wed, Jan 15, 2020 at 10:12:46PM +0800, Zhangfei Gao wrote: [... trimmed] > + > +static int uacce_fops_open(struct inode *inode, struct file *filep) > +{ > + struct uacce_mm *uacce_mm = NULL; > + struct uacce_device *uacce; > + struct uacce_queue *q; > + int ret = 0; > + > + uacce = xa_load(&uacce_xa, iminor(inode)); > + if (!uacce) > + return -ENODEV; > + > + q = kzalloc(sizeof(struct uacce_queue), GFP_KERNEL); > + if (!q) > + return -ENOMEM; > + > + mutex_lock(&uacce->mm_lock); > + uacce_mm = uacce_mm_get(uacce, q, current->mm); I think having this at open time is a bit unnatural. Since when a process does fork, we do not inherit the PASID. Although it inherits the fd but cannot use the mmaped address in the child. If you move this to the mmap time, its more natural. The child could do a mmap() get a new PASID + mmio space to work with the hardware. > + mutex_unlock(&uacce->mm_lock); > + if (!uacce_mm) { > + ret = -ENOMEM; > + goto out_with_mem; > + } > +