Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jan 2003 10:33:38 +0100 (CET)
From:      Hartmut Brandt <brandt@fokus.fraunhofer.de>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   sparc64/47389: kern.ipc.{maxsockbuf,sockbuf_waste_factor} broken on sparc
Message-ID:  <200301230933.h0N9Xc2S000684@catssrv.fokus.gmd.de>

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

>Number:         47389
>Category:       sparc64
>Synopsis:       kern.ipc.{maxsockbuf,sockbuf_waste_factor} broken on sparc
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-sparc
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jan 23 01:40:00 PST 2003
>Closed-Date:
>Last-Modified:
>Originator:     Hartmut Brandt
>Release:        FreeBSD 5.0-CURRENT sparc64
>Organization:
FhI Fokus
>Environment:
System: FreeBSD catssrv.fokus.gmd.de 5.0-CURRENT FreeBSD 5.0-CURRENT #8: Wed Jan 22 18:21:10 CET 2003 hbb@catssrv.fokus.gmd.de:/opt/obj/usr/src/sys/CATSSRV sparc64


	
>Description:

kern.ipc.maxsockbuf and kern.ipc.sockbuf_waste_factor are returned as 0
by sysctl on sparc and cannot be changed.

	
>How-To-Repeat:

Execute:

	sysctl kern.ipc

and see both variables to print as zero.
	
>Fix:

Apply the attached patch. The problem is, that the variable are declared as
u_long, while the SYSCTL macros and the handler for sb_max uses them as ints.
This will work on architectures where sizeof(u_long) == sizeof(int) or that
are little endian. It will break on sparc.
	

Index: sys/kern/uipc_socket2.c
===================================================================
RCS file: /home/cvs/freebsd/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.107
diff -c -r1.107 uipc_socket2.c
*** sys/kern/uipc_socket2.c	11 Jan 2003 07:51:52 -0000	1.107
--- sys/kern/uipc_socket2.c	23 Jan 2003 09:28:28 -0000
***************
*** 383,392 ****
  	int error = 0;
  	u_long old_sb_max = sb_max;
  
! 	error = SYSCTL_OUT(req, arg1, sizeof(int));
  	if (error || !req->newptr)
  		return (error);
! 	error = SYSCTL_IN(req, arg1, sizeof(int));
  	if (error)
  		return (error);
  	if (sb_max < MSIZE + MCLBYTES) {
--- 383,392 ----
  	int error = 0;
  	u_long old_sb_max = sb_max;
  
! 	error = SYSCTL_OUT(req, arg1, sizeof(u_long));
  	if (error || !req->newptr)
  		return (error);
! 	error = SYSCTL_IN(req, arg1, sizeof(u_long));
  	if (error)
  		return (error);
  	if (sb_max < MSIZE + MCLBYTES) {
***************
*** 989,999 ****
  /* This takes the place of kern.maxsockbuf, which moved to kern.ipc. */
  static int dummy;
  SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, "");
! SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_INT|CTLFLAG_RW, 
!     &sb_max, 0, sysctl_handle_sb_max, "I", "Maximum socket buffer size");
  SYSCTL_INT(_kern_ipc, OID_AUTO, maxsockets, CTLFLAG_RD, 
      &maxsockets, 0, "Maximum number of sockets avaliable");
! SYSCTL_INT(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW,
      &sb_efficiency, 0, "");
  
  /*
--- 989,999 ----
  /* This takes the place of kern.maxsockbuf, which moved to kern.ipc. */
  static int dummy;
  SYSCTL_INT(_kern, KERN_DUMMY, dummy, CTLFLAG_RW, &dummy, 0, "");
! SYSCTL_OID(_kern_ipc, KIPC_MAXSOCKBUF, maxsockbuf, CTLTYPE_ULONG|CTLFLAG_RW, 
!     &sb_max, 0, sysctl_handle_sb_max, "LU", "Maximum socket buffer size");
  SYSCTL_INT(_kern_ipc, OID_AUTO, maxsockets, CTLFLAG_RD, 
      &maxsockets, 0, "Maximum number of sockets avaliable");
! SYSCTL_ULONG(_kern_ipc, KIPC_SOCKBUF_WASTE, sockbuf_waste_factor, CTLFLAG_RW,
      &sb_efficiency, 0, "");
  
  /*

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

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




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