Date: Wed, 10 Dec 2014 10:01:22 +0100 (CET) From: Arnaud YSMAL <arnaud.ysmal@stormshield.eu> To: freebsd-hackers@FreeBSD.org, freebsd-net@FreeBSD.org Cc: damien.deville@stormshield.eu, andre@FreeBSD.org, Fabien THOMAS <fabien.thomas@stormshield.eu> Subject: Issue with the number of jumbo frames after tweaking Message-ID: <536944673.989749.1418202082741.JavaMail.zimbra@stormshield.eu> In-Reply-To: <940402442.797031.1418139811947.JavaMail.zimbra@stormshield.eu>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --] Hi, Using sysctl to set a new value to kern.ipc.nmbjumbo9 or kern.ipc.nmbjumbo16 leads to a wrong value. This appears in FreeBSD 9.3 with the revision 254515 (https://svnweb.freebsd.org/base?view=revision&revision=254515) which MFC the revision 243631. The values are respectively 3 and 4 times bigger than expected. Example on a FreeBSD 9.3 (amd64): # sysctl kern.ipc.nmbjumbo9=224000 kern.ipc.nmbjumbo9: 223263 -> 672000 The sysctls functions in sys/kern/kern_mbuf.c got the new value from the uma_zone_set_max (sys/vm/uma_core.c) function. It looks like the formula used in uma_core.c to compute the number of items based on the number of pages is not always the same (uk_ppera is sometimes missing). In the enclosed patch I assumed that the correct formula to compute the number of items is: (pages / uk_ppera) * uk_ipers Is it normal that in these sysctls the comparison between nmbufs and the sum of jumbos + clusters (added in the same revision) does not use the new value requested by the user? Arnaud [-- Attachment #2 --] --- sys/vm/uma_core.c.orig 2014-12-09 14:18:27.000000000 +0000 +++ sys/vm/uma_core.c 2014-12-09 14:47:53.000000000 +0000 @@ -1416,7 +1416,7 @@ printf("UMA: %s(%p) size %d(%d) flags %#x ipers %d ppera %d out %d free %d\n", zone->uz_name, zone, keg->uk_size, keg->uk_rsize, keg->uk_flags, keg->uk_ipers, keg->uk_ppera, - (keg->uk_ipers * keg->uk_pages) - keg->uk_free, keg->uk_free); + (keg->uk_pages / keg->uk_ppera) * keg->uk_ipers - keg->uk_free, keg->uk_free); #endif LIST_INSERT_HEAD(&keg->uk_zones, zone, uz_link); @@ -2847,16 +2847,19 @@ uma_zone_set_max(uma_zone_t zone, int nitems) { uma_keg_t keg; + int rnitems; ZONE_LOCK(zone); keg = zone_first_keg(zone); keg->uk_maxpages = (nitems / keg->uk_ipers) * keg->uk_ppera; - if (keg->uk_maxpages * keg->uk_ipers < nitems) + rnitems = (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers; + if (rnitems < nitems) { keg->uk_maxpages += keg->uk_ppera; - nitems = keg->uk_maxpages * keg->uk_ipers; + rnitems++; + } ZONE_UNLOCK(zone); - return (nitems); + return (rnitems); } /* See uma.h */ @@ -2868,7 +2871,7 @@ ZONE_LOCK(zone); keg = zone_first_keg(zone); - nitems = keg->uk_maxpages * keg->uk_ipers; + nitems = (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers; ZONE_UNLOCK(zone); return (nitems); @@ -3156,7 +3159,7 @@ "out %d free %d limit %d\n", keg->uk_name, keg, keg->uk_size, keg->uk_rsize, keg->uk_flags, keg->uk_ipers, keg->uk_ppera, - (keg->uk_ipers * keg->uk_pages) - keg->uk_free, keg->uk_free, + (keg->uk_pages / keg->uk_ppera) * keg->uk_ipers - keg->uk_free, keg->uk_free, (keg->uk_maxpages / keg->uk_ppera) * keg->uk_ipers); printf("Part slabs:\n"); LIST_FOREACH(slab, &keg->uk_part_slab, us_link)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?536944673.989749.1418202082741.JavaMail.zimbra>
