On Tue, Jun 02, 2020 at 11:10:57PM +0100, Al Viro wrote: > On Tue, Jun 02, 2020 at 04:42:03PM -0400, Michael S. Tsirkin wrote: > > On Tue, Jun 02, 2020 at 05:30:48PM +0100, Al Viro wrote: > > > On Tue, Jun 02, 2020 at 04:45:05AM -0400, Michael S. Tsirkin wrote: > > > > So vhost needs to poke at userspace *a lot* in a quick succession. It > > > > is thus benefitial to enable userspace access, do our thing, then > > > > disable. Except access_ok has already been pre-validated with all the > > > > relevant nospec checks, so we don't need that. Add an API to allow > > > > userspace access after access_ok and barrier_nospec are done. > > > > > > This is the wrong way to do it, and this API is certain to be abused > > > elsewhere. NAK - we need to sort out vhost-related problems, but > > > this is not an acceptable solution. Sorry. > > > > OK so summarizing what you and Linus both said, we need at > > least a way to make sure access_ok (and preferably the barrier too) > > is not missed. > > > > Another comment is about actually checking that performance impact > > is significant and worth the complexity and risk. > > > > Is that a fair summary? > > > > I'm actually thinking it's doable with a new __unsafe_user type of > > pointer, sparse will then catch errors for us. > > Er... how would sparse keep track of the range?
Using types. So you start with a user pointer: struct foo __user *up; Now you validate it, including a speculation barrier: struct foo __valdated_user *p = user_access_validate(up, sizeof *up); and you can save it and use it with something like unsafe_get_user and unsafe_put_user that gets __valdated_user pointers: user_access_begin_validated(p, sizeof *p) valiated_get_user(bar, foo->bar, err_fault) valiated_put_user(baz, foo->baz, err_fault) user_access_end() -- MST