[PATCH v18 6/7] firmware: arm_rmm: Ensure the RMM has GPT entries for memory

Jonathan Cameron jonathan.cameron at oss.qualcomm.com
Mon Sep 21 14:58:38 PDT 2026


> >>>   static int __init arm64_init_rmi(void)
> >>>   {
> >>>       int ret;
> >>> @@ -786,8 +970,24 @@ static int __init arm64_init_rmi(void)
> >>>       if (ret) {
> >>>           pr_err("RMM activate failed\n");
> >>>           ret = ret < 0 ? ret : -ENXIO;
> >>> +        return ret;  
> >>
> >> Why did this change?  
> > 
> > Rebase messed up. I will restore it.  
> 
> Actually this is not. We dont have to check the metadata if
> we couldn't activate the RMM. Also, the failure path at the
> bottom has "deactivate", which again is not needed. So
> it is the right thing to do.

Only after this patch? Not from the previous patch?

> 
> >   
> >>  
> >>>       }
> >>> +    ret = rmi_init_metadata();
> >>> +    if (ret)  
> >>
> >> And this is hitting another bit of guidance in cleanup.h.
> >> Functions shouldn't be mixing __free and friends with
> >> gotos.  Again, not a bug here but there are large ugly
> >> monsters around this stuff, hence the blanket guidance.
> >> I haven't thought that hard on how you avoid it here, but
> >> usually it's a combination of suitable helpers and wrappers
> >> and resulting code is often more readable as a result.  
> 
> I could change the hunk to something like, but that looks ugly.
> 
> @@ -1010,20 +1010,12 @@ static int __init arm64_init_rmi(void)
>                  return ret;
>          }
> 
> -       ret = rmi_init_metadata();
> -       if (ret)
> -               goto out_deactivate;
> +       if (!rmi_init_metadata() && 
> !register_memory_notifier(&rmi_memory_nb)) {
> +               arm64_rmi_is_available = true;
> +               pr_info("RMI configured\n");
> +               return 0;
> +       }
> 
> -       ret = register_memory_notifier(&rmi_memory_nb);
> -       if (ret)
> -               goto out_deactivate;
> -
> -       arm64_rmi_is_available = true;
> -       pr_info("RMI configured\n");
> -
> -       return 0;
> -
> -out_deactivate:
>          WARN_ON(rmi_sro_memxfer_cmd(sro, GFP_KERNEL, 
> SMC_RMI_RMM_DEACTIVATE));
>          return ret;
>   }
> 
> 
> Either ways, we have to cleanup the object on return, no matter
> the route we take. So the original form is much more readable
> for me.

Agree to more readable, but that fragility of mixing __free() and
goto is a real problem that has tripped many folk up - hence
the perhaps overly strict guidance.  Rather than avoiding the goto, I'd just
not use __free()  - go old school and have two labels for errors
and an extra manual free in the good path.

	pr_info("RMI configured\n:);
	kfree(sro);

	return 0;

out_deactivate:
	WARN_ON(rmi_sro_memxfer_cmd(sro, GFP_KERNEL, SMC_RMI_RMM_DEACTIVATE));
out_free_sro:
	kfree(sro);
	return ret;
}

Sometime the new toys aren't the right answer.

Jonathan




> 
> Cheers
> Suzuki
> 
> >>  
> > 
> > I will see if I can improve it.
> > 
> > Cheers
> > Suzuki
> >   
> 




More information about the linux-arm-kernel mailing list