From: Markus Armbruster <armbru@redhat.com>
To: Cao jin <caoj.fnst@cn.fujitsu.com>
Cc: qemu-devel@nongnu.org, Marcel Apfelbaum <marcel@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Gerd Hoffmann <kraxel@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v3 2/8] hcd-xhci: check & correct param before using it
Date: Thu, 29 Sep 2016 15:47:56 +0200 [thread overview]
Message-ID: <87bmz695rn.fsf@dusky.pond.sub.org> (raw)
In-Reply-To: <1473839464-8670-3-git-send-email-caoj.fnst@cn.fujitsu.com> (Cao jin's message of "Wed, 14 Sep 2016 15:50:58 +0800")
Cao jin <caoj.fnst@cn.fujitsu.com> writes:
> Param checking/correcting code of xchi->numintrs should be placed before
> it is used.
> Also move some resource-alloc code down, save the strenth to free them
> on msi_init's failure.
>
> CC: Gerd Hoffmann <kraxel@redhat.com>
> CC: Markus Armbruster <armbru@redhat.com>
> CC: Marcel Apfelbaum <marcel@redhat.com>
> CC: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Cao jin <caoj.fnst@cn.fujitsu.com>
> ---
> hw/usb/hcd-xhci.c | 39 +++++++++++++++++++--------------------
> 1 file changed, 19 insertions(+), 20 deletions(-)
>
> diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
> index 188f954..95b1954 100644
> --- a/hw/usb/hcd-xhci.c
> +++ b/hw/usb/hcd-xhci.c
> @@ -3594,25 +3594,6 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
> dev->config[PCI_CACHE_LINE_SIZE] = 0x10;
> dev->config[0x60] = 0x30; /* release number */
>
> - usb_xhci_init(xhci);
> -
> - if (xhci->msi != ON_OFF_AUTO_OFF) {
> - ret = msi_init(dev, 0x70, xhci->numintrs, true, false, &err);
> - /* Any error other than -ENOTSUP(board's MSI support is broken)
> - * is a programming error */
> - assert(!ret || ret == -ENOTSUP);
> - if (ret && xhci->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 || xhci->msi == ON_OFF_AUTO_AUTO);
> - /* With msi=auto, we fall back to MSI off silently */
> - error_free(err);
> - }
> -
Outside this patch's scope, but here goes anyway:
> if (xhci->numintrs > MAXINTRS) {
> xhci->numintrs = MAXINTRS;
> }
while (xhci->numintrs & (xhci->numintrs - 1)) { /* ! power of 2 */
xhci->numintrs++;
}
if (xhci->numintrs < 1) {
xhci->numintrs = 1;
}
if (xhci->numslots > MAXSLOTS) {
xhci->numslots = MAXSLOTS;
}
if (xhci->numslots < 1) {
xhci->numslots = 1;
}
if (xhci_get_flag(xhci, XHCI_FLAG_ENABLE_STREAMS)) {
xhci->max_pstreams_mask = 7; /* == 256 primary streams */
} else {
> @@ -3634,7 +3615,22 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
> xhci->max_pstreams_mask = 0;
> }
If the user specifies invalid intrs, slots or streams properties, his
configuration is silently corrected to a valid one. I hate that.
Invalid configuration should be rejected cleanly.
By the way, calling the property "intrs" differs needlessly from virtio,
which calls it "vectors".
Anyway, nothing wrong with the patch here.
Before this patch, we can have msi_init() choke on invalid
xhci->numintrs before we reach the configuration correction code.
Your patch fixes it.
>
> - xhci->mfwrap_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, xhci_mfwrap_timer, xhci);
> + if (xhci->msi != ON_OFF_AUTO_OFF) {
> + ret = msi_init(dev, 0x70, xhci->numintrs, true, false, &err);
> + /* Any error other than -ENOTSUP(board's MSI support is broken)
> + * is a programming error */
> + assert(!ret || ret == -ENOTSUP);
> + if (ret && xhci->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 || xhci->msi == ON_OFF_AUTO_AUTO);
> + /* With msi=auto, we fall back to MSI off silently */
> + error_free(err);
> + }
>
> memory_region_init(&xhci->mem, OBJECT(xhci), "xhci", LEN_REGS);
> memory_region_init_io(&xhci->mem_cap, OBJECT(xhci), &xhci_cap_ops, xhci,
> @@ -3664,6 +3660,9 @@ static void usb_xhci_realize(struct PCIDevice *dev, Error **errp)
> PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64,
> &xhci->mem);
>
> + usb_xhci_init(xhci);
> + xhci->mfwrap_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, xhci_mfwrap_timer, xhci);
> +
Before your patch, resources allocated by usb_xhci_init() were leaked on
msi_init() failure.
Your patch also delays it and timer_new_ns() until after we can't fail
anymore. That's a good idea unless their work is actually used earlier.
It isn't as far as I can see.
> if (pci_bus_is_express(dev->bus) ||
> xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) {
> ret = pcie_endpoint_cap_init(dev, 0xa0);
I can take this through my tree if Gerd provides at least his Acked-by,
preferably Reviewed-by. Gerd, if you'd rather take it through yours,
let me know. I'll take this series into my tree then, wait for the
patch to make its way through yours, and rebase.
next prev parent reply other threads:[~2016-09-29 13:48 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-14 7:50 [Qemu-devel] [PATCH v3 0/8] Convert msix_init() to error Cao jin
2016-09-14 7:50 ` [Qemu-devel] [PATCH v3 1/8] msix: Follow CODING_STYLE Cao jin
2016-09-14 7:50 ` [Qemu-devel] [PATCH v3 2/8] hcd-xhci: check & correct param before using it Cao jin
2016-09-29 13:47 ` Markus Armbruster [this message]
2016-09-29 15:21 ` Gerd Hoffmann
2016-09-14 7:50 ` [Qemu-devel] [PATCH v3 3/8] pci: Convert msix_init() to Error and fix callers to check it Cao jin
2016-09-29 14:17 ` Markus Armbruster
2016-09-30 5:44 ` Cao jin
2016-09-30 7:01 ` Markus Armbruster
2016-09-30 7:07 ` Cao jin
2016-09-14 7:51 ` [Qemu-devel] [PATCH v3 4/8] megasas: change behaviour of msix switch Cao jin
2016-09-14 7:51 ` [Qemu-devel] [PATCH v3 5/8] hcd-xhci: " Cao jin
2016-09-29 14:32 ` Markus Armbruster
2016-09-29 15:22 ` Gerd Hoffmann
2016-09-14 7:51 ` [Qemu-devel] [PATCH v3 6/8] megasas: remove unnecessary megasas_use_msix() Cao jin
2016-09-29 14:35 ` Markus Armbruster
2016-09-30 6:09 ` Cao jin
2016-09-30 7:01 ` Markus Armbruster
2016-09-14 7:51 ` [Qemu-devel] [PATCH v3 7/8] megasas: undo the overwrites of msi user configuration Cao jin
2016-09-14 7:51 ` [Qemu-devel] [PATCH v3 8/8] vmxnet3: remove unnecessary internal msix state flag Cao jin
2016-09-29 14:42 ` Markus Armbruster
2016-09-30 6:58 ` Cao jin
2016-09-30 13:08 ` Markus Armbruster
2016-10-06 9:39 ` Dmitry Fleytman
2016-10-06 15:43 ` Dr. David Alan Gilbert
2016-10-06 19:33 ` Dmitry Fleytman
2016-10-11 3:35 ` Cao jin
2016-10-11 4:18 ` Dmitry Fleytman
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=87bmz695rn.fsf@dusky.pond.sub.org \
--to=armbru@redhat.com \
--cc=caoj.fnst@cn.fujitsu.com \
--cc=kraxel@redhat.com \
--cc=marcel@redhat.com \
--cc=mst@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.