On Thu, 2014-02-20 at 09:39 +0000, Sathya Perla wrote: > > -----Original Message----- > > From: jiang.biao2@zte.com.cn [mailto:jiang.biao2@zte.com.cn] > > > > > > From: Li Fengmao > > > > There will be packet drop with kernel param "swiotlb = force" on > > Emulex 10Gb NIC using be2net driver. The problem is caused by > > receiving skb without calling pci_unmap_page() in get_rx_page_info(). > > rx_page_info->last_page_user is initialized to false in > > be_post_rx_frags() when current frag are mapped in the first half of > > the same page with another frag. But in that case with > > "swiotlb = force" param, data can not be copied into the page of > > rx_page_info without calling pci_unmap_page, so the data frag mapped > > in the first half of the page will be dropped. > > > > It can be solved by creating only a mapping relation between frag > > and page, and deleting rx_page_info->last_page_user to ensure > > calling pci_unmap_page when handling each receiving frag. > > This patch uses an entire page for each RX frag (whose default size is 2048). > Consequently, on platforms like ppc64 where the default PAGE_SIZE is 64K, > memory usage becomes very inefficient. > > Instead, I've tried a partial-page mapping scheme. This retains the > page sharing logic, but un-maps each frag separately so that > the data is copied from the bounce buffers. [...] You don't need to map/unmap each fragment separately; you can sync a sub-page range with dma_sync_single_for_cpu(). Ben. -- Ben Hutchings I haven't lost my mind; it's backed up on tape somewhere.