[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 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. > +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. > + 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? > +static void subpage_mmio_write_emulate( > + mfn_t mfn, > + unsigned int offset, > + const void *data, > + unsigned int len) > +{ > + struct subpage_ro_range *entry; > + volatile void __iomem *addr; > + > + entry = subpage_mmio_find_page(mfn); > + if ( !entry ) > + /* Do not print message for pages without any writable parts. */ > + return; > + > + if ( test_bit(offset / MMIO_RO_SUBPAGE_GRAN, entry->ro_elems) ) > + { > +write_ignored: Nit: Like you have it further up, labels indented by at least one blank please. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |