|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v7 02/10] xen/domain: Add vmtrace_frames domain creation parameter
On 25/01/2021 15:08, Jan Beulich wrote:
> On 21.01.2021 22:27, Andrew Cooper wrote:
>> --- a/xen/common/domain.c
>> +++ b/xen/common/domain.c
>> @@ -132,6 +132,48 @@ static void vcpu_info_reset(struct vcpu *v)
>> v->vcpu_info_mfn = INVALID_MFN;
>> }
>>
>> +static void vmtrace_free_buffer(struct vcpu *v)
>> +{
>> + const struct domain *d = v->domain;
>> + struct page_info *pg = v->vmtrace.buf;
>> + unsigned int i;
>> +
>> + if ( !pg )
>> + return;
>> +
>> + for ( i = 0; i < d->vmtrace_frames; i++ )
>> + {
>> + put_page_alloc_ref(&pg[i]);
>> + put_page_and_type(&pg[i]);
>> + }
>> +
>> + v->vmtrace.buf = NULL;
> To set a good precedent, maybe this wants moving up ahead of
> the loop and ...
>
>> +}
>> +
>> +static int vmtrace_alloc_buffer(struct vcpu *v)
>> +{
>> + struct domain *d = v->domain;
>> + struct page_info *pg;
>> + unsigned int i;
>> +
>> + if ( !d->vmtrace_frames )
>> + return 0;
>> +
>> + pg = alloc_domheap_pages(d, get_order_from_pages(d->vmtrace_frames),
>> + MEMF_no_refcount);
>> + if ( !pg )
>> + return -ENOMEM;
>> +
>> + v->vmtrace.buf = pg;
> ... this wants moving down past the loop, to avoid
> globally announcing something that isn't fully initialized
> yet / anymore?
Fine.
>
>> + for ( i = 0; i < d->vmtrace_frames; i++ )
>> + /* Domain can't know about this page yet - something fishy going
>> on. */
>> + if ( !get_page_and_type(&pg[i], d, PGT_writable_page) )
>> + BUG();
> Whatever the final verdict to the other similar places
> that one of your patch changes should be applied here,
> too.
Obviously, except there's 0 room for manoeuvring on that patch, so this
hunk is correct.
>
>> --- a/xen/include/public/domctl.h
>> +++ b/xen/include/public/domctl.h
>> @@ -94,6 +94,7 @@ struct xen_domctl_createdomain {
>> uint32_t max_evtchn_port;
>> int32_t max_grant_frames;
>> int32_t max_maptrack_frames;
>> + uint32_t vmtrace_frames;
> Considering page size related irritations elsewhere in the
> public interface, could you have a comment clarify the unit
> of this value (Xen's page size according to the rest of the
> patch), and that space will be allocated once per-vCPU
> rather than per-domain (to stand a chance of recognizing
> the ultimate memory footprint resulting from this)?
Well - its hopefully obvious that it shares the same units as the other
*_frames parameters.
But yes - the future ABI fixes, it will be forbidden to use anything in
units of frames, to fix the multitude of interface bugs pertaining to
non-4k page sizes.
I'll switch to using vmtrace_size, in units of bytes, and the per-arch
filtering can enforce being a multiple of 4k.
>
>> --- a/xen/include/xen/sched.h
>> +++ b/xen/include/xen/sched.h
>> @@ -257,6 +257,10 @@ struct vcpu
>> /* vPCI per-vCPU area, used to store data for long running operations.
>> */
>> struct vpci_vcpu vpci;
>>
>> + struct {
>> + struct page_info *buf;
>> + } vmtrace;
> While perhaps minor, I'm unconvinced "buf" is a good name
> for a field of this type.
Please suggest a better one then. This one is properly namespaced as
v->vmtrace.buf which is the least bad option I could come up with.
>
>> @@ -470,6 +474,9 @@ struct domain
>> unsigned pbuf_idx;
>> spinlock_t pbuf_lock;
>>
>> + /* Used by vmtrace features */
>> + uint32_t vmtrace_frames;
> unsigned int? Also could you move this to an existing 32-bit
> hole, like immediately after "monitor"?
Ok.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |