Subject: Xserver load problem fixed
To: None <port-pmax@NetBSD.ORG>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
List: port-pmax
Date: 07/24/1995 10:48:02
It turns out that the problem is due to sys/conf.h.
The macro cdev_fb_init is used by the sparc port, and maps
select onto enodev().

DEC framebuffers traditionally use a shared-memory queue to
deliver mouse and keyboard events; and select() on /dev/mouse
returns true when there's something in this queue.  Mapping
the framebuffer's select routine to enodev() causes
the X server to busy-wait.

Since both Decstation and vax framebuffers use the same interface,
maybe the right thing to do is to change sys/conf.h. For now,
I hacked pmax/conf.c to `do the right thing'.

(This patch is relative to the CVS source, and so includes the cdevsw
patch I posted last week.)


*** conf.c.DIST	Tue Jul  4 23:55:14 1995
--- conf.c	Mon Jul 24 10:26:05 1995
***************
*** 115,121 ****
--- 115,140 ----
  cdev_decl(rcons);
  #include "fb.h"
  cdev_decl(fb);
+ #include "pm.h"
+ cdev_decl(pm);
+ #include "cfb.h"
+ cdev_decl(cfb);
+ #include "xcfb.h"
+ cdev_decl(xcfb);
+ #include "mfb.h"
+ cdev_decl(mfb);
  
+ 
+ /* a framebuffer with an attached mouse: */
+ /* open, close, ioctl, select, mmap */
+ 
+ #define	cdev_fbm_init(c,n) { \
+ 	dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
+ 	(dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
+ 	(dev_type_stop((*))) enodev, 0, dev_init(c,n,select), \
+ 	dev_init(c,n,mmap) }
+ 
+ 
  struct cdevsw	cdevsw[] =
  {
  	cdev_cn_init(1,cn),		/* 0: virtual console */
***************
*** 126,142 ****
          cdev_ptc_init(NPTY,ptc),        /* 5: pseudo-tty master */
  	cdev_log_init(1,log),		/* 6: /dev/klog */
  	cdev_fd_init(1,fd),		/* 7: file descriptor pseudo-dev */
! 	cdev_notdef(),			/* 8: 2100/3100 frame buffer */
  	cdev_notdef(),			/* 9: old slot for SCSI disk */
  	cdev_tape_init(NTZ,tz),		/* 10: SCSI tape */
  	cdev_disk_init(NVND,vnd),	/* 11: vnode disk driver */
  	cdev_bpftun_init(NBPFILTER,bpf),/* 12: Berkeley packet filter */
! 	cdev_notdef(),			/* 13: color frame buffer */
! 	cdev_notdef(),			/* 14: maxine color frame buffer */
  	cdev_tty_init(NDTOP,dtop),	/* 15: desktop bus interface */
  	cdev_tty_init(NDC,dc),		/* 16: dc7085 serial interface */
  	cdev_tty_init(NSCC,scc),	/* 17: scc 82530 serial interface */
! 	cdev_notdef(),			/* 18: mono frame buffer */
          cdev_notdef(),		        /* 19: mt */
  	cdev_tty_init(NPTY,pts),	/* 20: pty slave  */
          cdev_ptc_init(NPTY,ptc),        /* 21: pty master */
--- 145,161 ----
          cdev_ptc_init(NPTY,ptc),        /* 5: pseudo-tty master */
  	cdev_log_init(1,log),		/* 6: /dev/klog */
  	cdev_fd_init(1,fd),		/* 7: file descriptor pseudo-dev */
! 	cdev_fbm_init(NPM,pm),		/* 8: 2100/3100 frame buffer */
  	cdev_notdef(),			/* 9: old slot for SCSI disk */
  	cdev_tape_init(NTZ,tz),		/* 10: SCSI tape */
  	cdev_disk_init(NVND,vnd),	/* 11: vnode disk driver */
  	cdev_bpftun_init(NBPFILTER,bpf),/* 12: Berkeley packet filter */
! 	cdev_fbm_init(NCFB,cfb),	/* 13: color frame buffer */
! 	cdev_fbm_init(NXCFB,xcfb),	/* 14: maxine color frame buffer */
  	cdev_tty_init(NDTOP,dtop),	/* 15: desktop bus interface */
  	cdev_tty_init(NDC,dc),		/* 16: dc7085 serial interface */
  	cdev_tty_init(NSCC,scc),	/* 17: scc 82530 serial interface */
! 	cdev_fbm_init(NMFB,mfb),	/* 18: mono frame buffer */
          cdev_notdef(),		        /* 19: mt */
  	cdev_tty_init(NPTY,pts),	/* 20: pty slave  */
          cdev_ptc_init(NPTY,ptc),        /* 21: pty master */
***************
*** 206,212 ****
  	cdev_notdef(),		/* 83: fd */
  	cdev_notdef(),		/* 84: DTi */
  	cdev_tty_init(NRCONS,rcons),	/* 85: raster console pseudo-device */
! 	cdev_fb_init(NFB,fb),	/* 86: frame buffer pseudo-device */
  };
  int	nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
  
--- 225,231 ----
  	cdev_notdef(),		/* 83: fd */
  	cdev_notdef(),		/* 84: DTi */
  	cdev_tty_init(NRCONS,rcons),	/* 85: raster console pseudo-device */
! 	cdev_fbm_init(NFB,fb),	/* 86: frame buffer pseudo-device */
  };
  int	nchrdev = sizeof(cdevsw) / sizeof(cdevsw[0]);
  
***************
*** 226,231 ****
--- 245,251 ----
  /*
   * Routine that identifies /dev/mem and /dev/kmem.
   */
+ int
  iskmemdev(dev)
  	dev_t dev;
  {
***************
*** 240,245 ****
--- 260,266 ----
  /*
   * Returns true if dev is /dev/zero.
   */
+ int
  iszerodev(dev)
  	dev_t dev;
  {
***************
*** 346,351 ****
--- 367,373 ----
  /*
   * Routine to convert from character to block device number.
   */
+ dev_t
  chrtoblk(dev)
  	dev_t dev;
  {