>>> On 14.09.17 at 12:42, <roger....@citrix.com> wrote:
> On Thu, Sep 14, 2017 at 04:19:44AM -0600, Jan Beulich wrote:
>> >>> On 14.09.17 at 12:08, <roger....@citrix.com> wrote:
>> > On Thu, Sep 07, 2017 at 09:29:41AM -0600, Jan Beulich wrote:
>> >> >>> On 14.08.17 at 16:28, <roger....@citrix.com> wrote:
>> >> > +int vpci_msi_arch_enable(struct vpci_arch_msi *arch, struct pci_dev 
> *pdev,
>> >> > +                         uint64_t address, uint32_t data, unsigned int 
> vectors)
>> >> > +{
>> >> > +    struct msi_info msi_info = {
>> >> > +        .seg = pdev->seg,
>> >> > +        .bus = pdev->bus,
>> >> > +        .devfn = pdev->devfn,
>> >> > +        .entry_nr = vectors,
>> >> > +    };
>> >> > +    unsigned int i;
>> >> > +    int rc;
>> >> > +
>> >> > +    ASSERT(arch->pirq == INVALID_PIRQ);
>> >> > +
>> >> > +    /* Get a PIRQ. */
>> >> > +    rc = allocate_and_map_msi_pirq(pdev->domain, -1, &arch->pirq,
>> >> > +                                   MAP_PIRQ_TYPE_MULTI_MSI, &msi_info);
>> >> > +    if ( rc )
>> >> > +    {
>> >> > +        gdprintk(XENLOG_ERR, "%04x:%02x:%02x.%u: failed to map PIRQ: 
> %d\n",
>> >> > +                 pdev->seg, pdev->bus, PCI_SLOT(pdev->devfn),
>> >> > +                 PCI_FUNC(pdev->devfn), rc);
>> >> > +        return rc;
>> >> > +    }
>> >> > +
>> >> > +    for ( i = 0; i < vectors; i++ )
>> >> > +    {
>> >> > +        xen_domctl_bind_pt_irq_t bind = {
>> >> > +            .machine_irq = arch->pirq + i,
>> >> > +            .irq_type = PT_IRQ_TYPE_MSI,
>> >> > +            .u.msi.gvec = msi_vector(data) + i,
>> >> 
>> >> Isn't that rather msi_vector(data + i), i.e. wouldn't you better
>> >> increment data together with i?
>> > 
>> > That's true, because the vector is fetched from the last 8bits of the
>> > data, but I find it more confusing (and it requires that the reader
>> > knows this detail). IMHO I would prefer to leave it as-is.
>> 
>> No, the problem is the wrap-around case, which your code
>> doesn't handle. Iirc hardware behaves along the lines of what
>> I've suggested to change to, with potentially the vector
>> increment carrying into other parts of the value. Hence you
>> either need an early check for there not being any wrapping,
>> or other places may need similar adjustment (in which case it
>> might be better to really just increment "data" once in the
>> loop.
> 
> Oh, so the vector increment carries over to the delivery mode, then I
> will switch it.

But please double check first that I'm not mis-remembering.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

Reply via email to