|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 11/11] drivers/char: allow driving the rest of XHCI by a domain while Xen uses DbC
On 17.08.2022 17:27, Marek Marczykowski-Górecki wrote:
> On Wed, Aug 17, 2022 at 05:08:35PM +0200, Jan Beulich wrote:
>> On 13.08.2022 03:39, Marek Marczykowski-Górecki wrote:
>>> --- a/xen/drivers/char/xhci-dbc.c
>>> +++ b/xen/drivers/char/xhci-dbc.c
>>> @@ -23,6 +23,7 @@
>>> #include <xen/iommu.h>
>>> #include <xen/mm.h>
>>> #include <xen/param.h>
>>> +#include <xen/rangeset.h>
>>> #include <xen/serial.h>
>>> #include <xen/timer.h>
>>> #include <xen/types.h>
>>> @@ -232,6 +233,14 @@ struct dbc_work_ring {
>>> uint64_t dma;
>>> };
>>>
>>> +enum xhci_share {
>>> + XHCI_SHARE_NONE = 0,
>>> +#ifdef CONFIG_XHCI_SHARE
>>> + XHCI_SHARE_HWDOM,
>>> + XHCI_SHARE_ANY
>>> +#endif
>>> +};
>>
>> Hmm, this suggests that Dom0 cannot use the controller without the Kconfig
>> enabled, which I hope is not the case.
>
> It is the case, because you requested reset quirk to be behind
> "experimental" tag in kconfig. This quirk is (currently) necessary even
> if just dom0 uses the controller.
> I'm happy to include the quirk by default, but I got impression you
> wouldn't accept it. And I'd rather avoid marking the whole driver as
> "experimental" (which hides it unless you select UNSUPPORTED) just
> because of a small code necessary to share it with dom0.
Hmm, well, I'm not happy about that quirk (and I did point out how it's
done for EHCI), but I agree we don't want to "hide" the entire drivers,
and I continue to think Dom0 should, by default, be able to use the
device (to the extent possible). So I guess I have no choice but to
accept the use of this quirk by default.
>>> @@ -1128,10 +1181,34 @@ static void __init cf_check
>>> dbc_uart_init_postirq(struct serial_port *port)
>>> init_timer(&uart->timer, dbc_uart_poll, port, 0);
>>> set_timer(&uart->timer, NOW() + MILLISECS(1));
>>>
>>> - if ( pci_ro_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
>>> - printk(XENLOG_WARNING
>>> - "Failed to mark read-only %pp used for XHCI console\n",
>>> - &uart->dbc.sbdf);
>>> + switch ( uart->dbc.share )
>>> + {
>>> + case XHCI_SHARE_NONE:
>>> + if ( pci_ro_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
>>> + printk(XENLOG_WARNING
>>> + "Failed to mark read-only %pp used for XHCI console\n",
>>> + &uart->dbc.sbdf);
>>> + break;
>>> +#ifdef CONFIG_XHCI_SHARE
>>> + case XHCI_SHARE_HWDOM:
>>> + if ( pci_hide_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
>>> + printk(XENLOG_WARNING
>>> + "Failed to hide %pp used for XHCI console\n",
>>> + &uart->dbc.sbdf);
>>> + break;
>>> + case XHCI_SHARE_ANY:
>>> + /* Do not hide. */
>>> + break;
>>> +#endif
>>> + }
>>> +#ifdef CONFIG_X86
>>> + if ( rangeset_add_range(mmio_ro_ranges,
>>> + PFN_DOWN(uart->dbc.xhc_mmio_phys +
>>> uart->dbc.xhc_dbc_offset),
>>> + PFN_UP(uart->dbc.xhc_mmio_phys + uart->dbc.xhc_dbc_offset +
>>> + sizeof(*uart->dbc.dbc_reg)) - 1) )
>>> + printk(XENLOG_INFO
>>> + "Error while adding MMIO range of device to
>>> mmio_ro_ranges\n");
>>> +#endif
>>
>> I did comment on this last part before. There very minimum that I'd expect
>> to appear here is a comment as to the issue with other elements living on
>> the same page which a domain's driver may actually find a need to write to.
>> As said before - as soon as such a report would surface, we'd likely need
>> to add write emulation support for the leading/traling parts of the page(s)
>> that Xen doesn't use itself.
>
> I did included paragraph in the commit message:
> | In any case, to avoid Linux messing with the DbC, mark this MMIO area as
> | read-only. This might cause issues for Linux's driver (if it tries to
> | write something on the same page - like anoter xcap), but makes Xen's
> | use safe. In practice, as of Linux 5.18, it seems to work without
> | issues.
>
> Do you want this as a code comment too?
A shorter form thereof perhaps, but yes, absolutely. Getting at that
information shouldn't require locating the commit.
>>> @@ -1228,6 +1310,41 @@ void __init xhci_dbc_uart_init(void)
>>>
>>> dbc->sbdf = PCI_SBDF(0, bus, slot, func);
>>> }
>>> + opt = e;
>>> +
>>> +#ifdef CONFIG_XHCI_SHARE
>>> + /* other options */
>>> + while ( *opt == ',' )
>>> + {
>>> + opt++;
>>> + e = strchr(opt, ',');
>>> + if ( !e )
>>> + e = strchr(opt, '\0');
>>> +
>>> + if ( !strncmp(opt, "share=", 6) )
>>> + {
>>> + int val = parse_bool(opt + 6, e);
>>> + if ( val == -1 && !cmdline_strcmp(opt + 6, "hwdom") )
>>
>> Nit: Blank line please between declaration(s) and statement(s).
>>
>> Any reason you're using parse_bool() and not parse_boolean() here?
>> That would save you the open-coded strncmp() afaict.
>
> I can probably use parse_boolean() too, but then handling "hwdom"
> variant would be a bit weird. I could skip 'share=hwdom' parsing at all,
> since that's default if the kconfig option is enabled, but I'm not sure
> if that's a good idea.
May I suggest that you take a look at xen/arch/x86/spec-ctrl.c's uses
of parse_boolean()? Maybe you consider some of those "weird" as well,
but it's not like these have been around forever and are now deemed
"bad".
>> Finally a remark seeing the opt_dbgp use here and the identically
>> named option in ehci-dbgp.c, taken together with your multiple-
>> serial-consoles patch: Since the two option consumers are now
>> different, they can't sensibly coexist anymore. There were issues
>> already before - it doesn't seem to be possible this way to run
>> EHCI and XHCI based consoles in parallel. (An exceptional case
>> would be if <integer> for both was intended to be same number.)
>> IOW I think one of the options needs renaming; it was a mistake of
>> mine to not have pointed this out before committing patch 1.
>> Following the name of the source file as well as e.g. the title
>> here - maybe "dbc="?
>
> Yes, I can rename the option here. That requires also registering new
> SERHND_* and inventing new value for console= parameter (implemented in
> serial_parse_handle()). "dbc" there too?
Probably best to be halfway consistent with the naming, yes.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |