[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/3] x86/mem_access: Make the mem_access ops generic
>> --- a/xen/arch/x86/mm/mem_access.c >> +++ b/xen/arch/x86/mm/mem_access.c >> @@ -21,31 +21,98 @@ >> */ >> >> >> +#include <xen/sched.h> >> +#include <xen/guest_access.h> >> +#include <xen/hypercall.h> >> #include <asm/p2m.h> >> #include <asm/mem_event.h> >> +#include <xsm/xsm.h> >> >> >> -int mem_access_memop(struct domain *d, xen_mem_event_op_t *meo) >> +#define ACCESS_op_mask 0xff > >I think this needs to be MEMOP_CMD_MASK (and then you wouldn't need a >new #define anyway). Or at least you need to put a >BUILD_BUG_ON() somewhere making sure this mask is at least as wide as >MEMOP_CMD_MASK. I did not go with MEMOP_CMD_MASK as it would mean that only 64 pfns would be set if preemption is needed. I would rather have at least 256 set the way you had it when this was a HVM op. I will add a BUILD_BUG_ON here. >> + >> +int mem_access_memop(XEN_GUEST_HANDLE_PARAM(void) arg, >unsigned long >> +start_iter) >> { >> - int rc; >> + long rc; >> + xen_mem_access_op_t mao; >> + struct domain *d; >> + >> + if ( copy_from_guest(&mao, arg, 1) ) >> + return -EFAULT; >> + >> + rc = rcu_lock_live_remote_domain_by_id(mao.domid, &d); >> + if ( rc ) >> + return rc; >> + >> + if ( !is_hvm_domain(d) ) >> + return -EINVAL; >> + >> + rc = xsm_mem_event_op(XSM_TARGET, d, XENMEM_access_op); >> + if ( rc ) >> + goto out; >> >> if ( unlikely(!d->mem_event->access.ring_page) ) >> return -ENODEV; >> >> - switch( meo->op ) >> + switch ( mao.op ) >> { >> case XENMEM_access_op_resume: >> { >> p2m_mem_access_resume(d); >> rc = 0; >> + break; >> + } >> + >> + case XENMEM_access_op_set_access: >> + rc = -EINVAL; >> + >> + /* >> + * Undo adjustment done in do_memory_op() so that it matches >> + * p2m_set_mem_access() >> + */ >> + start_iter <<= MEMOP_EXTENT_SHIFT; > >This is why perhaps it would be better to pass "cmd" down instead of "op" >and "start_extent". OK, I will pass down "cmd" instead of "op" and "start_extent". >> + if ( (mao.pfn != ~0ull) && >> + (mao.nr < start_iter || >> + ((mao.pfn + mao.nr - 1) < mao.pfn) || >> + ((mao.pfn + mao.nr - 1) > domain_get_maximum_gpfn(d))) ) >> + break; >> + >> + rc = p2m_set_mem_access(d, mao.pfn, mao.nr, start_iter, >> + ACCESS_op_mask, mao.access); >> + if ( rc > 0 ) >> + { >> + ASSERT(!(rc & ACCESS_op_mask)); >> + rc = hypercall_create_continuation(__HYPERVISOR_memory_op, >"lh", >> + XENMEM_access_op | rc, >> + arg); >> + } >> + break; >> + >> + case XENMEM_access_op_get_access: >> + { >> + xenmem_access_t access; >> + >> + rc = -EINVAL; >> + if ( (mao.pfn > domain_get_maximum_gpfn(d)) && mao.pfn != ~0ull ) >> + break; >> + >> + rc = p2m_get_mem_access(d, mao.pfn, &access); >> + if ( rc != 0 ) >> + break; >> + >> + mao.access = access; >> + rc = __copy_to_guest(arg, &mao, 1) ? -EFAULT : 0; > >If you passed a properly typed handle into this function (which is possible >because it wants only one kind of interface structure) you would get away >with the cheaper __copy_field_to_guest() here. Excellent suggestion. I will use __copy_field_to_guest() here. >> @@ -1359,7 +1359,7 @@ long p2m_set_mem_access(struct domain *d, >unsigned long pfn, uint32_t nr, >> long rc = 0; >> >> static const p2m_access_t memaccess[] = { -#define ACCESS(ac) >> [HVMMEM_access_##ac] = p2m_access_##ac >> +#define ACCESS(ac) [XENMEM_access_##ac] = p2m_access_##ac >> ACCESS(n), >> ACCESS(r), >> ACCESS(w), >> @@ -1416,23 +1416,23 @@ long p2m_set_mem_access(struct domain *d, >> unsigned long pfn, uint32_t nr, >> /* Get access type for a pfn >> * If pfn == -1ul, gets the default access type */ int >> p2m_get_mem_access(struct domain *d, unsigned long pfn, >> - hvmmem_access_t *access) >> + xenmem_access_t *access) >> { >> struct p2m_domain *p2m = p2m_get_hostp2m(d); >> p2m_type_t t; >> p2m_access_t a; >> mfn_t mfn; >> >> - static const hvmmem_access_t memaccess[] = { >> - HVMMEM_access_n, >> - HVMMEM_access_r, >> - HVMMEM_access_w, >> - HVMMEM_access_rw, >> - HVMMEM_access_x, >> - HVMMEM_access_rx, >> - HVMMEM_access_wx, >> - HVMMEM_access_rwx, >> - HVMMEM_access_rx2rw >> + static const xenmem_access_t memaccess[] = { >> + XENMEM_access_n, >> + XENMEM_access_r, >> + XENMEM_access_w, >> + XENMEM_access_rw, >> + XENMEM_access_x, >> + XENMEM_access_rx, >> + XENMEM_access_wx, >> + XENMEM_access_rwx, >> + XENMEM_access_rx2rw > >Please use an ACCESS() macro similar to that added by commit >ca0f2184 (also seen in the quoted hunk above this one) if you already need to >touch this, to remove the ordering dependency. OK, I will do that. >> @@ -195,6 +196,10 @@ int compat_arch_memory_op(int op, >XEN_GUEST_HANDLE_PARAM(void) arg) >> return -EFAULT; >> break; >> } >> + case XENMEM_access_op: >> + rc = mem_access_memop(arg, start_extent); >> + break; >> + > >Blank line also above this block please. Also you'll need to add verification >that >the compat and native structures' layouts match (i.e. to prove that you're >allowed to pass the argument here without translation). Looks like this is also >missing for the already existing xen_mem_event_op_t and >xen_mem_sharing_op_t. Is the following what I need to do? diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c index a38ecf6..005e602 100644 --- a/xen/common/compat/memory.c +++ b/xen/common/compat/memory.c @@ -13,6 +13,8 @@ CHECK_TYPE(domid); #undef compat_domid_t #undef xen_domid_t +CHECK_mem_access_op; + int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat) { int split, op = cmd & MEMOP_CMD_MASK; diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst index 5d354d8..0e7cef3 100644 --- a/xen/include/xlat.lst +++ b/xen/include/xlat.lst @@ -62,6 +62,7 @@ ! memory_reservation memory.h ! pod_target memory.h ! remove_from_physmap memory.h +? mem_access_op memory.h ? physdev_eoi physdev.h ? physdev_get_free_pirq physdev.h ? physdev_irq physdev.h Thanks, Aravindh _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |