On Tue, Jan 21, 2020 at 10:25:47AM +0100, Vitaly Kuznetsov wrote: [...] > > > > +#if IS_ENABLED(CONFIG_PCI_HYPERV) > > +#define hv_set_msi_address_from_desc(msi_entry, msi_desc) \ > > +do { \ > > + (msi_entry)->address = (msi_desc)->msg.address_lo; \ > > +} while (0) > > + > > +#endif /* CONFIG_PCI_HYPERV */ > > It seems to be pointless to put defines under #if IS_ENABLED(): in case > it is not enabled and used you'll get a compilation error, in case it is > enabled and not used no code is going to be generated anyways. > OK I will remove the #if IS_ENABLED() in the next version. > > + > > #else /* CONFIG_HYPERV */ > > static inline void hyperv_init(void) {} > > static inline void hyperv_setup_mmu_ops(void) {} > > diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c > > index aacfcc90d929..2240f2b3643e 100644 > > --- a/drivers/pci/controller/pci-hyperv.c > > +++ b/drivers/pci/controller/pci-hyperv.c > > @@ -406,36 +406,6 @@ struct pci_eject_response { > > > > static int pci_ring_size = (4 * PAGE_SIZE); > > > > -struct hv_interrupt_entry { > > - u32 source; /* 1 for MSI(-X) */ > > - u32 reserved1; > > - u32 address; > > - u32 data; > > -}; > > - > > -/* > > - * flags for hv_device_interrupt_target.flags > > - */ > > -#define HV_DEVICE_INTERRUPT_TARGET_MULTICAST 1 > > -#define HV_DEVICE_INTERRUPT_TARGET_PROCESSOR_SET 2 > > - > > -struct hv_device_interrupt_target { > > - u32 vector; > > - u32 flags; > > - union { > > - u64 vp_mask; > > - struct hv_vpset vp_set; > > - }; > > -}; > > - > > -struct retarget_msi_interrupt { > > - u64 partition_id; /* use "self" */ > > - u64 device_id; > > - struct hv_interrupt_entry int_entry; > > - u64 reserved2; > > - struct hv_device_interrupt_target int_target; > > -} __packed __aligned(8); > > - > > /* > > * Driver specific state. > > */ > > @@ -482,7 +452,7 @@ struct hv_pcibus_device { > > struct workqueue_struct *wq; > > > > /* hypercall arg, must not cross page boundary */ > > - struct retarget_msi_interrupt retarget_msi_interrupt_params; > > + struct hv_retarget_device_interrupt retarget_msi_interrupt_params; > > > > /* > > * Don't put anything here: retarget_msi_interrupt_params must be last > > @@ -1178,7 +1148,7 @@ static void hv_irq_unmask(struct irq_data *data) > > { > > struct msi_desc *msi_desc = irq_data_get_msi_desc(data); > > struct irq_cfg *cfg = irqd_cfg(data); > > - struct retarget_msi_interrupt *params; > > + struct hv_retarget_device_interrupt *params; > > struct hv_pcibus_device *hbus; > > struct cpumask *dest; > > cpumask_var_t tmp; > > @@ -1200,8 +1170,8 @@ static void hv_irq_unmask(struct irq_data *data) > > memset(params, 0, sizeof(*params)); > > params->partition_id = HV_PARTITION_ID_SELF; > > params->int_entry.source = 1; /* MSI(-X) */ > > - params->int_entry.address = msi_desc->msg.address_lo; > > - params->int_entry.data = msi_desc->msg.data; > > + hv_set_msi_address_from_desc(¶ms->int_entry.msi_entry, msi_desc); > > I don't quite see why this hv_set_msi_address_from_desc() is needed at > all. > I will add some description in the next version, the reason that hv_set_msi_address_from_desc() is arm64 and x86 have different hv_interrupt_entry formats. So a generic interface is needed so that archs can have different ways to set ->address field from msi_desc. Regards, Boqun > > + params->int_entry.msi_entry.data = msi_desc->msg.data; > > params->device_id = (hbus->hdev->dev_instance.b[5] << 24) | > > (hbus->hdev->dev_instance.b[4] << 16) | > > (hbus->hdev->dev_instance.b[7] << 8) | > > -- > Vitaly >