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;
{