[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