[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: API/ABIs: Re: [RFC PATCH v2 0/2] Add a new acquire resource to query vcpu statistics
On 14.03.2023 11:28, Matias Ezequiel Vara Larsen wrote: > On Fri, Mar 10, 2023 at 12:34:33PM +0100, Jan Beulich wrote: >> On 10.03.2023 11:58, Matias Ezequiel Vara Larsen wrote: >>> Oh, I see, thanks for the clarification. To summarise, these are the current >>> options: >>> 1. Use a "uint64_t" field thus limiting the number of counters to 64. The >>> current vcpu_runstate_info structure is limited to 4 counters though, one >>> for >>> each RUNSTATE_*. >>> 2. Use a dynamic array but this makes harder to use the interface. >>> 3. Eliminate stats_active and set to ~0 the actual stats value to mark >>> inactive >>> counters. This requires adding a "nr_stats" field to know how many counters >>> are. >> >> While nr_stats can indeed be seen as a generalization of the earlier >> stats_active, I think it is possible to get away without, as long as >> padding fields also are filled with the "inactive" marker. >> > > Understood. > >>> Also, this requires to make sure to saturate at 2^^64-2. >> >> Thinking of it - considering overflowed counters inactive looks like a >> reasonable model to me as well (which would mean saturating at 2^^64-1). >> >>> I might miss some details here but these are the options to evaluate. >>> >>> I would go with a variation of 1) by using two uint64_t, i.e., up to 128 >>> vcpu's >>> counters, which I think it would be enough. I may be wrong. >> >> Well, to me it doesn't matter whether it's 32, 64, or 128 - my concern >> is with any kind of inherent upper bound. Using 128 right away might >> look excessive, just like 32 might look too little. Hence my desire to >> get away without any built-in upper bound. IOW I continue to favor 3, >> irrespective of the presence or absence of nr_stats. >> > I see. 3) layout would look like: > > struct vcpu_shmem_stats { > #define VCPU_STATS_MAGIC 0xaabbccdd > uint32_t magic; > uint32_t offset; // roundup(sizeof(vcpu_shmem_stats), cacheline_size) > uint32_t size; // sizeof(vcpu_stats) > uint32_t stride; // roundup(sizeof(vcpu_stats), cacheline_size) > }; > > struct vcpu_stats { > /* > * If the least-significant bit of the seq number is set then an update > * is in progress and the consumer must wait to read a consistent set of > * values. This mechanism is similar to Linux's seqlock. > */ > uint32_t seq; > uint32 _pad; > /* > * If the most-significant bit of a counter is set then the counter > * is inactive and the consumer must ignore its value. Note that this > * could also indicate that the counter has overflowed. > */ > uint64_t stats_a; // e.g., runstate_running_time > ... > }; > > All padding fields shall be marked as "inactive". The consumer can't > distinguish inactive from overflowed. Also, the consumer shall always verify > before reading that: > > offsetof(struct vcpu_stats, stats_y) < size. > > in case the consumer knows about a counter, e.g., stats_y, that Xen does not > it. Looks okay to me this way, but please have this verified by another party (preferably Andrew, whose proposal was now changed). Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |