mirror of
https://github.com/opnsense/src.git
synced 2026-04-20 21:59:20 -04:00
Fix PR221990 - Assertion at iflib.c:1947
ifl_pidx and ifl_credits are going out of sync in _iflib_fl_refill() as they use different update log. Use the same update logic for both, and add a final call to isc_rxd_refill() to handle early exits from the loop. PR: 221990 Reported by: pho Reviewed by: sbruno Approved by: sbruno (mentor) Sponsored by: Limelight Networks Differential Revision: https://reviews.freebsd.org/D12798
This commit is contained in:
parent
555c6e60bc
commit
a1b799ca5b
1 changed files with 14 additions and 4 deletions
|
|
@ -1818,20 +1818,22 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count)
|
|||
int n, i = 0;
|
||||
uint64_t bus_addr;
|
||||
int err;
|
||||
qidx_t credits;
|
||||
|
||||
sd_m = fl->ifl_sds.ifsd_m;
|
||||
sd_map = fl->ifl_sds.ifsd_map;
|
||||
sd_cl = fl->ifl_sds.ifsd_cl;
|
||||
sd_flags = fl->ifl_sds.ifsd_flags;
|
||||
idx = pidx;
|
||||
credits = fl->ifl_credits;
|
||||
|
||||
n = count;
|
||||
MPASS(n > 0);
|
||||
MPASS(fl->ifl_credits + n <= fl->ifl_size);
|
||||
MPASS(credits + n <= fl->ifl_size);
|
||||
|
||||
if (pidx < fl->ifl_cidx)
|
||||
MPASS(pidx + n <= fl->ifl_cidx);
|
||||
if (pidx == fl->ifl_cidx && (fl->ifl_credits < fl->ifl_size))
|
||||
if (pidx == fl->ifl_cidx && (credits < fl->ifl_size))
|
||||
MPASS(fl->ifl_gen == 0);
|
||||
if (pidx > fl->ifl_cidx)
|
||||
MPASS(n <= fl->ifl_size - pidx + fl->ifl_cidx);
|
||||
|
|
@ -1904,9 +1906,9 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count)
|
|||
fl->ifl_rxd_idxs[i] = frag_idx;
|
||||
fl->ifl_bus_addrs[i] = bus_addr;
|
||||
fl->ifl_vm_addrs[i] = cl;
|
||||
fl->ifl_credits++;
|
||||
credits++;
|
||||
i++;
|
||||
MPASS(fl->ifl_credits <= fl->ifl_size);
|
||||
MPASS(credits <= fl->ifl_size);
|
||||
if (++idx == fl->ifl_size) {
|
||||
fl->ifl_gen = 1;
|
||||
idx = 0;
|
||||
|
|
@ -1918,10 +1920,18 @@ _iflib_fl_refill(if_ctx_t ctx, iflib_fl_t fl, int count)
|
|||
i = 0;
|
||||
pidx = idx;
|
||||
fl->ifl_pidx = idx;
|
||||
fl->ifl_credits = credits;
|
||||
}
|
||||
|
||||
}
|
||||
done:
|
||||
if (i) {
|
||||
iru.iru_pidx = pidx;
|
||||
iru.iru_count = i;
|
||||
ctx->isc_rxd_refill(ctx->ifc_softc, &iru);
|
||||
fl->ifl_pidx = idx;
|
||||
fl->ifl_credits = credits;
|
||||
}
|
||||
DBG_COUNTER_INC(rxd_flush);
|
||||
if (fl->ifl_pidx == 0)
|
||||
pidx = fl->ifl_size - 1;
|
||||
|
|
|
|||
Loading…
Reference in a new issue