Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Apr 2011 06:46:07 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        cvs-src-old@freebsd.org
Subject:   cvs commit: src/sys/mips/atheros if_arge.c
Message-ID:  <201104062118.p36LIKwr009544@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
adrian      2011-04-05 06:46:07 UTC

  FreeBSD src repository

  Modified files:
    sys/mips/atheros     if_arge.c 
  Log:
  SVN rev 220357 on 2011-04-05 06:46:07Z by adrian
  
  if_arge has had a strange bug that only appears during high traffic
  levels. TX would hang, RX wouldn't. A bit of digging showed the interface
  send queue was full, but IFF_DRV_OACTIVE was clear and the hardware TX
  queue was empty.
  
  It turns out that there wasn't a check to drain the interface send
  queue once hardware TX had completed, so if the interface send queue
  had filled up in the meantime, subsequent packets would be dropped
  by the higher layers and if_start (and thus arge_start()) would never
  be called.
  
  The fix is simple - call arge_start_locked() in the software interrupt
  handler after the hardware TX queue has been handled or a TX underrun
  occured. This way the interface send queue gets drained.
  
  Revision  Changes    Path
  1.17      +21 -0     src/sys/mips/atheros/if_arge.c



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201104062118.p36LIKwr009544>