|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 4/6] x86/MSI: use standard C types in structures/unions
On 09/02/2023 10:39 am, Jan Beulich wrote:
> Consolidate this to use exclusively standard types, and change
> indentation style to Xen's there at the same time (the file already had
> a mix of styles).
>
> No functional change intended.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
So I suppose Acked-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> because
this is an improvement on the status quo, but I have quite a few requests.
> ---
> For most (all?) of the single bit I was on the edge of switching them to
> bool - thoughts?
Yes.
>
> --- a/xen/arch/x86/include/asm/msi.h
> +++ b/xen/arch/x86/include/asm/msi.h
> @@ -66,15 +66,15 @@ struct msi_info {
> };
>
> struct msi_msg {
> - union {
> - u64 address; /* message address */
> - struct {
> - u32 address_lo; /* message address low 32 bits */
> - u32 address_hi; /* message address high 32 bits */
> - };
> - };
> - u32 data; /* 16 bits of msi message data */
> - u32 dest32; /* used when Interrupt Remapping with EIM is
> enabled */
> + union {
> + uint64_t address; /* message address */
> + struct {
> + uint32_t address_lo; /* message address low 32 bits */
> + uint32_t address_hi; /* message address high 32 bits */
> + };
> + };
> + uint32_t data; /* 16 bits of msi message data */
> + uint32_t dest32; /* used when Interrupt Remapping with EIM is
> enabled */
The 16 is actively wrong for data, but honestly it's only this dest32
comment which has any value whatsoever (when it has been de-Intel'd).
I'd correct dest32 to reference the AMD too, and delete the rest.
> };
>
> struct irq_desc;
> @@ -94,35 +94,35 @@ extern int pci_restore_msi_state(struct
> extern int pci_reset_msix_state(struct pci_dev *pdev);
>
> struct msi_desc {
> - struct msi_attrib {
> - __u8 type; /* {0: unused, 5h:MSI, 11h:MSI-X} */
> - __u8 pos; /* Location of the MSI capability */
> - __u8 maskbit : 1; /* mask/pending bit supported ? */
> - __u8 is_64 : 1; /* Address size: 0=32bit 1=64bit */
> - __u8 host_masked : 1;
> - __u8 guest_masked : 1;
> - __u16 entry_nr; /* specific enabled entry */
> - } msi_attrib;
> -
> - bool irte_initialized;
> - uint8_t gvec; /* guest vector. valid when pi_desc
> isn't NULL */
> - const struct pi_desc *pi_desc; /* pointer to posted descriptor */
> -
> - struct list_head list;
> -
> - union {
> - void __iomem *mask_base;/* va for the entry in mask table */
> - struct {
> - unsigned int nvec;/* number of vectors */
> - unsigned int mpos;/* location of mask register */
> - } msi;
> - unsigned int hpet_id; /* HPET (dev is NULL) */
> - };
> - struct pci_dev *dev;
> - int irq;
> - int remap_index; /* index in interrupt remapping table */
> + struct msi_attrib {
> + uint8_t type; /* {0: unused, 5h:MSI, 11h:MSI-X} */
> + uint8_t pos; /* Location of the MSI capability */
> + uint8_t maskbit : 1; /* mask/pending bit supported ? */
> + uint8_t is_64 : 1; /* Address size: 0=32bit 1=64bit */
> + uint8_t host_masked : 1;
> + uint8_t guest_masked : 1;
> + uint16_t entry_nr; /* specific enabled entry */
entry_nr wants to move up to between pos and maskbit, and then we shrink
the total structure by 8 bytes (I think).
> + } msi_attrib;
> +
> + bool irte_initialized;
> + uint8_t gvec; /* guest vector. valid when pi_desc isn't NULL
> */
> + const struct pi_desc *pi_desc; /* pointer to posted descriptor */
> +
> + struct list_head list;
> +
> + union {
> + void __iomem *mask_base; /* va for the entry in mask table */
> + struct {
> + unsigned int nvec; /* number of vectors */
> + unsigned int mpos; /* location of mask register */
> + } msi;
> + unsigned int hpet_id; /* HPET (dev is NULL) */
> + };
> + struct pci_dev *dev;
> + int irq;
> + int remap_index; /* index in interrupt remapping table */
>
> - struct msi_msg msg; /* Last set MSI message */
> + struct msi_msg msg; /* Last set MSI message */
> };
>
> /*
> @@ -180,48 +180,48 @@ int msi_free_irq(struct msi_desc *entry)
>
> struct __packed msg_data {
> #if defined(__LITTLE_ENDIAN_BITFIELD)
There's no such thing as a big endian x86 bitfield. Just delete this
ifdefary to simplify the result.
Additionally, the structure doesn't need to be packed - its a single
uint32_t's worth of bitfield.
Finally, can we drop the reserved fields and leave them as anonymous
bitfields?
> - __u32 vector : 8;
> - __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
> - __u32 reserved_1 : 3;
> - __u32 level : 1; /* 0: deassert | 1: assert */
> - __u32 trigger : 1; /* 0: edge | 1: level */
> - __u32 reserved_2 : 16;
> + uint32_t vector : 8;
> + uint32_t delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
> + uint32_t reserved_1 : 3;
> + uint32_t level : 1; /* 0: deassert | 1: assert */
> + uint32_t trigger : 1; /* 0: edge | 1: level */
> + uint32_t reserved_2 : 16;
> #elif defined(__BIG_ENDIAN_BITFIELD)
> - __u32 reserved_2 : 16;
> - __u32 trigger : 1; /* 0: edge | 1: level */
> - __u32 level : 1; /* 0: deassert | 1: assert */
> - __u32 reserved_1 : 3;
> - __u32 delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
> - __u32 vector : 8;
> + uint32_t reserved_2 : 16;
> + uint32_t trigger : 1; /* 0: edge | 1: level */
> + uint32_t level : 1; /* 0: deassert | 1: assert */
> + uint32_t reserved_1 : 3;
> + uint32_t delivery_mode : 3; /* 000b: FIXED | 001b: lowest prior */
> + uint32_t vector : 8;
> #else
> #error "Bitfield endianness not defined! Check your byteorder.h"
> #endif
> };
>
> struct __packed msg_address {
> - union {
> - struct {
> + union {
> + struct {
> #if defined(__LITTLE_ENDIAN_BITFIELD)
Same here for ifdefary and packed.
> - __u32 reserved_1 : 2;
> - __u32 dest_mode : 1; /*0:physic | 1:logic */
> - __u32 redirection_hint: 1; /*0: dedicated CPU
> - 1: lowest priority */
> - __u32 reserved_2 : 4;
> - __u32 dest_id : 24; /* Destination ID */
> + uint32_t reserved_1 : 2;
> + uint32_t dest_mode : 1; /* 0:phys | 1:logic */
> + uint32_t redirection_hint : 1; /* 0: dedicated CPU
> + 1: lowest priority */
> + uint32_t reserved_2 : 4;
> + uint32_t dest_id : 24; /* Destination ID */
Considering that these fields are stale (its missing the remappable bit
for one), I do have to question if we actually use them correctly in code...
But that's not something for this patch.
~Andrew
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |