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.
This commit is contained in:
parent
069230cd62
commit
acb206859d
1 changed files with 4 additions and 2 deletions
|
@ -919,8 +919,10 @@ rtl8169receive(Ether* edev)
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue