On Fri, Aug 08 2025, Pratyush Yadav wrote: [...] >> @@ -144,14 +144,35 @@ static int __kho_preserve_order(struct kho_mem_track *track, unsigned long pfn, >> unsigned int order) >> { >> struct kho_mem_phys_bits *bits; >> - struct kho_mem_phys *physxa; >> + struct kho_mem_phys *physxa, *new_physxa; >> const unsigned long pfn_high = pfn >> order; >> >> might_sleep(); >> >> - physxa = xa_load_or_alloc(&track->orders, order, sizeof(*physxa)); >> - if (IS_ERR(physxa)) >> - return PTR_ERR(physxa); >> + physxa = xa_load(&track->orders, order); >> + if (!physxa) { >> + new_physxa = kzalloc(sizeof(*physxa), GFP_KERNEL); >> + if (!new_physxa) >> + return -ENOMEM; >> + >> + xa_init(&new_physxa->phys_bits); >> + physxa = xa_cmpxchg(&track->orders, order, NULL, new_physxa, >> + GFP_KERNEL); >> + if (xa_is_err(physxa)) { >> + int err = xa_err(physxa); >> + >> + xa_destroy(&new_physxa->phys_bits); >> + kfree(new_physxa); >> + >> + return err; >> + } >> + if (physxa) { >> + xa_destroy(&new_physxa->phys_bits); >> + kfree(new_physxa); >> + } else { >> + physxa = new_physxa; >> + } > > I suppose this could be simplified a bit to: > > err = xa_err(physxa); > if (err || physxa) { > xa_destroy(&new_physxa->phys_bits); > kfree(new_physxa); > > if (err) > return err; > } else { > physxa = new_physxa; > } My email client completely messed the whitespace up so this is a bit unreadable. Here is what I meant: err = xa_err(physxa); if (err || physxa) { xa_destroy(&new_physxa->phys_bits); kfree(new_physxa); if (err) return err; } else { physxa = new_physxa; } [...] -- Regards, Pratyush Yadav