On Wed, Apr 17, 2024 at 11:07 PM Sean Christopherson <seanjc@xxxxxxxxxx> wrote: > > On Wed, Apr 17, 2024, Isaku Yamahata wrote: > > > + vcpu_load(vcpu); > > > + idx = srcu_read_lock(&vcpu->kvm->srcu); > > > + > > > + r = 0; > > > + full_size = mapping->size; > > > + while (mapping->size) { > > Maybe pre-check !mapping->size? E.g. there's no reason to load the vCPU and > acquire SRCU just to do nothing. Then this can be a do-while loop and doesn't > need to explicitly initialize 'r'. It's unlikely to make any difference but okay---easy enough. > > > + if (signal_pending(current)) { > > > + r = -EINTR; > > > + break; > > > + } > > > + > > > + r = kvm_arch_vcpu_map_memory(vcpu, mapping); > > Requiring arch code to address @mapping is cumbersone. If the arch call returns > a long, then can't we do? > > if (r < 0) > break; > > mapping->size -= r; > mapping->gpa += r; Ok, I thought the same for the return value. I didn't expand the arguments to arch code in case in the future we have flags or other expansions of the struct. > > > + if (r) > > > + break; > > > + > > > + cond_resched(); > > > + } > > > + > > > + srcu_read_unlock(&vcpu->kvm->srcu, idx); > > > + vcpu_put(vcpu); > > > + > > > + /* Return success if at least one page was mapped successfully. */ > > > + return full_size == mapping->size ? r : 0; > > I just saw Paolo's update that this is intentional, but this strikes me as odd, > as it requires userspace to redo the ioctl() to figure out why the last one failed. Yeah, the same is true of read() but I don't think it's a problem. If we get an EINTR, then (unlike KVM_RUN which can change the signal mask) the signal will be delivered right after the ioctl() returns and you can just proceed. For EAGAIN you can just proceed in general. And of course, if RET_PF_RETRY is handled in the kernel then EAGAIN goes away and the only cause of premature exit can be EINTR. Paolo > Not a sticking point, just odd to my eyes. >