From owner-freebsd-current@FreeBSD.ORG Thu Feb 27 05:28:58 2014 Return-Path: Delivered-To: freebsd-current@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A61E2B9B for ; Thu, 27 Feb 2014 05:28:58 +0000 (UTC) Received: from smtp.mei.co.jp (smtp.mei.co.jp [133.183.100.20]) by mx1.freebsd.org (Postfix) with ESMTP id 5CB93179B for ; Thu, 27 Feb 2014 05:28:57 +0000 (UTC) Received: from mail-gw.jp.panasonic.com ([157.8.1.157]) by smtp.mei.co.jp (8.12.11.20060614/3.7W/kc-maile13) with ESMTP id s1R5SuSg007885 for ; Thu, 27 Feb 2014 14:28:57 +0900 (JST) Received: from epochmail.jp.panasonic.com ([157.8.1.130]) by mail.jp.panasonic.com (8.11.6p2/3.7W/kc-maili14) with ESMTP id s1R5SuL16799 for ; Thu, 27 Feb 2014 14:28:56 +0900 Received: by epochmail.jp.panasonic.com (8.12.11.20060308/3.7W/lomi11) id s1R5Su6I013437; Thu, 27 Feb 2014 14:28:56 +0900 Received: from localhost by lomi11.jp.panasonic.com (8.12.11.20060308/3.7W) with ESMTP id s1R5SuRR013421; Thu, 27 Feb 2014 14:28:56 +0900 Date: Thu, 27 Feb 2014 14:28:56 +0900 (JST) Message-Id: <20140227.142856.2042578813223062509.okuno.kohji@jp.panasonic.com> To: freebsd-current@FreeBSD.org Subject: kqueue for KBD. From: Kohji Okuno Organization: Panasonic Corporation X-Mailer: Mew version 6.5 on Emacs 24.3 / Mule 6.0 (HANACHIRUSATO) Mime-Version: 1.0 Content-Type: Multipart/Mixed; boundary="--Next_Part(Thu_Feb_27_14_28_56_2014_367)--" Content-Transfer-Encoding: 7bit Cc: okuno.kohji@jp.panasonic.com X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 27 Feb 2014 05:28:58 -0000 ----Next_Part(Thu_Feb_27_14_28_56_2014_367)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Hi, I tried add kqueue I/F to kbd.c. I attached my patch. What do you think about my patch? Best regards, Kohji Okuno ----Next_Part(Thu_Feb_27_14_28_56_2014_367)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="kbd_kqueue.patch" diff --git a/sys/dev/kbd/kbd.c b/sys/dev/kbd/kbd.c index 8036762..df000ab 100644 --- a/sys/dev/kbd/kbd.c +++ b/sys/dev/kbd/kbd.c @@ -59,6 +59,9 @@ typedef struct genkbd_softc { char gkb_q[KB_QSIZE]; /* input queue */ unsigned int gkb_q_start; unsigned int gkb_q_length; +#if 1 + unsigned int gkb_index; +#endif } genkbd_softc_t; static SLIST_HEAD(, keyboard_driver) keyboard_drivers = @@ -472,6 +475,9 @@ static d_read_t genkbdread; static d_write_t genkbdwrite; static d_ioctl_t genkbdioctl; static d_poll_t genkbdpoll; +#if 1 +static d_kqfilter_t genkbdkqfilter; +#endif static struct cdevsw kbd_cdevsw = { @@ -483,6 +489,9 @@ static struct cdevsw kbd_cdevsw = { .d_write = genkbdwrite, .d_ioctl = genkbdioctl, .d_poll = genkbdpoll, +#if 1 + .d_kqfilter = genkbdkqfilter, +#endif .d_name = "kbd", }; @@ -500,6 +509,13 @@ kbd_attach(keyboard_t *kbd) make_dev_alias(kbd->kb_dev, "kbd%r", kbd->kb_index); kbd->kb_dev->si_drv1 = malloc(sizeof(genkbd_softc_t), M_DEVBUF, M_WAITOK | M_ZERO); +#if 1 + { + genkbd_softc_t *sc = kbd->kb_dev->si_drv1; + sc->gkb_index = KBD_INDEX(kbd->kb_dev); + knlist_init_mtx(&sc->gkb_rsel.si_note, NULL); + } +#endif printf("kbd%d at %s%d\n", kbd->kb_index, kbd->kb_name, kbd->kb_unit); return (0); } @@ -697,6 +713,73 @@ genkbdioctl(struct cdev *dev, u_long cmd, caddr_t arg, int flag, struct thread * return (error); } +#if 1 +static void +genkbd_kqops_detach(struct knote *kn) +{ + genkbd_softc_t *sc; + sc = kn->kn_hook; + knlist_remove(&sc->gkb_rsel.si_note, kn, 0); +} + +static int +genkbd_kqops_event(struct knote *kn, long hint) +{ + keyboard_t *kbd; + genkbd_softc_t *sc; + + sc = kn->kn_hook; + kbd = kbd_get_keyboard(sc->gkb_index); + + if ((kbd == NULL) || !KBD_IS_VALID(kbd)) { + return 1; /* the keyboard has gone */ + } + else { + if (sc->gkb_q_length > 0) + return 1; + else + return 0; + } + +} +static struct filterops genkbd_kqops = +{ + .f_isfd = 1, + .f_attach = NULL, + .f_detach = genkbd_kqops_detach, + .f_event = genkbd_kqops_event, +}; +static int +genkbdkqfilter(struct cdev *dev, struct knote *kn) +{ + keyboard_t *kbd; + genkbd_softc_t *sc; + int error = 0; + int s; + + s = spltty(); + sc = dev->si_drv1; + kbd = kbd_get_keyboard(KBD_INDEX(dev)); + if ((sc == NULL) || (kbd == NULL) || !KBD_IS_VALID(kbd)) { + error = EIO; + } + else { + switch (kn->kn_filter) { + case EVFILT_READ: + kn->kn_fop = &genkbd_kqops; + kn->kn_hook = (void *)sc; + knlist_add(&sc->gkb_rsel.si_note, kn, 0); + break; + default: + error = EOPNOTSUPP; + break; + } + } + splx(s); + return (error); +} +#endif + static int genkbdpoll(struct cdev *dev, int events, struct thread *td) { @@ -744,6 +827,9 @@ genkbd_event(keyboard_t *kbd, int event, void *arg) wakeup(sc); } selwakeuppri(&sc->gkb_rsel, PZERO); +#if 1 + knlist_clear(&sc->gkb_rsel.si_note, 0); +#endif return (0); default: return (EINVAL); @@ -814,6 +900,9 @@ genkbd_event(keyboard_t *kbd, int event, void *arg) wakeup(sc); } selwakeuppri(&sc->gkb_rsel, PZERO); +#if 1 + KNOTE_UNLOCKED(&sc->gkb_rsel.si_note, 0); +#endif } return (0); ----Next_Part(Thu_Feb_27_14_28_56_2014_367)----