qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Cao jin <caoj.fnst@cn.fujitsu.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
	Jason Wang <jasowang@redhat.com>,
	Marcel Apfelbaum <marcel@redhat.com>,
	Alex Williamson <alex.williamson@redhat.com>,
	Hannes Reinecke <hare@suse.de>,
	Dmitry Fleytman <dmitry@daynix.com>,
	Paolo Bonzini <pbonzini@redhat.com>, John Snow <jsnow@redhat.com>,
	Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v6 11/11] pci: Convert msi_init() to Error and fix callers to check it
Date: Fri, 3 Jun 2016 16:28:34 +0800	[thread overview]
Message-ID: <57513FB2.2020708@cn.fujitsu.com> (raw)
In-Reply-To: <87inxtulso.fsf@dusky.pond.sub.org>

Hi Markus,

Thanks very much for your thorough review for the whole series, really 
really impressed:)

On 06/01/2016 08:37 PM, Markus Armbruster wrote:
> Cao jin <caoj.fnst@cn.fujitsu.com> writes:
>
>> msi_init() reports errors with error_report(), which is wrong
>> when it's used in realize().
>
> msix_init() has the same problem.  Perhaps you can tackle it later.
>

Sure, I will take care of it after this one has passed the review.

>> +            error_propagate(errp, err);
>> +            return;
>> +        } else if (err && d->msi == ON_OFF_AUTO_AUTO) {
>> +            /* If user doesn`t set it on, switch to non-msi variant silently */
>> +            error_free(err);
>> +        }
>
> The conditional is superfluous.
>
> We call msi_init() only if d->msi != ON_OFF_AUTO_OFF.  If it sets @err
> and d->msi == ON_OFF_AUTO_ON, we don't get here.  Therefore, err implies
> d->msi == ON_OFF_AUTO_AUTO, and the conditional can be simplified to
>
>             } else if (err) {
>                 error_free(err);
>             }
>
> But protecting error_free() like that is pointless, as it does nothing
> when err is null.  Simplify further to
>
>             }
>             assert(!err || d->msi == ON_OFF_AUTO_AUTO);
>             /* With msi=auto, we fall back to MSI off silently */
>             error_free(err);
>
> The assertion is more for aiding the reader than for catching mistakes.
>

It take me a little while to understand the following tightened error 
checking:)

> The error checking could be tightened as follows:
>
>             ret = msi_init(&d->pci, d->old_msi_addr ? 0x50 : 0x60,
>                            1, true, false, &err);
>             assert(!ret || ret == -ENOTSUP);

I guess you are assuming msi_init return 0 on success(all the following 
example code are), and actually it is the behaviour of msix_init, you 
mentioned the difference between them before. So I think it should be

         assert(ret < 0 || ret == -ENOTSUP);

Right?
And I think it is better to add a comments on it, for newbie 
understanding, like this:

/* -EINVAL means capability overlap, which is programming error for this 
device, so, assert it */

Is the comment ok?

And I will add a new patch in this series to make msi_init return 0 on 
success, and -error on failure, make it consistent with msix_init, so 
your example code will apply.

>             if (ret && d->msi == ON_OFF_AUTO_ON) {
>                 /* Can't satisfy user's explicit msi=on request, fail */
>                 error_append_hint(&err, "You have to use msi=auto (default)"
>                                   " or msi=off with this machine type.\n");
>                 error_propagate(errp, err);
>                 return;
>             }
>             assert(!err || d->msi == ON_OFF_AUTO_AUTO);
>             /* With msi=auto, we fall back to MSI off silently */
>             error_free(err);
>
>> +    }
>> +

>>
>> @@ -111,6 +111,16 @@ static void pci_ich9_ahci_realize(PCIDevice *dev, Error **errp)
>>       int sata_cap_offset;
>>       uint8_t *sata_cap;
>>       d = ICH_AHCI(dev);
>> +    Error *err = NULL;
>> +
>> +    /* Although the AHCI 1.3 specification states that the first capability
>> +     * should be PMCAP, the Intel ICH9 data sheet specifies that the ICH9
>> +     * AHCI device puts the MSI capability first, pointing to 0x80. */
>> +    msi_init(dev, ICH9_MSI_CAP_OFFSET, 1, true, false, &err);
>> +    if (err) {
>> +        /* Fall back to INTx silently */
>> +        error_free(err);
>> +    }
>
> Tighter error checking:
>
>         ret = msi_init(dev, ICH9_MSI_CAP_OFFSET, 1, true, false, NULL);
>         /* Fall back to INTx silently on -ENOTSUP */
>         assert(!ret || ret == -ENOTSUP);
>
> More concise, too.  No need for the include "qapi/error.h" then.
>

Learned, and /assert/ is for -EINVAL, so I will add a comment as I 
mentioned above for easy understanding, So will I do for all the 
following example code:)

