From mboxrd@z Thu Jan 1 00:00:00 1970 From: Philippe Gerum Subject: [PATCH 06/12] net/rtdev: ensure per-device skbs get mapped at registration Date: Thu, 24 Jan 2019 16:34:22 +0100 Message-Id: <20190124153428.21006-7-rpm@xenomai.org> In-Reply-To: <20190124153428.21006-1-rpm@xenomai.org> References: <20190124153428.21006-1-rpm@xenomai.org> List-Id: Discussions about the Xenomai project List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xenomai@xenomai.org Cc: Jan Kiszka , Philippe Gerum 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 --- 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)) { + 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)) { + 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; } -- 2.17.2