myri10ge: fix management of the firmware 4KB boundary crossing restriction

Simpler way of dealing with the firmware 4KB boundary crossing
restriction for rx buffers. This fixes a variety of memory
corruption issues when using an "uncommon" MTU with a 16KB
page size.

Signed-off-by: Brice Goglin <brice@myri.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>

authored by Brice Goglin and committed by Jeff Garzik ae8509b1 6cdbd77e

+8 -11
+8 -11
drivers/net/myri10ge/myri10ge.c
··· 900 /* try to refill entire ring */ 901 while (rx->fill_cnt != (rx->cnt + rx->mask + 1)) { 902 idx = rx->fill_cnt & rx->mask; 903 - 904 - if ((bytes < MYRI10GE_ALLOC_SIZE / 2) && 905 - (rx->page_offset + bytes <= MYRI10GE_ALLOC_SIZE)) { 906 /* we can use part of previous page */ 907 get_page(rx->page); 908 - #if MYRI10GE_ALLOC_SIZE > 4096 909 - /* Firmware cannot cross 4K boundary.. */ 910 - if ((rx->page_offset >> 12) != 911 - ((rx->page_offset + bytes - 1) >> 12)) { 912 - rx->page_offset = 913 - (rx->page_offset + bytes) & ~4095; 914 - } 915 - #endif 916 } else { 917 /* we need a new page */ 918 page = ··· 931 932 /* start next packet on a cacheline boundary */ 933 rx->page_offset += SKB_DATA_ALIGN(bytes); 934 rx->fill_cnt++; 935 936 /* copy 8 descriptors to the firmware at a time */
··· 900 /* try to refill entire ring */ 901 while (rx->fill_cnt != (rx->cnt + rx->mask + 1)) { 902 idx = rx->fill_cnt & rx->mask; 903 + if (rx->page_offset + bytes <= MYRI10GE_ALLOC_SIZE) { 904 /* we can use part of previous page */ 905 get_page(rx->page); 906 } else { 907 /* we need a new page */ 908 page = ··· 941 942 /* start next packet on a cacheline boundary */ 943 rx->page_offset += SKB_DATA_ALIGN(bytes); 944 + 945 + #if MYRI10GE_ALLOC_SIZE > 4096 946 + /* don't cross a 4KB boundary */ 947 + if ((rx->page_offset >> 12) != 948 + ((rx->page_offset + bytes - 1) >> 12)) 949 + rx->page_offset = (rx->page_offset + 4096) & ~4095; 950 + #endif 951 rx->fill_cnt++; 952 953 /* copy 8 descriptors to the firmware at a time */