On Fri, Mar 4, 2022 at 9:33 AM Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx> wrote: > > Given that we can not call bpf_hid_raw_request() from within an IRQ, > userspace needs to have a way to communicate with the device when > it needs. > > Implement a new type that the caller can run at will without being in > an IRQ context. > > Signed-off-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx> > > --- [...] > + if (user_size_out && data_out) { > + user_size_out = min3(user_size_out, (u32)ctx->size, (u32)ctx->allocated_size); > + > + if (copy_to_user(data_out, ctx->data, user_size_out)) { > + ret = -EFAULT; > + goto unlock; > + } > + > + if (copy_to_user(&uattr->test.data_size_out, > + &user_size_out, > + sizeof(user_size_out))) { > + ret = -EFAULT; > + goto unlock; > + } > + } > + > + if (copy_to_user(&uattr->test.retval, &ctx->u.user.retval, sizeof(ctx->u.user.retval))) { > + ret = -EFAULT; > + goto unlock; nit: this goto is not really needed. > + } > + > +unlock: > + kfree(ctx); > + > + mutex_unlock(&bpf_hid_mutex); > + return ret; > +} [...]