kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org, "Hanna Reitz" <hreitz@redhat.com>,
	"Stefano Stabellini" <sstabellini@kernel.org>,
	"Anthony Perard" <anthony.perard@citrix.com>,
	"Paul Durrant" <paul@xen.org>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Richard Henderson" <richard.henderson@linaro.org>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Marcelo Tosatti" <mtosatti@redhat.com>,
	qemu-block@nongnu.org, xen-devel@lists.xenproject.org,
	kvm@vger.kernel.org
Subject: Re: [PATCH 11/12] hw/xen: automatically assign device index to block devices
Date: Fri, 20 Oct 2023 18:47:54 +0100	[thread overview]
Message-ID: <c9431ff971a464e96cff061eb5d62b9865f2ec9b.camel@infradead.org> (raw)
In-Reply-To: <950f3a62dfcecce902037f95575f1013697a5925.camel@infradead.org>

[-- Attachment #1: Type: text/plain, Size: 4044 bytes --]

On Wed, 2023-10-18 at 11:52 +0100, David Woodhouse wrote:
> 
> And xen_config_dev_nic() probably just needs to loop doing the same
> as
> I did in pc_init_nic() in
> https://lore.kernel.org/qemu-devel/20231017182545.97973-5-dwmw2@infradead.org/T/#u
> 
> +        if (xen_bus && (!nd->model || g_str_equal(model, "xen-net-
> device"))) {
> +            DeviceState *dev = qdev_new("xen-net-device");
> +            qdev_set_nic_properties(dev, nd);
> +            qdev_realize_and_unref(dev, xen_bus, &error_fatal);
> 
> 
> ... but this just reinforces what I said there about "if
> qmp_device_add() can find the damn bus and do this right, why do we
> have to litter it through platform code?"

I had a look through the network setup.

There are a bunch of platforms adding specific devices to their own
internal system bus, which often use nd_table[] directly. Sometimes
they do so whether it's been set up or now.

They can mostly be divided into two camps. Some of them will create
their NIC anyway, and will use a matching -nic configuration if it
exists. Others will only create their NIC if a corresponding -nic
configuration does exist.

This is fairly random, and perhaps platforms should be more consistent,
but it's best to avoid user-visible changes as much as possible while
doing the cleanup, so I've kept them as they were.

I've created qemu_configure_nic_device() and qemu_create_nic_device()
functions for those two use cases respectively, and most code which
directly accesses nd_table[] can be converted to those fairly simply:
https://git.infradead.org/users/dwmw2/qemu.git/commitdiff/7b4fb6fc10a4

It means I can throw away the horrid parts of -nic support for the Xen
network device, which were in the pc and xenfv platforms, and replace
it with a trivial loop in xenbus_init():

+    /* This is a bus-generic "configure all NICs on this bus type" */
+    while ((qnic = qemu_create_nic_device("xen-net-device", true, "xen"))) {
+            qdev_realize_and_unref(qnic, bus, &error_fatal);

Other than that one (which is cheating because there's only one type of
network device that can be instantiated on the XenBus), the only
remaining case is PCI. Most platforms just iterate over the -nic
configurations adding devices to a PCI bus of the platform's choice.
In some cases there's a special case, the first one goes at a specific
devfn and/or on a different bus.

There was a little more variation here... for example fuloong2e would
put the first nic (nd_table[0]) in slot 7 only if it's an rtl8139 (if
the model is unspecified). But PReP would put the first PCI NIC in slot
3 *regardless* of whether it's the expected PCNET or not.

I didn't faithfully preserve the behaviour there, because I don't think
it matters. They mostly look like this now (e.g. hw/sh4/r2d):

+    nd = qemu_find_nic_info(mc->default_nic, true, NULL);
+    if (nd) {
+        pci_nic_init_nofail(nd, pci_bus, mc->default_nic, "2");
+    }
+    pci_init_nic_devices(pci_bus, mc->default_nic);

So they'll take the first NIC configuration which is of the expected
model (again, or unspecified model) and place that in the special slot,
and then put the rest of the devices wherever they land.

For the change in behaviour to *matter*, the user would have to
explicitly specify a NIC of the *non-default* type first, and then a
NIC of the default type. My new code will put the default-type NIC in
the "right place", while the old code mostly wouldn't. I think that's
an OK change to make.

My plan is to *remember* which NIC models are used for lookups during
the board in, so that qemu_show_nic_devices() can print them all at the
end.

Current WIP if anyone wants to take a quick look at
https://git.infradead.org/users/dwmw2/qemu.git/shortlog/refs/heads/xenfv-net
but the weekend arrived quicker than I'd hoped, so I haven't quite got
it into shape to post yet. Hopefully it makes sense as an approach
though?



[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 5965 bytes --]

  parent reply	other threads:[~2023-10-20 17:48 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-16 15:18 [PATCH 0/12] Get Xen PV shim running in qemu David Woodhouse
2023-10-16 15:18 ` [PATCH 01/12] i386/xen: fix per-vCPU upcall vector for Xen emulation David Woodhouse
2023-10-24 12:16   ` Paul Durrant
2023-10-24 12:58     ` David Woodhouse
2023-10-16 15:18 ` [PATCH 02/12] hw/xen: select kernel mode for per-vCPU event channel upcall vector David Woodhouse
2023-10-24 12:29   ` Paul Durrant
2023-10-24 13:20     ` David Woodhouse
2023-10-16 15:19 ` [PATCH 03/12] include: update Xen public headers to Xen 4.17.2 release David Woodhouse
2023-10-24 12:30   ` Paul Durrant
2023-10-16 15:19 ` [PATCH 04/12] i386/xen: advertise XEN_HVM_CPUID_UPCALL_VECTOR in CPUID David Woodhouse
2023-10-24 12:32   ` Paul Durrant
2023-10-16 15:19 ` [PATCH 05/12] hw/xen: populate store frontend nodes with XenStore PFN/port David Woodhouse
2023-10-24 12:35   ` Paul Durrant
2023-10-24 12:53     ` David Woodhouse
2023-10-16 15:19 ` [PATCH 06/12] hw/xen: add get_frontend_path() method to XenDeviceClass David Woodhouse
2023-10-24 12:42   ` Paul Durrant
2023-10-24 12:56     ` David Woodhouse
2023-10-24 12:59       ` Paul Durrant
2023-10-24 13:29         ` David Woodhouse
2023-10-24 13:37           ` Paul Durrant
2023-10-25  8:30             ` David Woodhouse
2023-11-21 12:25           ` David Woodhouse
2023-10-16 15:19 ` [PATCH 07/12] hw/xen: update Xen console to XenDevice model David Woodhouse
2023-10-24 13:07   ` Paul Durrant
2023-10-16 15:19 ` [PATCH 08/12] hw/xen: do not repeatedly try to create a failing backend device David Woodhouse
2023-10-24 13:19   ` Paul Durrant
2023-10-16 15:19 ` [PATCH 09/12] hw/xen: prevent duplicate device registrations David Woodhouse
2023-10-24 14:10   ` Paul Durrant
2023-10-24 14:38     ` David Woodhouse
2023-10-16 15:19 ` [PATCH 10/12] hw/xen: automatically assign device index to console devices David Woodhouse
2023-10-16 15:19 ` [PATCH 11/12] hw/xen: automatically assign device index to block devices David Woodhouse
2023-10-17 10:21   ` Kevin Wolf
2023-10-17 18:02     ` David Woodhouse
2023-10-18  7:32   ` Igor Mammedov
2023-10-18  8:32     ` David Woodhouse
2023-10-23  9:30       ` Igor Mammedov
2023-10-23  9:42         ` David Woodhouse
2023-10-23 13:45         ` Kevin Wolf
2023-10-18  8:52   ` Kevin Wolf
2023-10-18 10:52     ` David Woodhouse
2023-10-19 11:21       ` Kevin Wolf
2023-10-20 17:47       ` David Woodhouse [this message]
2023-10-18 23:13     ` David Woodhouse
2023-10-16 15:19 ` [PATCH 12/12] hw/xen: add support for Xen primary console in emulated mode David Woodhouse
2023-10-24 14:20   ` Paul Durrant
2023-10-24 15:37     ` David Woodhouse
2023-10-24 15:39       ` Paul Durrant
2023-10-24 15:49         ` David Woodhouse
2023-10-24 16:25           ` Paul Durrant
2023-10-24 16:34             ` David Woodhouse
2023-10-25  8:31               ` Paul Durrant
2023-10-25  9:00                 ` David Woodhouse
2023-10-25 10:44                   ` Paul Durrant
2023-10-24 15:24 ` [PATCH 0/12] Get Xen PV shim running in qemu Alex Bennée
2023-10-24 16:11   ` David Woodhouse

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=c9431ff971a464e96cff061eb5d62b9865f2ec9b.camel@infradead.org \
    --to=dwmw2@infradead.org \
    --cc=anthony.perard@citrix.com \
    --cc=eduardo@habkost.net \
    --cc=hreitz@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=kwolf@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=mtosatti@redhat.com \
    --cc=paul@xen.org \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xenproject.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).