Skip site navigation (1)Skip section navigation (2)
Date:      Sun,  1 Sep 2002 02:49:22 +0100 (BST)
From:      Dominic Marks <dominic_marks@btinternet.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   kern/42274: Convert defined variable into tuneable as suggested
Message-ID:  <20020901014922.5419B4F9@host217-41-34-37.in-addr.btopenworld.com>

next in thread | raw e-mail | index | archive | help

>Number:         42274
>Category:       kern
>Synopsis:       Convert defined variable into tuneable as suggested
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Sat Aug 31 18:50:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Dominic Marks
>Release:        FreeBSD 4.6-STABLE i386
>Organization:
National Physical Laboratory, UK
>Environment:
System: FreeBSD gallium 4.6-STABLE FreeBSD 4.6-STABLE #2:
Sun Sep 1 02:15:28 BST 2002 dom@gallium:/usr/obj/usr/src/sys/GENERIC i386
	
>Description:
	In kern_event.c the following line currently exists:

	#define	KN_HASHSIZE	64	/* XXX should be tunable */

	I have created another sysctl using the same naming scheme which
	is used elsewhere in the file which implements (I believe) what
	the comment suggests.
	
	
>How-To-Repeat:
	I have successfully built and tested a 4.6-STABLE kernel with
	the small diff below, it seems to work as expected:

	> sysctl kern | grep kq_
	kern.kq_calloutmax: 4096
	kern.kq_hashsize: 128
	(the default is still 64, but I wanted to test with a different
	size so I modified this in loader.conf)
	
	A test application for kqueue that I have written works as it is
	expected to also:

	> ./kqtest
	im going to make a new kqueue
	now i am going to wait for events on that queue
	(here it blocks for events as expected)

	I have supplied diffs against -CURRENT and -STABLE below.

	Thanks.
	
>Fix:

Against -CURRENT:

Index: kern_event.c
===================================================================
RCS file: /media/cvs/freebsd/src/sys/kern/kern_event.c,v
retrieving revision 1.45
diff -u -3 -p -r1.45 kern_event.c
--- kern_event.c	17 Aug 2002 02:36:16 -0000	1.45
+++ kern_event.c	1 Sep 2002 01:35:26 -0000
@@ -111,8 +111,12 @@ static struct filterops timer_filtops =
 static uma_zone_t	knote_zone;
 static int 		kq_ncallouts = 0;
 static int 		kq_calloutmax = (4 * 1024);
+static int		kq_hashsize = 64;
+
 SYSCTL_INT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW,
     &kq_calloutmax, 0, "Maximum number of callouts allocated for kqueue");
+SYSCTL_INT(_kern, OID_AUTO, kq_hashsize, CTLFLAG_RW, &kq_hashsize, 0,
+	"Size of the KNote hash used by kqueue");
 
 #define KNOTE_ACTIVATE(kn) do { 					\
 	kn->kn_status |= KN_ACTIVE;					\
@@ -120,7 +124,6 @@ SYSCTL_INT(_kern, OID_AUTO, kq_calloutma
 		knote_enqueue(kn);					\
 } while(0)
 
-#define	KN_HASHSIZE		64		/* XXX should be tunable */
 #define KN_HASH(val, mask)	(((val) ^ (val >> 8)) & (mask))
 
 static int
@@ -960,7 +963,7 @@ knote_attach(struct knote *kn, struct fi
 
 	if (! kn->kn_fop->f_isfd) {
 		if (fdp->fd_knhashmask == 0)
-			fdp->fd_knhash = hashinit(KN_HASHSIZE, M_KQUEUE,
+			fdp->fd_knhash = hashinit(kq_hashsize, M_KQUEUE,
 			    &fdp->fd_knhashmask);
 		list = &fdp->fd_knhash[KN_HASH(kn->kn_id, fdp->fd_knhashmask)];
 		goto done;

Against -STABLE:

Index: kern_event.c
===================================================================
RCS file: /media/cvs/freebsd/src/sys/kern/kern_event.c,v
retrieving revision 1.2.2.8
diff -u -3 -p -r1.2.2.8 kern_event.c
--- kern_event.c	14 Dec 2001 19:24:42 -0000	1.2.2.8
+++ kern_event.c	1 Sep 2002 01:45:37 -0000
@@ -108,8 +108,13 @@ static struct filterops timer_filtops =
 static vm_zone_t	knote_zone;
 static int 		kq_ncallouts = 0;
 static int 		kq_calloutmax = (4 * 1024);
-SYSCTL_INT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW,
-    &kq_calloutmax, 0, "Maximum number of callouts allocated for kqueue");
+static int		kq_hashsize = 64;
+
+SYSCTL_INT(_kern, OID_AUTO, kq_calloutmax, CTLFLAG_RW, &kq_calloutmax,
+	0, "Maximum number of callouts allocated for kqueue");
+SYSCTL_INT(_kern, OID_AUTO, kq_hashsize, CTLFLAG_RW, &kq_hashsize, 0,
+	"Size of the KNote hash used by kqueue");
+
 
 #define KNOTE_ACTIVATE(kn) do { 					\
 	kn->kn_status |= KN_ACTIVE;					\
@@ -117,7 +122,6 @@ SYSCTL_INT(_kern, OID_AUTO, kq_calloutma
 		knote_enqueue(kn);					\
 } while(0)
 
-#define	KN_HASHSIZE		64		/* XXX should be tunable */
 #define KN_HASH(val, mask)	(((val) ^ (val >> 8)) & (mask))
 
 extern struct filterops aio_filtops;
@@ -873,7 +877,7 @@ knote_attach(struct knote *kn, struct fi
 
 	if (! kn->kn_fop->f_isfd) {
 		if (fdp->fd_knhashmask == 0)
-			fdp->fd_knhash = hashinit(KN_HASHSIZE, M_KQUEUE,
+			fdp->fd_knhash = hashinit(kq_hashsize, M_KQUEUE,
 			    &fdp->fd_knhashmask);
 		list = &fdp->fd_knhash[KN_HASH(kn->kn_id, fdp->fd_knhashmask)];
 		goto done;


>Release-Note:
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020901014922.5419B4F9>