[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] xen vtd : set msi guest_masked 0 by default



On Mon, May 21, 2018 at 12:46:19PM +0100, David Woodhouse wrote:
> On Tue, 2016-01-26 at 09:34 +0800, Jianzhong,Chang wrote:
> > There are some problems when msi guest_masked is set to 1 by default.
> > When guest os is windows 2008 r2 server,
> > the device(eg X540-AT2 vf) is not initialized correctly.
> > Host will always receive message like this :"VF Reset msg received from vf".
> > Guest has network connectivity issues,
> > and can not correctly receive/send the packet.
> 
> In other words "the guest doesn't get any interrupts from the NIC".
> 
> > So, guest_masked is set to 0 by default.
> 
> This seems consistent with the PCI spec, which says that "After reset,
> the state of all implemented Mask and Pending bits is 0 (no vectors are
> masked and no messages are pending)."
> 
> That's what we *used* to have in Xen, before these commits changed it
> to assume that IRQs were guest-masked by default:
> 
> https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=ad28e42bd1d28d746988ed71654e8aa670629753
> https://xenbits.xen.org/gitweb/?p=xen.git;a=commitdiff;h=84d6add5593d865736831d150da7c38588f669f6
> 
> > --- a/xen/arch/x86/msi.c
> > +++ b/xen/arch/x86/msi.c
> > @@ -512,7 +512,7 @@ void guest_mask_msi_irq(struct irq_desc *desc, bool_t 
> > mask)
> >  
> >  static unsigned int startup_msi_irq(struct irq_desc *desc)
> >  {
> > -    if ( unlikely(!msi_set_mask_bit(desc, 0, !!(desc->status & 
> > IRQ_GUEST))) )
> > +    if ( unlikely(!msi_set_mask_bit(desc, 0, 0) ))
> >          WARN();
> >      return 0;
> >  }
> 
> In testing, this part actually seems to make the difference in
> practice. Interrupts now work, and Windows guests have connectivity
> again.
> 
> > @@ -972,7 +972,7 @@ static int msix_capability_init(struct pci_dev *dev,
> >          entry->msi_attrib.entry_nr = msi->entry_nr;
> >          entry->msi_attrib.maskbit = 1;
> >          entry->msi_attrib.host_masked = 1;
> > -        entry->msi_attrib.guest_masked = 1;
> > +        entry->msi_attrib.guest_masked = 0;
> >          entry->msi_attrib.pos = pos;
> >          entry->irq = msi->irq;
> >          entry->dev = dev;
> 
> That also seems correct though, since it reflects the actual state we
> intend to emulate.

Hm, I think I might have fixed this issue, see:

https://git.qemu.org/?p=qemu.git;a=commit;h=a8036336609d2e184fc3543a4c439c0ba7d7f3a2

And the Xen side:

http://xenbits.xen.org/gitweb/?p=xen.git;a=commit;h=69d99d1b223fc5082400374698ddd7486e5ea953

The original report of the issue is at:

https://lists.xenproject.org/archives/html/xen-devel/2017-07/msg00915.html

Roger.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.