(+ Thomas and Matt B who this was reviewed with as a concept) Quoting Christian König (2024-12-09 16:03:04) > Am 09.12.24 um 14:33 schrieb Mika Kuoppala: <SNIP> > > +int xe_vm_userptr_access(struct xe_userptr_vma *uvma, u64 offset, > > + void *buf, u64 len, bool write) > > +{ > > + struct xe_vm *vm = xe_vma_vm(&uvma->vma); > > + struct xe_userptr *up = &uvma->userptr; > > + struct xe_res_cursor cur = {}; > > + int cur_len, ret = 0; > > + > > + while (true) { > > + down_read(&vm->userptr.notifier_lock); > > + if (!xe_vma_userptr_check_repin(uvma)) > > + break; > > + > > + spin_lock(&vm->userptr.invalidated_lock); > > + list_del_init(&uvma->userptr.invalidate_link); > > + spin_unlock(&vm->userptr.invalidated_lock); > > + > > + up_read(&vm->userptr.notifier_lock); > > + ret = xe_vma_userptr_pin_pages(uvma); > > + if (ret) > > + return ret; > > + } > > + > > + if (!up->sg) { > > + ret = -EINVAL; > > + goto out_unlock_notifier; > > + } > > + > > + for (xe_res_first_sg_system(up->sg, offset, len, &cur); cur.remaining; > > + xe_res_next(&cur, cur_len)) { > > + void *ptr = kmap_local_page(sg_page(cur.sgl)) + cur.start; > > The interface basically creates a side channel to access userptrs in the > way an userspace application would do without actually going through > userspace. That's not quite the case here. The whole point of the debugger ability to access memory is to access any VMA in the GPU VM emulating as much as possible like the EUs themselves would do the access. As mentioned in the other threads, that also involves special cache flushes to make sure the contents has been flushed in and out of the EU caches in case we're modifying instruction code for breakpoints as an example. What the memory access function should do is to establish a temporary pinning situation where the memory would be accessible just like it would be for a short batchbuffer, but without interfering with the command streamers. If this should be established in a different way from this patch, then we should adapt of course. > That is generally not something a device driver should ever do as far as > I can see. Given above explanation, does it make more sense? For debugging purposes, we try to emulate the EU threads themselves accessing the memory, not the userspace at all. Regards, Joonas