From 75b7fb90fa61db7667767eee4b1d2e9ced23849b Mon Sep 17 00:00:00 2001 From: Sepherosa Ziehau Date: Thu, 1 Jun 2017 11:28:26 +0800 Subject: [PATCH] ifnet: Fix regression if netisr_ncpus consisted of a large primary number e.g. # of rings == 8, and netisr_ncpus == 22 Previous algorithm will only use 2 rings instead of 8 rings. --- sys/net/if.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/sys/net/if.c b/sys/net/if.c index ee4ddb4ccd..b3c3795868 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -3566,7 +3566,7 @@ if_ringmap_alloc_flags(device_t dev, int ring_cnt, int ring_cntmax, uint32_t flags) { struct if_ringmap *rm; - int i, grid = 0; + int i, grid = 0, prev_grid; ring_cnt = if_ringcnt_fixup(ring_cnt, ring_cntmax); rm = kmalloc(__offsetof(struct if_ringmap, rm_cpumap[ring_cnt]), @@ -3576,19 +3576,21 @@ if_ringmap_alloc_flags(device_t dev, int ring_cnt, int ring_cntmax, if (flags & RINGMAP_FLAG_POWEROF2) rm->rm_cnt = 1 << (fls(rm->rm_cnt) - 1); + prev_grid = netisr_ncpus; for (i = 0; i < netisr_ncpus; ++i) { if (netisr_ncpus % (i + 1) != 0) continue; - if (rm->rm_cnt > netisr_ncpus / (i + 2)) { - grid = netisr_ncpus / (i + 1); - if (rm->rm_cnt > grid) - rm->rm_cnt = grid; + grid = netisr_ncpus / (i + 1); + if (rm->rm_cnt > grid) { + grid = prev_grid; break; } + + if (rm->rm_cnt > netisr_ncpus / (i + 2)) + break; + prev_grid = grid; } - if (flags & RINGMAP_FLAG_POWEROF2) - rm->rm_cnt = 1 << (fls(rm->rm_cnt) - 1); if_ringmap_set_grid(dev, rm, grid); return (rm); -- 2.41.0