[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] drivers/char: Use sub-page ro API to make just xhci dbc cap RO
On Wed, Mar 29, 2023 at 11:14:52AM +0200, Jan Beulich wrote: > On 27.03.2023 12:09, Marek Marczykowski-Górecki wrote: > > ... not the whole page, which may contain other registers too. In fact > > on Tiger Lake and newer (at least), this page do contain other registers > > that Linux tries to use. And with share=yes, a domU would use them too. > > Without this patch, PV dom0 would fail to initialize the controller, > > while HVM would be killed on EPT violation. > > > > Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > > --- > > xen/drivers/char/xhci-dbc.c | 38 ++++++++++++++++++++++++++++++++++++-- > > 1 file changed, 36 insertions(+), 2 deletions(-) > > > > diff --git a/xen/drivers/char/xhci-dbc.c b/xen/drivers/char/xhci-dbc.c > > index 60b781f87202..df2524b0ca18 100644 > > --- a/xen/drivers/char/xhci-dbc.c > > +++ b/xen/drivers/char/xhci-dbc.c > > @@ -1226,9 +1226,43 @@ static void __init cf_check > > dbc_uart_init_postirq(struct serial_port *port) > > uart->dbc.xhc_dbc_offset), > > PFN_UP((uart->dbc.bar_val & PCI_BASE_ADDRESS_MEM_MASK) + > > uart->dbc.xhc_dbc_offset + > > - sizeof(*uart->dbc.dbc_reg)) - 1) ) > > - printk(XENLOG_INFO > > + sizeof(*uart->dbc.dbc_reg)) - 1) ) { > > Nit: No need for a brace here (and certainly not a misplaced one). > > > + printk(XENLOG_WARNING > > This log level change looks kind of unrelated. > > > "Error while adding MMIO range of device to > > mmio_ro_ranges\n"); > > + } > > + else > > + { > > + unsigned long dbc_regs_start = (uart->dbc.bar_val & > > + PCI_BASE_ADDRESS_MEM_MASK) + uart->dbc.xhc_dbc_offset; > > + unsigned long dbc_regs_end = dbc_regs_start + > > sizeof(*uart->dbc.dbc_reg); > > + > > + /* This being smaller than a page simplifies conditions below */ > > + BUILD_BUG_ON(sizeof(*uart->dbc.dbc_reg) >= PAGE_SIZE - 1); > > Why PAGE_SIZE - 1 (or why >= instead of > )? If there is a reason, then > the comment wants to be in sync. Indeed looks like off-by-one. > > + if ( dbc_regs_start & (PAGE_SIZE - 1) || > > Nit: Please parenthesize the & against the || (similarly again below). > > Like asked by Roger for patch 1 (iirc), here and below please use > PAGE_OFFSET() in favor of (kind of) open-coding it. > > > + PFN_DOWN(dbc_regs_start) == PFN_DOWN(dbc_regs_end) ) > > Nit: Style (indentation). > > > + { > > + if ( subpage_mmio_ro_add( > > + _mfn(PFN_DOWN(dbc_regs_start)), > > + dbc_regs_start & (PAGE_SIZE - 1), > > + PFN_DOWN(dbc_regs_start) == PFN_DOWN(dbc_regs_end) > > + ? dbc_regs_end & (PAGE_SIZE - 1) > > + : PAGE_SIZE - 1, > > + FIX_XHCI_END) ) > > Nit: I think this is too deep a level of indentation; it should be a > single level (4 blanks) from the start of the function name (also > again another time below). > > > + printk(XENLOG_WARNING > > + "Error while adding MMIO range of device to > > subpage_mmio_ro\n"); > > Nit: Style (indentation). > > > + } > > + if ( dbc_regs_end & (PAGE_SIZE - 1) && > > + PFN_DOWN(dbc_regs_start) != PFN_DOWN(dbc_regs_end) ) > > + { > > + if ( subpage_mmio_ro_add( > > + _mfn(PFN_DOWN(dbc_regs_end)), > > + 0, > > + dbc_regs_end & (PAGE_SIZE - 1), > > + FIX_XHCI_END + > > PFN_DOWN(sizeof(*uart->dbc.dbc_reg))) ) > > + printk(XENLOG_WARNING > > + "Error while adding MMIO range of device to > > subpage_mmio_ro\n"); > > + } > > + } > > Seeing the uses it occurs to me that the interface is somewhat odd: It > adds a r/o range to a page that is already recorded to be r/o. It would > imo be more logical the other way around: To add an exception (writable) > range. The only alternative would be to include the call to > rangeset_add_range(mmio_ro_ranges, ...) as part of the new function, and > reduce accordingly the range passed earlier in the function. But I think > this would needlessly complicate the code there. I'm trying to make the interface safe against multiple calls making different parts of the page R/O. If it would mark an exception, then handling a page where multiple regions need to be protected would be rather cumbersome. It isn't the case for XHCI driver, but for example it could be in MSI-X (if I'd actually use this API there). Making subpage_mmio_ro_add() to call mmio_ro_ranges() on its own, together with Roger's suggestion of using ioremap() internally instead of using fixmap would make it a bit nicer (if mapping the same page with ioremap() in addition to fixmap isn't a problem). -- Best Regards, Marek Marczykowski-Górecki Invisible Things Lab Attachment:
signature.asc
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |