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