- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- <2>GMAC: swgmac_linux_xmit_frames No More Free Tx Descriptors
- kernel BUG at mm/slab.c:602!
- <0>Kernel panic - not syncing: BUG!
解决方法:
(1) 定位出错代码
- <mm/slab.c>
- static inline struct slab *page_get_slab(struct page *page)
- {
- BUG_ON(!PageSlab(page));
- return (struct slab *)page->lru.prev;
- }
(2) 跟踪PageSlab()函数,PageSlab()函数的宏定义位于
- <linux-2.6.28/include/linux/page-flags.h>
- __PAGEFLAG(Slab, slab)
- #define TESTPAGEFLAG(uname, lname) \
- static inline int Page##uname(struct page *page) \
- { return test_bit(PG_##lname, &page->flags); }
- #define __PAGEFLAG(uname, lname) TESTPAGEFLAG(uname, lname) \
- __SETPAGEFLAG(uname, lname) __CLEARPAGEFLAG(uname, lname)
由此可知PageSlab函数原型为:
- static inline int PageSlab(struct page *page)
- {
- return test_bit(PG_slab, &page->flags);
- }
- status = gmac_set_tx_qptr(gmacdev, dma_addr, skb->len, (u64)skb,0,0,0,offload_needed);
- if(status < 0){
- TR0("%s No More Free Tx Descriptors\n",__FUNCTION__);
- dev_kfree_skb (skb); //出错的根源。
- // dev_kfree_skb (skb); // 修改后的代码
- netif_stop_queue(netdev);
- local_irq_restore(flags);
- return -EBUSY;
- }