>
>> +    if (!vmxnet3_init_msix(s)) {
>> +        VMW_WRPRN("Failed to initialize MSI-X, configuration is inconsistent.");
>
> It doesn't replace it here, but that's appropriate, because it doesn't
> touch MSI-X code, it only moves it.
>

will replace it when tackle msix_init

>> diff --git a/hw/pci-bridge/pci_bridge_dev.c b/hw/pci-bridge/pci_bridge_dev.c
>> index fa0c50c..7f9131f 100644
>> --- a/hw/pci-bridge/pci_bridge_dev.c
>> +++ b/hw/pci-bridge/pci_bridge_dev.c
>> @@ -54,6 +54,7 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
>>       PCIBridge *br = PCI_BRIDGE(dev);
>>       PCIBridgeDev *bridge_dev = PCI_BRIDGE_DEV(dev);
>>       int err;
>> +    Error *local_err = NULL;
>>
>>       pci_bridge_initfn(dev, TYPE_PCI_BUS);
>>
>> @@ -75,12 +76,18 @@ static int pci_bridge_dev_initfn(PCIDevice *dev)
>>           goto slotid_error;
>>       }
>>
>> -    if ((bridge_dev->msi == ON_OFF_AUTO_AUTO ||
>> -                bridge_dev->msi == ON_OFF_AUTO_ON) &&
>> -        msi_nonbroken) {
>> -        err = msi_init(dev, 0, 1, true, true);
>> -        if (err < 0) {
>> +    if (bridge_dev->msi != ON_OFF_AUTO_OFF) {
>
> Unnecessary churn, please use != ON_OFF_AUTO_OFF in PATCH 10.
>
>> +        /* it means SHPC exists */
>
> Does it?  Why?
>

The comments says: /* MSI is not applicable without SHPC */. And also 
before the patch, we can see there are only following combination available:
     [shpc: on, msi:on] [shpc: on, msi:off] [shpc: off, msi: off]

But there is no:
     [shpc: off, msi: on]

So if msi != OFF, it implies shcp is on, right?

>
>> diff --git a/hw/scsi/vmw_pvscsi.c b/hw/scsi/vmw_pvscsi.c
>> index c2a387a..b040575 100644
>> --- a/hw/scsi/vmw_pvscsi.c
>> +++ b/hw/scsi/vmw_pvscsi.c
>> @@ -1044,12 +1044,16 @@ static void
>>   pvscsi_init_msi(PVSCSIState *s)
>>   {
>>       int res;
>> +    Error *err = NULL;
>>       PCIDevice *d = PCI_DEVICE(s);
>>
>>       res = msi_init(d, PVSCSI_MSI_OFFSET(s), PVSCSI_MSIX_NUM_VECTORS,
>> -                   PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK);
>> +                   PVSCSI_USE_64BIT, PVSCSI_PER_VECTOR_MASK, &err);
>>       if (res < 0) {
>>           trace_pvscsi_init_msi_fail(res);
>> +        error_append_hint(&err, "MSI capability fail to init,"
>> +                " will use INTx intead\n");
>> +        error_report_err(err);
>>           s->msi_used = false;
>>       } else {
>>           s->msi_used = true;
>
> This is MSI device pattern #5: on whenever possible, else off, but
> report an error when falling back to off.
>
> Before your patch, this is pattern #2.  Why do you add error reporting
> here?  You don't in other instances of pattern #2.
>

I dunno...maybe just flash into my mind randomly:-[ will get rid of it

-- 
Yours Sincerely,

Cao jin

  reply	other threads:[~2016-06-03  8:23 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-24  4:04 [Qemu-devel] [PATCH v6 00/11] Add param Error ** for msi_init() Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 01/11] pci core: assert ENOSPC when add capability Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 02/11] fix some coding style problems Cao jin
2016-06-01  8:09   ` Markus Armbruster
2016-06-01  8:33     ` Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 03/11] change pvscsi_init_msi() type to void Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 04/11] megasas: Fix Cao jin
2016-06-01  8:10   ` Markus Armbruster
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 05/11] mptsas: change .realize function name Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 06/11] usb xhci: change msi/msix property type Cao jin
2016-06-01  8:25   ` Markus Armbruster
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 07/11] intel-hda: change msi " Cao jin
2016-06-01  8:39   ` Markus Armbruster
2016-06-02  8:42     ` Cao jin
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 08/11] mptsas: " Cao jin
2016-06-01  8:43   ` Markus Armbruster
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 09/11] megasas: change msi/msix " Cao jin
2016-06-01  9:14   ` Markus Armbruster
2016-06-02 10:15     ` Cao jin
2016-06-02 13:59       ` Markus Armbruster
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 10/11] pci bridge dev: change msi " Cao jin
2016-06-01  9:17   ` Markus Armbruster
2016-05-24  4:04 ` [Qemu-devel] [PATCH v6 11/11] pci: Convert msi_init() to Error and fix callers to check it Cao jin
2016-06-01 12:37   ` Markus Armbruster
2016-06-03  8:28     ` Cao jin [this message]
2016-06-03 11:30       ` Markus Armbruster
2016-06-01  3:06 ` [Qemu-devel] [PATCH v6 00/11] Add param Error ** for msi_init() Cao jin
2016-06-01  6:59 ` Cao jin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=57513FB2.2020708@cn.fujitsu.com \
    --to=caoj.fnst@cn.fujitsu.com \
    --cc=alex.williamson@redhat.com \
    --cc=armbru@redhat.com \
    --cc=dmitry@daynix.com \
    --cc=hare@suse.de \
    --cc=jasowang@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kraxel@redhat.com \
    --cc=marcel@redhat.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).