[PATCH 06/12] net/rtdev: ensure per-device skbs get mapped at registration

Jan Kiszka jan.kiszka at siemens.com
Thu Jan 24 19:24:47 CET 2019


On 24.01.19 16:34, Philippe Gerum wrote:
> This patch works around a regression introduced by #74464ee37d0,
> causing a new device's skbs not to be passed to its ->map_rtskb()
> handler when registered, breaking further DMA inits in the driver.
> 
> Signed-off-by: Philippe Gerum <rpm at xenomai.org>
> ---
>   kernel/drivers/net/stack/rtdev.c | 37 +++++++++++++++++++++++---------
>   1 file changed, 27 insertions(+), 10 deletions(-)
> 
> diff --git a/kernel/drivers/net/stack/rtdev.c b/kernel/drivers/net/stack/rtdev.c
> index 631ca1804..286d08cb1 100644
> --- a/kernel/drivers/net/stack/rtdev.c
> +++ b/kernel/drivers/net/stack/rtdev.c
> @@ -45,6 +45,7 @@ struct rtnet_device         *rtnet_devices[MAX_RT_DEVICES];
>   static struct rtnet_device  *loopback_device;
>   static DEFINE_RTDM_LOCK(rtnet_devices_rt_lock);
>   static LIST_HEAD(rtskb_mapped_list);
> +static LIST_HEAD(rtskb_mapwait_list);
>   
>   LIST_HEAD(event_hook_list);
>   DEFINE_MUTEX(rtnet_devices_nrt_lock);
> @@ -459,8 +460,12 @@ int rtdev_map_rtskb(struct rtskb *skb)
>   	}
>       }
>   
> -    if (!err && skb->buf_dma_addr != RTSKB_UNMAPPED)
> -	list_add(&skb->entry, &rtskb_mapped_list);
> +    if (!err) {
> +	    if (skb->buf_dma_addr != RTSKB_UNMAPPED)
> +		    list_add(&skb->entry, &rtskb_mapped_list);
> +	    else
> +		    list_add(&skb->entry, &rtskb_mapwait_list);
> +    }
>   
>       mutex_unlock(&rtnet_devices_nrt_lock);
>   
> @@ -471,19 +476,31 @@ int rtdev_map_rtskb(struct rtskb *skb)
>   
>   static int rtdev_map_all_rtskbs(struct rtnet_device *rtdev)
>   {
> -    struct rtskb *skb;
> -    int err = 0;
> +    struct rtskb *skb, *n;
> +    int err;
>   
>       if (!rtdev->map_rtskb)
> -	return 0;
> +	    return 0;
>   
> -    list_for_each_entry(skb, &rtskb_mapped_list, entry) {
> -	err = rtskb_map(rtdev, skb);
> -	if (err)
> -	   break;
> +    if (!list_empty(&rtskb_mapped_list)) {

Why this extra check? list_for_each_entry should just do nothing if the list is 
empty.

> +	    list_for_each_entry(skb, &rtskb_mapped_list, entry) {
> +		    err = rtskb_map(rtdev, skb);
> +		    if (err)
> +			    return err;
> +	    }
>       }
>   
> -    return err;
> +    if (!list_empty(&rtskb_mapwait_list)) {

Same here.

> +	    list_for_each_entry_safe(skb, n, &rtskb_mapwait_list, entry) {
> +		    err = rtskb_map(rtdev, skb);
> +		    if (err)
> +			    return err;
> +		    list_del(&skb->entry);
> +		    list_add(&skb->entry, &rtskb_mapped_list);
> +	    }
> +    }
> +
> +    return 0;
>   }
>   
>   
> 

Style mix: Eventually, we should switch all RTnet code to kernel style. For now, 
we have 4-space-indention, and we should keep it until then. Mixing things will 
only make it more messy.

Jan

-- 
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux



More information about the Xenomai mailing list