Module Name: src Committed By: jmcneill Date: Tue Feb 8 23:06:25 UTC 2011
Modified Files: src/sys/dev/wscons: wsdisplay_vcons.c wsdisplay_vconsvar.h Log Message: VCONS_DRAW_INTR changes: - use softint instead of workqueue for drawing - track scr_dirty with atomic_ops To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/dev/wscons/wsdisplay_vcons.c cvs rdiff -u -r1.15 -r1.16 src/sys/dev/wscons/wsdisplay_vconsvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/wscons/wsdisplay_vcons.c diff -u src/sys/dev/wscons/wsdisplay_vcons.c:1.21 src/sys/dev/wscons/wsdisplay_vcons.c:1.22 --- src/sys/dev/wscons/wsdisplay_vcons.c:1.21 Tue Feb 8 13:40:35 2011 +++ src/sys/dev/wscons/wsdisplay_vcons.c Tue Feb 8 23:06:25 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplay_vcons.c,v 1.21 2011/02/08 13:40:35 jmcneill Exp $ */ +/* $NetBSD: wsdisplay_vcons.c,v 1.22 2011/02/08 23:06:25 jmcneill Exp $ */ /*- * Copyright (c) 2005, 2006 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.21 2011/02/08 13:40:35 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wsdisplay_vcons.c,v 1.22 2011/02/08 23:06:25 jmcneill Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -123,7 +123,7 @@ #endif #ifdef VCONS_DRAW_INTR static void vcons_intr(void *); -static void vcons_intr_work(struct work *, void *); +static void vcons_softintr(void *); static void vcons_intr_enable(device_t); #endif @@ -173,8 +173,8 @@ &vd->drawing_thread, "vcons_draw"); #endif #ifdef VCONS_DRAW_INTR - workqueue_create(&vd->intr_wq, "vcons_draw", - vcons_intr_work, vd, PRI_KTHREAD, IPL_TTY, WQ_MPSAFE); + vd->intr_softint = softint_establish(SOFTINT_SERIAL, + vcons_softintr, vd); callout_init(&vd->intr, 0); callout_setfunc(&vd->intr, vcons_intr, vd); @@ -582,7 +582,7 @@ #endif #ifdef VCONS_DRAW_INTR - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); #endif } @@ -659,7 +659,7 @@ #endif #ifdef VCONS_DRAW_INTR - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); #endif } @@ -727,7 +727,7 @@ len * sizeof(uint16_t)); #ifdef VCONS_DRAW_INTR - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); #endif } @@ -806,7 +806,7 @@ } #ifdef VCONS_DRAW_INTR - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); #endif } @@ -863,7 +863,7 @@ #endif #ifdef VCONS_DRAW_INTR - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); #endif } @@ -906,7 +906,7 @@ if (scr->scr_ri.ri_crow != row || scr->scr_ri.ri_ccol != col) { scr->scr_ri.ri_crow = row; scr->scr_ri.ri_ccol = col; - scr->scr_dirty++; + atomic_inc_uint(&scr->scr_dirty); } vcons_unlock(scr); return; @@ -1416,20 +1416,23 @@ { struct vcons_data *vd = cookie; - workqueue_enqueue(vd->intr_wq, &vd->wk, NULL); + softint_schedule(vd->intr_softint); } static void -vcons_intr_work(struct work *wk, void *cookie) +vcons_softintr(void *cookie) { struct vcons_data *vd = cookie; struct vcons_screen *scr = vd->active; + unsigned int dirty; if (scr) { - if (!SCREEN_IS_BUSY(scr) && scr->scr_dirty > 0) { - if ((scr->scr_flags & VCONS_NO_REDRAW) == 0) - vcons_redraw_screen(scr); - scr->scr_dirty = 0; + if (!SCREEN_IS_BUSY(scr)) { + dirty = atomic_swap_uint(&scr->scr_dirty, 0); + if (dirty > 0) { + if ((scr->scr_flags & VCONS_NO_REDRAW) == 0) + vcons_redraw_screen(scr); + } } } Index: src/sys/dev/wscons/wsdisplay_vconsvar.h diff -u src/sys/dev/wscons/wsdisplay_vconsvar.h:1.15 src/sys/dev/wscons/wsdisplay_vconsvar.h:1.16 --- src/sys/dev/wscons/wsdisplay_vconsvar.h:1.15 Tue Feb 8 13:40:35 2011 +++ src/sys/dev/wscons/wsdisplay_vconsvar.h Tue Feb 8 23:06:25 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: wsdisplay_vconsvar.h,v 1.15 2011/02/08 13:40:35 jmcneill Exp $ */ +/* $NetBSD: wsdisplay_vconsvar.h,v 1.16 2011/02/08 23:06:25 jmcneill Exp $ */ /*- * Copyright (c) 2005, 2006 Michael Lorenz @@ -32,8 +32,6 @@ #include "opt_wsdisplay_compat.h" #include "opt_vcons.h" -#include <sys/workqueue.h> - struct vcons_data; struct vcons_screen { @@ -76,7 +74,7 @@ int scr_current_offset; #endif #ifdef VCONS_DRAW_INTR - int scr_dirty; + unsigned int scr_dirty; #endif }; @@ -139,8 +137,7 @@ #endif #ifdef VCONS_DRAW_INTR callout_t intr; - struct workqueue *intr_wq; - struct work wk; + void *intr_softint; int use_intr; /* use intr drawing when non-zero */ #endif };