[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v8 4/7] VT-d: Use one function to update both remapped and posted IRTE
> -----Original Message----- > From: Tian, Kevin > Sent: Friday, November 18, 2016 12:31 PM > To: Wu, Feng <feng.wu@xxxxxxxxx>; xen-devel@xxxxxxxxxxxxx > Cc: jbeulich@xxxxxxxx; andrew.cooper3@xxxxxxxxxx; > george.dunlap@xxxxxxxxxxxxx; dario.faggioli@xxxxxxxxxx > Subject: RE: [PATCH v8 4/7] VT-d: Use one function to update both remapped > and posted IRTE > > > From: Wu, Feng > > Sent: Friday, November 18, 2016 9:57 AM > > > > Use one function to update both remapped IRTE and posted IRET. > > > > Signed-off-by: Feng Wu <feng.wu@xxxxxxxxx> > > --- > > v8: > > - Newly added > > > > xen/drivers/passthrough/vtd/intremap.c | 162 > > ++++++++++++++----------------- > -- > > 1 file changed, 66 insertions(+), 96 deletions(-) > > > > diff --git a/xen/drivers/passthrough/vtd/intremap.c > > b/xen/drivers/passthrough/vtd/intremap.c > > index bfd468b..fd2a49a 100644 > > --- a/xen/drivers/passthrough/vtd/intremap.c > > +++ b/xen/drivers/passthrough/vtd/intremap.c > > @@ -420,7 +420,7 @@ void io_apic_write_remap_rte( > > __ioapic_write_entry(apic, ioapic_pin, 1, old_rte); > > } > > > > -static void set_msi_source_id(struct pci_dev *pdev, struct iremap_entry > > *ire) > > +static void set_msi_source_id(const struct pci_dev *pdev, struct > iremap_entry *ire) > > { > > u16 seg; > > u8 bus, devfn, secbus; > > @@ -548,11 +548,12 @@ static int remap_entry_to_msi_msg( > > } > > > > static int msi_msg_to_remap_entry( > > - struct iommu *iommu, struct pci_dev *pdev, > > - struct msi_desc *msi_desc, struct msi_msg *msg) > > + struct iommu *iommu, const struct pci_dev *pdev, > > + struct msi_desc *msi_desc, struct msi_msg *msg, > > + const struct pi_desc *pi_desc, const uint8_t gvec) > > { > > struct iremap_entry *iremap_entry = NULL, *iremap_entries; > > - struct iremap_entry new_ire; > > + struct iremap_entry new_ire, old_ire; > > old_ire is used only in later 'else' branch. move definition there. > > > struct msi_msg_remap_entry *remap_rte; > > unsigned int index, i, nr = 1; > > unsigned long flags; > > @@ -597,31 +598,50 @@ static int msi_msg_to_remap_entry( > > > > memcpy(&new_ire, iremap_entry, sizeof(struct iremap_entry)); > > > > - /* Set interrupt remapping table entry */ > > - new_ire.remap.fpd = 0; > > - new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) > & 0x1; > > - new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; > > - new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) & > 0x1; > > - /* Hardware require RH = 1 for LPR delivery mode */ > > - new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio); > > - new_ire.remap.avail = 0; > > - new_ire.remap.res_1 = 0; > > - new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) & > > - MSI_DATA_VECTOR_MASK; > > - new_ire.remap.res_2 = 0; > > - if ( x2apic_enabled ) > > - new_ire.remap.dst = msg->dest32; > > + if ( !pi_desc ) > > + { > > + /* Set interrupt remapping table entry */ > > + new_ire.remap.fpd = 0; > > + new_ire.remap.dm = (msg->address_lo >> MSI_ADDR_DESTMODE_SHIFT) > & > > 0x1; > > + new_ire.remap.tm = (msg->data >> MSI_DATA_TRIGGER_SHIFT) & 0x1; > > + new_ire.remap.dlm = (msg->data >> MSI_DATA_DELIVERY_MODE_SHIFT) > & > > 0x1; > > + /* Hardware require RH = 1 for LPR delivery mode */ > > + new_ire.remap.rh = (new_ire.remap.dlm == dest_LowestPrio); > > + new_ire.remap.avail = 0; > > + new_ire.remap.res_1 = 0; > > + new_ire.remap.vector = (msg->data >> MSI_DATA_VECTOR_SHIFT) & > > + MSI_DATA_VECTOR_MASK; > > + new_ire.remap.res_2 = 0; > > + if ( x2apic_enabled ) > > + new_ire.remap.dst = msg->dest32; > > + else > > + new_ire.remap.dst = ((msg->address_lo >> > > MSI_ADDR_DEST_ID_SHIFT) > > + & 0xff) << 8; > > + > > + new_ire.remap.res_3 = 0; > > + new_ire.remap.res_4 = 0; > > + new_ire.remap.p = 1; /* finally, set present bit */ > > + } > > else > > - new_ire.remap.dst = ((msg->address_lo >> MSI_ADDR_DEST_ID_SHIFT) > > - & 0xff) << 8; > > + { > > + new_ire.post.fpd = 0; > > + new_ire.post.res_1 = 0; > > + new_ire.post.res_2 = 0; > > + new_ire.post.urg = 0; > > + new_ire.post.im = 1; > > + new_ire.post.vector = gvec; > > + new_ire.post.res_3 = 0; > > + new_ire.post.res_4 = 0; > > + new_ire.post.res_5 = 0; > > + new_ire.post.pda_l = virt_to_maddr(pi_desc) >> (32 - PDA_LOW_BIT); > > + new_ire.post.pda_h = virt_to_maddr(pi_desc) >> 32; > > + new_ire.post.p = 1; /* finally, set present bit */ > > + } > > It's a little confusing here: > > - you first copy current remapping entry to new_ire and then do some > initialization. > Is it necessary? If there are some fields we'd like to inherit, better to > describe > them > in comment so others can have a clear understanding of what exactly fields > must > be updated here; This is needed, please refer to my replay to [5/7]. > > - in original code of setup_posted_irte, you actually do conditional > assignment > based on format of old_ire. Above you changed to non-conditional assignment, > not relying on old_ire. Is it desired? In setup_posted_irte() we need to inherit the common fields (fpd, sid, sq, svt) from the old IRTE. But now this common fields are setup by set_msi_source_id() in this function. Thanks, Feng _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |