From 6dcd6ba9b263d4c9414f431ec3c90dc70616aeb2 Mon Sep 17 00:00:00 2001 From: "Samuel J. Greear" Date: Tue, 15 Jun 2010 16:13:45 +0000 Subject: [PATCH] kernel - Add kqueue read support to memio devices memio devices: mem, kmem, null, random, urandom, zero, io --- sys/kern/kern_memio.c | 45 ++++++++++++++++++++++++++++++++++++++++- sys/kern/kern_nrandom.c | 10 +++++++++ sys/sys/random.h | 2 ++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/sys/kern/kern_memio.c b/sys/kern/kern_memio.c index 47e12fc8c8..f50a7a762c 100644 --- a/sys/kern/kern_memio.c +++ b/sys/kern/kern_memio.c @@ -75,16 +75,18 @@ static d_write_t mmwrite; static d_ioctl_t mmioctl; static d_mmap_t memmmap; static d_poll_t mmpoll; +static d_kqfilter_t mmkqfilter; #define CDEV_MAJOR 2 static struct dev_ops mem_ops = { - { "mem", CDEV_MAJOR, D_MEM | D_MPSAFE_READ | D_MPSAFE_WRITE }, + { "mem", CDEV_MAJOR, D_MEM | D_MPSAFE_READ | D_MPSAFE_WRITE | D_KQFILTER }, .d_open = mmopen, .d_close = mmclose, .d_read = mmread, .d_write = mmwrite, .d_ioctl = mmioctl, .d_poll = mmpoll, + .d_kqfilter = mmkqfilter, .d_mmap = memmmap, }; @@ -546,6 +548,47 @@ mmpoll(struct dev_poll_args *ap) return (0); } +static int +mm_filter_read(struct knote *kn, long hint) +{ + return (1); +} + +static void +dummy_filter_detach(struct knote *kn) {} + +static struct filterops random_read_filtops = + { 1, NULL, dummy_filter_detach, random_filter_read }; + +static struct filterops mm_read_filtops = + { 1, NULL, dummy_filter_detach, mm_filter_read }; + +int +mmkqfilter(struct dev_kqfilter_args *ap) +{ + struct knote *kn = ap->a_kn; + cdev_t dev = ap->a_head.a_dev; + + ap->a_result = 0; + switch (kn->kn_filter) { + case EVFILT_READ: + switch (minor(dev)) { + case 3: + kn->kn_fop = &random_read_filtops; + break; + default: + kn->kn_fop = &mm_read_filtops; + break; + } + break; + default: + ap->a_result = 1; + return (0); + } + + return (0); +} + int iszerodev(cdev_t dev) { diff --git a/sys/kern/kern_nrandom.c b/sys/kern/kern_nrandom.c index 60205a4359..5ad67d6035 100644 --- a/sys/kern/kern_nrandom.c +++ b/sys/kern/kern_nrandom.c @@ -128,6 +128,7 @@ #include #include #include +#include #include #include #include @@ -521,6 +522,15 @@ random_poll(cdev_t dev, int events) return (revents); } +/* + * Kqueue filter (always succeeds) + */ +int +random_filter_read(struct knote *kn, long hint) +{ + return (1); +} + /* * Heavy weight random number generator. May return less then the * requested number of bytes. diff --git a/sys/sys/random.h b/sys/sys/random.h index c53817dc4e..f19d562dc6 100644 --- a/sys/sys/random.h +++ b/sys/sys/random.h @@ -95,7 +95,9 @@ u_int read_random_unlimited(void *buf, u_int size); u_int write_random(const char *buf, u_int nbytes); #endif struct thread; +struct knote; int random_poll(cdev_t dev, int events); +int random_filter_read(struct knote *kn, long hint); #endif /* _KERNEL */ -- 2.41.0