The arch_msix struct had a single "warned" field with a domid for which
warning was issued. Upcoming patch will need similar mechanism for few
more warnings, so change it to save a bit field of issued warnings.
Signed-off-by: Marek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
PCI_MSIX_ENTRY_SIZE + \
(~PCI_MSIX_BIRMASK & (PAGE_SIZE - 1)))
+#define MSIX_CHECK_WARN(msix, domid, which) \
+ ({ \
+ if ( (msix)->warned_domid != (domid) ) \
+ { \
+ (msix)->warned_domid = (domid); \
+ (msix)->warned_kind.all = 0; \
+ } \
+ (msix)->warned_kind.which ? false : ((msix)->warned_kind.which = true); \
+ })
+
struct arch_msix {
unsigned int nr_entries, used_entries;
struct {
int table_idx[MAX_MSIX_TABLE_PAGES];
spinlock_t table_lock;
bool host_maskall, guest_maskall;
- domid_t warned;
+ domid_t warned_domid;
+ union {
+ uint8_t all;
+ struct {
+ bool maskall : 1;
+ };
+ } warned_kind;
};
void early_msi_init(void);
domid_t domid = pdev->domain->domain_id;
maskall = true;
- if ( pdev->msix->warned != domid )
- {
- pdev->msix->warned = domid;
+ if ( MSIX_CHECK_WARN(pdev->msix, domid, maskall) )
printk(XENLOG_G_WARNING
"cannot mask IRQ %d: masking MSI-X on Dom%d's %pp\n",
desc->irq, domid, &pdev->sbdf);
- }
}
pdev->msix->host_maskall = maskall;
if ( maskall || pdev->msix->guest_maskall )