[PATCH 6/6] irqchip/sifive-plic: Avoid explicit cpumask allocation on stack

Dawei Li posted 6 patches 1 year, 10 months ago
There is a newer version of this series
[PATCH 6/6] irqchip/sifive-plic: Avoid explicit cpumask allocation on stack
Posted by Dawei Li 1 year, 10 months ago
In general it's preferable to avoid placing cpumasks on the stack, as
for large values of NR_CPUS these can consume significant amounts of
stack space and make stack overflows more likely.

Use cpumask_first_and_and() to avoid the need for a temporary cpumask on
the stack.

Signed-off-by: Dawei Li <dawei.li@shingroup.cn>
---
 drivers/irqchip/irq-sifive-plic.c | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
index f3d4cb9e34f7..bf5d2fc6396e 100644
--- a/drivers/irqchip/irq-sifive-plic.c
+++ b/drivers/irqchip/irq-sifive-plic.c
@@ -164,15 +164,13 @@ static int plic_set_affinity(struct irq_data *d,
 			     const struct cpumask *mask_val, bool force)
 {
 	unsigned int cpu;
-	struct cpumask amask;
 	struct plic_priv *priv = irq_data_get_irq_chip_data(d);
 
-	cpumask_and(&amask, &priv->lmask, mask_val);
-
 	if (force)
-		cpu = cpumask_first(&amask);
+		cpu = cpumask_first_and(&priv->lmask, mask_val);
 	else
-		cpu = cpumask_any_and(&amask, cpu_online_mask);
+		cpu = cpumask_first_and_and(&priv->lmask, mask_val,
+					    cpu_online_mask);
 
 	if (cpu >= nr_cpu_ids)
 		return -EINVAL;
-- 
2.27.0
Re: [PATCH 6/6] irqchip/sifive-plic: Avoid explicit cpumask allocation on stack
Posted by Yury Norov 1 year, 10 months ago
On Fri, Apr 12, 2024 at 06:58:39PM +0800, Dawei Li wrote:
> In general it's preferable to avoid placing cpumasks on the stack, as
> for large values of NR_CPUS these can consume significant amounts of
> stack space and make stack overflows more likely.
> 
> Use cpumask_first_and_and() to avoid the need for a temporary cpumask on
> the stack.
> 
> Signed-off-by: Dawei Li <dawei.li@shingroup.cn>
> ---
>  drivers/irqchip/irq-sifive-plic.c | 8 +++-----
>  1 file changed, 3 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
> index f3d4cb9e34f7..bf5d2fc6396e 100644
> --- a/drivers/irqchip/irq-sifive-plic.c
> +++ b/drivers/irqchip/irq-sifive-plic.c
> @@ -164,15 +164,13 @@ static int plic_set_affinity(struct irq_data *d,
>  			     const struct cpumask *mask_val, bool force)
>  {
>  	unsigned int cpu;
> -	struct cpumask amask;
>  	struct plic_priv *priv = irq_data_get_irq_chip_data(d);
>  
> -	cpumask_and(&amask, &priv->lmask, mask_val);
> -
>  	if (force)
> -		cpu = cpumask_first(&amask);
> +		cpu = cpumask_first_and(&priv->lmask, mask_val);
>  	else
> -		cpu = cpumask_any_and(&amask, cpu_online_mask);
> +		cpu = cpumask_first_and_and(&priv->lmask, mask_val,
> +					    cpu_online_mask);

Don't need to split the line here. The new max length is 100 chars,
here's 85 when unsplit, and it hurts readability for nothing.

>  
>  	if (cpu >= nr_cpu_ids)
>  		return -EINVAL;
> -- 
> 2.27.0