> >> +static int sanitize_range(CXLType3Dev *ct3d, uint64_t dpa_addr, size_t > >> length, > >> + uint8_t fill_value) > >> +{ > >> + > >> + MemoryRegion *vmr = NULL, *pmr = NULL; > >> + uint64_t vmr_size = 0, pmr_size = 0; > >> + AddressSpace *as = NULL; > >> + MemTxAttrs mem_attrs = {0}; > >> + > >> + if (ct3d->hostvmem) { > >> + vmr = host_memory_backend_get_memory(ct3d->hostvmem); > >> + vmr_size = memory_region_size(vmr); > >> + } > >> + if (ct3d->hostpmem) { > >> + pmr = host_memory_backend_get_memory(ct3d->hostpmem); > >> + pmr_size = memory_region_size(pmr); > >> + } > >> + > >> + if (dpa_addr < vmr_size) { > >> + as = &ct3d->hostvmem_as; > >> + } else if (dpa_addr < vmr_size + pmr_size) { > >> + as = &ct3d->hostpmem_as; > >> + } else { > >> + if (!ct3_test_region_block_backed(ct3d, dpa_addr, length)) { > >> + return -ENODEV; > >> + } > >> + as = &ct3d->dc.host_dc_as; > >> + } > > > >You could factor out everything down to here and then use that > >for the validate_dpa_addr() as finding an address space means > >we also checked the address is valid. Otherwise it does not match. > > Didnt get what you meant, validate_dpa_addr is meant for > checking valid dpa address and sanitize_range is > get the address space handle to do actual sanitize > of dpa address, so two are different purposes,
Different purposes but the actual checks mostly overlap. If we can find the address space then there are only a few extra checks on alignment with granual size etc needed. I'd just like to avoid that duplication so factor out the shared code to a helper called in both functions. > > > > >> + > >> + return address_space_set(as, dpa_addr,