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
--- 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)
_______________________________________________
freebsd-net@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-net
To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"