Thread (24 messages) 24 messages, 4 authors, 2021-06-18

Re: [PATCH v11 2/7] KVM: stats: Add fd-based API to read binary stats data

From: Jing Zhang <hidden>
Date: 2021-06-18 17:58:00
Also in: kvm, kvmarm, linux-kselftest, linux-s390

Hi Paolo,

On Fri, Jun 18, 2021 at 10:51 AM Paolo Bonzini [off-list ref] wrote:
On 18/06/21 10:23, Greg KH wrote:
quoted
On Fri, Jun 18, 2021 at 10:02:57AM +0200, Paolo Bonzini wrote:
quoted
On 18/06/21 09:00, Greg KH wrote:
quoted
quoted
+struct kvm_stats_header {
+  __u32 name_size;
+  __u32 count;
+  __u32 desc_offset;
+  __u32 data_offset;
+  char id[];
+};
You mentioned before that the size of this really is the size of the
structure + KVM_STATS_ID_MAXLEN, right?  Or is it - KVM_STATS_ID_MAXLEN?

If so, why not put that value explicitly in:
    char id[THE_REST_OF_THE_HEADER_SPACE];

As this is not a variable header size at all, and you can not change it
going forward, so the variable length array here feels disingenuous.
It can change; the header goes up to desc_offset.  Let's rename desc_offset
to header_size.
"Traditionally" the first field of a variable length structure like this
has the size.  So maybe this needs to be:

struct kvm_stats_header {
      __u32 header_size;
Thinking more about it, I slightly prefer id_offset so that we can later
give a meaning to any bytes after kvm_stats_header and before id_offset.

Adding four unused bytes (for now always zero) is also useful to future
proof the struct a bit, thus:

struct kvm_stats_header {
        __u32 flags;
        __u32 name_size;
        __u32 num_desc;
        __u32 id_offset;
        __u32 desc_offset;
        __u32 data_offset;
}

(Indeed num_desc is better than count).
quoted
Wait, what is "name_size" here for?
So that you know the full size of the descriptors is (name_size +
sizeof(kvm_stats_desc) + name_size) * num_desc.  That's the memory you
allocate and the size that you can then pass to a single pread system
call starting from offset desc_offset.

There is certainly room for improvement in that the length of id[] and
name[] can be unified to name_size.
Thanks for all these ideas, which indeed make it more clear and neat.
Will improve by this and post another version later.
quoted
quoted
quoted
quoted
+struct kvm_stats_desc {
+  __u32 flags;
+  __s16 exponent;
+  __u16 size;
+  __u32 offset;
+  __u32 unused;
+  char name[];
+};
What is the max length of name?
It's name_size in the header.
So it's specified in the _previous_ header?  That feels wrong, shouldn't
this descriptor define what is in it?
Compared to e.g. PCI where you can do random-access reads from memory or
configuration space, reading from a file has slightly different
tradeoffs.  So designing a file format is slightly different compared to
designing an in-memory format, or a wire protocol.

Paolo
Jing
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help