[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC v1] x86/emulate: Send vm_event form emulate



>> +    if ( altp2m_active(current->domain) )
>> +        p2m = p2m_get_altp2m(current);
>> +    if ( !p2m )
>> +        p2m = p2m_get_hostp2m(current->domain);
>> +
>> +    gfn_lock(p2m, gfn, 0);
>> +    mfn = p2m->get_entry(p2m, gfn, &p2mt, &access, 0, NULL, NULL);
>> +    gfn_unlock(p2m, gfn, 0);
> 
> Don't you need to keep the gfn locked for at lest the duration of the
> function? Or else what you put in the req struct below might not be
> accurate by the time you write it. Maybe this is not relevant because
> this req ends up queued in an async ring, so by the time the other end
> reads the request the information might indeed have changed already.

I don't think the gfn should be locked for that long. I followed the 
model from p2m_mem_access_check() and there the gfn is locked in 
p2m_get_mem_access() only to get the access. This is relevant because 
the event is synced.
> 
> Also, I'm wondering whether there's no helper to fetch the gfn entry
> information from the p2m when using altp2m. The above construct (or
> variations of it) must be widely used in altp2m code?

I can change to p2m_get_mem_access() in the next version and lose some 
duplicated code here.
> 
>> +
>> +    if ( mfn_eq(mfn, INVALID_MFN) )
>> +        return false;
>> +
>> +    switch ( access ) {
>> +    case p2m_access_x:
>> +    case p2m_access_rx:
>> +        if ( pfec & PFEC_write_access )
>> +            req.u.mem_access.flags = MEM_ACCESS_R | MEM_ACCESS_W;
>> +        break;
> 
> Newline.
> 
>> +    case p2m_access_w:
>> +    case p2m_access_rw:
>> +        if ( pfec & PFEC_insn_fetch )
>> +            req.u.mem_access.flags = MEM_ACCESS_X;
>> +        break;
> 
> Newline.
> 
>> +    case p2m_access_r:
>> +    case p2m_access_n:
>> +        if ( pfec & PFEC_write_access )
>> +            req.u.mem_access.flags |= MEM_ACCESS_R | MEM_ACCESS_W;
>> +        if ( pfec & PFEC_insn_fetch )
>> +            req.u.mem_access.flags |= MEM_ACCESS_X;
>> +        break;
> 
> Newline.
> 
>> +    default:
>> +        return false;
>> +    }
> 
> I'm not sure the switch is needed, you can't have a PFEC_write_access
> for example if the p2m type is p2m_access_w or p2m_access_rw, hence it
> seems like it could be simplified to only take the pfec into account?

It is possible to have PFEC_write_access and p2m_access_w but then there 
is no violation and the event will not be sent.

> 
>> +
>> +    if ( !req.u.mem_access.flags )
>> +        return false; //no violation
> 
> Wrong comment style.
> 

>> +            if ( hvmemul_send_vm_event(gpa, addr, gfn, pfec, hvmemul_ctxt) )
>> +            {
>> +                err = ERR_PTR(~X86EMUL_ACCESS_EXCEPTION);
>> +                goto out;
>> +            }
> 
> It seems to me that you could send the VM event in
> hvmemul_linear_to_phys directly instead of doing it in the caller. The
> same patter is seen below.

At this moment I send the event from 2 places and hvmemul_linear_to_phys 
is called from many other place so I don't think this will work.

> 
>> +
>>               if ( p2m_is_discard_write(p2mt) )
>>               {
>>                   err = ERR_PTR(~X86EMUL_OKAY);
>> @@ -694,96 +866,6 @@ static void hvmemul_unmap_linear_addr(
>>   #endif
>>   }
>>
>> -/*
>> - * Convert addr from linear to physical form, valid over the range
>> - * [addr, addr + *reps * bytes_per_rep]. *reps is adjusted according to
>> - * the valid computed range. It is always >0 when X86EMUL_OKAY is returned.
>> - * @pfec indicates the access checks to be performed during page-table 
>> walks.
>> - */
>> -static int hvmemul_linear_to_phys(
>> -    unsigned long addr,
>> -    paddr_t *paddr,
>> -    unsigned int bytes_per_rep,
>> -    unsigned long *reps,
>> -    uint32_t pfec,
>> -    struct hvm_emulate_ctxt *hvmemul_ctxt)
> 
> If you need to move code around, please do it in a pre-patch without
> introducing any change. That way it's much more easy for reviews to
> identify and review your code changes.

Sorry for this, I will split it up in v2 to have the main patch clear.

Thanks,
Alex
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.