|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5 2/3] x86/mm: add API for marking only part of a MMIO page read only
On Mon, Jul 22, 2024 at 02:09:15PM +0200, Jan Beulich wrote:
> On 19.07.2024 04:33, Marek Marczykowski-Górecki wrote:
> > @@ -4910,6 +4921,254 @@ long arch_memory_op(unsigned long cmd,
> > XEN_GUEST_HANDLE_PARAM(void) arg)
> > return rc;
> > }
> >
> > +static void __iomem *subpage_mmio_find_page(mfn_t mfn)
> > +{
> > + struct subpage_ro_range *entry;
>
> With the function returning void*, my first reaction was to ask why this
> isn't pointer-to-const. Yet then ...
>
> > + list_for_each_entry(entry, &subpage_ro_ranges, list)
> > + if ( mfn_eq(entry->mfn, mfn) )
> > + return entry;
>
> ... you're actually returning entry here, just with its type zapped for
> no apparent reason. I also question the __iomem in the return type.
Right, a leftover from some earlier version.
> > +static int __init subpage_mmio_ro_add_page(
> > + mfn_t mfn,
> > + unsigned int offset_s,
> > + unsigned int offset_e)
> > +{
> > + struct subpage_ro_range *entry = NULL, *iter;
> > + unsigned int i;
> > +
> > + entry = subpage_mmio_find_page(mfn);
> > + if ( !entry )
> > + {
> > + /* iter == NULL marks it was a newly allocated entry */
> > + iter = NULL;
>
> Yet you don't use "iter" for other purposes anymore. I think the variable
> wants renaming and shrinking to e.g. a simple bool.
+1
> > + entry = xzalloc(struct subpage_ro_range);
> > + if ( !entry )
> > + return -ENOMEM;
> > + entry->mfn = mfn;
> > + }
> > +
> > + for ( i = offset_s; i <= offset_e; i += MMIO_RO_SUBPAGE_GRAN )
> > + {
> > + bool oldbit = __test_and_set_bit(i / MMIO_RO_SUBPAGE_GRAN,
> > + entry->ro_elems);
>
> Nit: Indentation looks to be off by 1 here.
>
> > + ASSERT(!oldbit);
> > + }
> > +
> > + if ( !iter )
> > + list_add(&entry->list, &subpage_ro_ranges);
>
> What's wrong with doing this right in the earlier conditional?
>
> > +int __init subpage_mmio_ro_add(
> > + paddr_t start,
> > + size_t size)
> > +{
> > + mfn_t mfn_start = maddr_to_mfn(start);
> > + paddr_t end = start + size - 1;
> > + mfn_t mfn_end = maddr_to_mfn(end);
> > + unsigned int offset_end = 0;
> > + int rc;
> > + bool subpage_start, subpage_end;
> > +
> > + ASSERT(IS_ALIGNED(start, MMIO_RO_SUBPAGE_GRAN));
> > + ASSERT(IS_ALIGNED(size, MMIO_RO_SUBPAGE_GRAN));
> > + if ( !IS_ALIGNED(size, MMIO_RO_SUBPAGE_GRAN) )
> > + return -EINVAL;
>
> I think I had asked before: Why is misaligned size something that wants a
> release build fallback to the assertion, but not misaligned start?
Misaligned start will lead to protecting larger area, not smaller, so it
is not unsafe thing to do. But I can also make it return an error, it
shouldn't happen after all.
--
Best Regards,
Marek Marczykowski-Górecki
Invisible Things Lab
Attachment:
signature.asc
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |