ref: 9dcf1a2fc4bab3c7388d11b6863aa855b3deb977
parent: 42a6cb1dcd4e7b53daddfbf947155bfe042e4841
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jan 7 19:23:26 EST 2018
ether8169: deal with kernel memory exhaution when kernel memory is exhausted, rtl8169replenish() can fail to plant more receive descriptors and rtl8169receive() would run over the receive tail and crash on the nil ctlr->rb[x]. rtl8169receive() is called on "Receive Descriptor Unavailable" and "Packet Underrun" so we will try to replenish descriptors in the beginning first in case memory was exhausted and memory is available again and make sure not to run over the tail.
--- a/sys/src/9/pc/ether8169.c
+++ b/sys/src/9/pc/ether8169.c
@@ -919,8 +919,10 @@
int x;
ctlr = edev->ctlr;
- x = ctlr->rdh;
- for(;;){+ if(ctlr->nrq < ctlr->nrd/2)
+ rtl8169replenish(ctlr);
+
+ for(x = ctlr->rdh; x != ctlr->rdt;){d = &ctlr->rd[x];
if((control = d->control) & Own)
break;
--
⑨