[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 09/11] xen/memory: Fix mapping grant tables with XENMEM_acquire_resource
On 11.01.2021 21:05, Andrew Cooper wrote: > On 28/09/2020 10:37, Jan Beulich wrote: >> On 22.09.2020 20:24, Andrew Cooper wrote: >>> --- a/xen/common/compat/memory.c >>> +++ b/xen/common/compat/memory.c >>> @@ -636,15 +662,45 @@ int compat_memory_op(unsigned int cmd, >>> XEN_GUEST_HANDLE_PARAM(void) compat) >>> compat_frame_list[i] = frame; >>> } >>> >>> - if ( __copy_to_compat_offset(cmp.mar.frame_list, 0, >>> - compat_frame_list, >>> - cmp.mar.nr_frames) ) >>> + if ( __copy_to_compat_offset( >>> + cmp.mar.frame_list, start_extent, >>> + compat_frame_list, done) ) >>> return -EFAULT; >>> } >>> - break; >>> + >>> + start_extent += done; >>> + >>> + /* Completely done. */ >>> + if ( start_extent == cmp.mar.nr_frames ) >>> + break; >>> + >>> + /* >>> + * Done a "full" batch, but we were limited by space in the >>> xlat >>> + * area. Go around the loop again without necesserily >>> returning >>> + * to guest context. >>> + */ >>> + if ( done == nat.mar->nr_frames ) >>> + { >>> + split = 1; >>> + break; >>> + } >>> + >>> + /* Explicit continuation request from a higher level. */ >>> + if ( done < nat.mar->nr_frames ) >>> + return hypercall_create_continuation( >>> + __HYPERVISOR_memory_op, "ih", >>> + op | (start_extent << MEMOP_EXTENT_SHIFT), compat); >>> + >>> + /* >>> + * Well... Somethings gone wrong with the two levels of >>> chunking. >>> + * My condolences to whomever next has to debug this mess. >>> + */ >> Any suggestion how to overcome this "mess"? > > The double level of array handling is what makes it so complicated. > There are enough cases in compat_memory_op() alone which can't > > We've got two cases in practice. A singleton object needing conversion, > or a large array of them. I'm quite certain we'd have less code and > less complexity by having copy_$OJBECT_{to,from}_guest() helpers which > dealt with compat internally as appropriate. > > We don't care about the performance of 32bit hypercalls, but not doing > batch conversions of 1020/etc objects in the compat layer will probably > result in better performance overall, as we don't throw away the work as > we batch things at smaller increments higher up the stack. I've put this on my todo list to investigate. Maybe nowadays we really don't care all this much about 32-bit hypercall performance. The picture was surely different when the compat layer was introduced. >>> --- a/xen/common/grant_table.c >>> +++ b/xen/common/grant_table.c >>> @@ -4105,6 +4105,9 @@ int gnttab_acquire_resource( >>> for ( i = 0; i < nr_frames; ++i ) >>> mfn_list[i] = virt_to_mfn(vaddrs[frame + i]); >>> >>> + /* Success. Passed nr_frames back to the caller. */ >> Nit: "Pass"? > > We have already passed them back to the caller. "Pass" is the wrong > tense to use. Hmm, interesting view. I personally wouldn't consider the passing back to have completed before we've returned. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |