On 10/23/2017 04:59 PM, Christoph Muellner wrote:
> To set a GPIO interrupt's CPU affinity, we simply call
> rtdm_irq_affinity() with a proper bitmask.
> 
> Signed-off-by: Christoph Muellner <[email protected]>
> ---
>  kernel/drivers/gpio/gpio-core.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/kernel/drivers/gpio/gpio-core.c b/kernel/drivers/gpio/gpio-core.c
> index 55594f6ae..84153a937 100644
> --- a/kernel/drivers/gpio/gpio-core.c
> +++ b/kernel/drivers/gpio/gpio-core.c
> @@ -118,6 +118,23 @@ static void release_gpio_irq(unsigned int gpio, struct 
> rtdm_gpio_pin *pin,
>       chan->requested = false;
>  }
>  
> +static int set_gpio_irq_affinity(struct rtdm_gpio_pin *pin, int val)
> +{
> +     cpumask_t tgt;
> +     unsigned int i = 0;
> +
> +     cpumask_clear(&tgt);
> +
> +     while (val) {
> +             if (val & (1 << i))
> +                     cpumask_set_cpu(i, &tgt);
> +             val &= ~(1 << i);
> +             i++;
> +     }
> +
> +     return rtdm_irq_affinity(&pin->irqh, tgt);
> +}
> +

Reflecting the change from int -> cpu_set_t in the ABI, we could have
something along these lines instead:

static int set_gpio_irq_affinity(struct rtdm_gpio_pin *pin, unsigned
long __user *u_set, size_t setsize)
{
        cpumask_var_t mask;
        int ret;

        if (!alloc_cpumask_var(&mask, GFP_KERNEL))
                return -ENOMEM;

        ret = get_user_cpu_mask(u_set, setsize, mask);
        if (ret == 0)
                ret = do_set_gpio_affinity(pin, mask);

        free_cpumask_var(mask);

        ...
-- 
Philippe.

_______________________________________________
Xenomai mailing list
[email protected]
https://xenomai.org/mailman/listinfo/xenomai

Reply via email to