• Sebastian Siewior's avatar
    net: fec_main: dma_map() only the length of the skb · 2488a54e
    Sebastian Siewior authored
    On tx submit the driver always dma_map_single() FEC_ENET_TX_FRSIZE (=2048)
    bytes. This works because we don't overwrite any memory after the data buffer,
    we remove it from cache if it was there. So we hurt performace in case the
    mapping of a smaller area makes a difference.
    There is also a bug: If the data area starts shortly before the end of
    RAM say 0xc7fffa10 and the RAM ends at 0xc8000000 then we have enough
    space to fit the data area (according to skb->len) but we would map beyond
    end of ram if we are using 2048. In v2.6.31 (against which kernel this patch
    made) there is the following check in dma_cache_maint():
    
    |BUG_ON(!virt_addr_valid(start) || !virt_addr_valid(start + size - 1));
    
    Since the area starting at 0xc8000000 is no longer virt_addr_valid() we
    BUG() during dma_map_single(). The BUG() statement was removed in v3.5-rc1 as
    per 2dc6a016 ("ARM: dma-mapping: use asm-generic/dma-mapping-common.h").
    
    This patch was tested on v2.6.31 and then forward-ported and compile
    tested only against the net tree. I think it is still worth fixing
    mainline even after the BUG() statement is gone.
    Tested-by: default avatarFugang Duan <B38611@freescale.com>
    Cc: Marek Szyprowski <m.szyprowski@samsung.com>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Acked-by: default avatarFugang Duan <B38611@freescale.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2488a54e
fec_main.c 60.8 KB