svn commit: r206051 - head/sys/sys

Pawel Jakub Dawidek pjd at FreeBSD.org
Thu Apr 1 16:21:36 UTC 2010


Author: pjd
Date: Thu Apr  1 16:21:35 2010
New Revision: 206051
URL: http://svn.freebsd.org/changeset/base/206051

Log:
  IOCPARM_MAX defines maximum size of a structure that can be passed
  directly to ioctl(2). Because of how ioctl command is build using _IO*()
  macros we have only 13 bits to encode structure size. So the structure
  can be up to 8kB-1.
  
  Currently we define IOCPARM_MAX as PAGE_SIZE.
  
  This is IMHO wrong for three main reasons:
  
  1. It is confusing on archs with page size larger than 8kB (not really
     sure if we support such archs (sparc64?)), as even if PAGE_SIZE is
     bigger than 8kB, we won't be able to encode anything larger in ioctl
     command.
  
  2. It is a waste. Why the structure can be only 4kB on most archs if we
     have 13 bits dedicated for that, not 12?
  
  3. It shouldn't depend on architecture and page size. My ioctl command
     can work on one arch, but can't on the other?
  
  Increase IOCPARM_MAX to 8kB and make it independed of PAGE_SIZE and
  architecture it is compiled for. This allows to use all the bits on all the
  archs for size. Note that this doesn't mean we will copy more on every ioctl(2)
  call. No. We still copyin(9)/copyout(9) only exact number of bytes encoded in
  ioctl command.
  
  Practical use for this change is ZFS. zfs_cmd_t structure used for ZFS
  ioctls is larger than 4kB.
  
  Silence on:	arch@
  MFC after:	1 month

Modified:
  head/sys/sys/ioccom.h

Modified: head/sys/sys/ioccom.h
==============================================================================
--- head/sys/sys/ioccom.h	Thu Apr  1 16:20:36 2010	(r206050)
+++ head/sys/sys/ioccom.h	Thu Apr  1 16:21:35 2010	(r206051)
@@ -38,12 +38,13 @@
  * any in or out parameters in the upper word.  The high 3 bits of the
  * upper word are used to encode the in/out status of the parameter.
  */
-#define	IOCPARM_MASK	0x1fff		/* parameter length, at most 13 bits */
+#define	IOCPARM_SHIFT	13		/* number of bits for ioctl size */
+#define	IOCPARM_MASK	((1 << IOCPARM_SHIFT) - 1) /* parameter length mask */
 #define	IOCPARM_LEN(x)	(((x) >> 16) & IOCPARM_MASK)
 #define	IOCBASECMD(x)	((x) & ~(IOCPARM_MASK << 16))
 #define	IOCGROUP(x)	(((x) >> 8) & 0xff)
 
-#define	IOCPARM_MAX	PAGE_SIZE		/* max size of ioctl, mult. of PAGE_SIZE */
+#define	IOCPARM_MAX	(1 << IOCPARM_SHIFT) /* max size of ioctl */
 #define	IOC_VOID	0x20000000	/* no parameters */
 #define	IOC_OUT		0x40000000	/* copy out parameters */
 #define	IOC_IN		0x80000000	/* copy in parameters */


More information about the svn-src-all mailing list