[prev in list] [next in list] [prev in thread] [next in thread]
List: freebsd-hackers
Subject: Issue with the number of jumbo frames after tweaking
From: Arnaud YSMAL <arnaud.ysmal () stormshield ! eu>
Date: 2014-12-10 9:01:22
Message-ID: 536944673.989749.1418202082741.JavaMail.zimbra () stormshield ! eu
[Download RAW message or body]
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
["uma_core.patch" (text/x-patch)]
--- 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-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic