On 04/06/14(Wed) 17:02, Stefan Sperling wrote:
> On Wed, Jun 04, 2014 at 09:51:08AM -0400, Eduardo Lopes wrote:
> > Hi, 
> > 
> > With this snapshot, the same steps yeld a kernel trap:
> > 
> > uvm_fault(0xfffffe8135047b68, 0x0, 0, 1) -> e
> > kernel: page fault trap, code=0
> > Stopped at      pms_enable_alps+0xbd:   movl    0(%r12),%eax
> > 
> > ddb trace:
> > 
> > pms_enable_alps() at pms_enable_alps+0xbd
> > pms_protocol_lookup() at pms_protocol_lookup+0x34
> > pms_change_state() at pms_change_state+0x106
> > wsmouseopen() at wsmouseopen+0xbf
> > spec_open() at spec_open+0x213
> > VOP_OPEN() at VOP_OPEN+0x3f
> > vn_open() at vn_open+0x16f
> > doopenat() at doopenat+0x132
> > syscall() at syscall+0x297
> > --- syscall (number 5) ---
> > end trace frame: 0x0, count: -9
> > 0x343ce1f5d0a:
> 
> Try disabling wsmoused as a workaround.
> There is a known bug, perhaps related:
> http://marc.info/?l=openbsd-misc&m=137811690307634&w=2
> I tried tracking this down once but didn't get very far.

Could you try the diff below and tell me if it fixes your problem?

Index: pms.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/pckbc/pms.c,v
retrieving revision 1.52
diff -u -p -r1.52 pms.c
--- pms.c       12 Jul 2014 18:48:52 -0000      1.52
+++ pms.c       24 Jul 2014 08:09:04 -0000
@@ -26,6 +26,7 @@
 
 #include <sys/param.h>
 #include <sys/systm.h>
+#include <sys/rwlock.h>
 #include <sys/device.h>
 #include <sys/ioctl.h>
 #include <sys/malloc.h>
@@ -148,6 +149,8 @@ struct pms_softc {          /* driver status inf
 #define PMS_STATE_ENABLED      1
 #define PMS_STATE_SUSPENDED    2
 
+       struct rwlock sc_state_lock;
+
        int sc_dev_enable;
 #define PMS_DEV_IGNORE         0x00
 #define PMS_DEV_PRIMARY                0x01
@@ -662,6 +665,8 @@ pmsattach(struct device *parent, struct 
        a.accessops = &pms_accessops;
        a.accesscookie = sc;
 
+       rw_init(&sc->sc_state_lock, "pmsst");
+
        /*
         * Attach the wsmouse, saving a handle to it.
         * Note that we don't need to check this pointer against NULL
@@ -762,8 +767,13 @@ int
 pms_enable(void *v)
 {
        struct pms_softc *sc = v;
+       int rv;
 
-       return pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY);
+       rw_enter_write(&sc->sc_state_lock);
+       rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_PRIMARY);
+       rw_exit_write(&sc->sc_state_lock);
+
+       return (rv);
 }
 
 void
@@ -771,7 +781,9 @@ pms_disable(void *v)
 {
        struct pms_softc *sc = v;
 
+       rw_enter_write(&sc->sc_state_lock);
        pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_PRIMARY);
+       rw_exit_write(&sc->sc_state_lock);
 }
 
 int
@@ -789,8 +801,13 @@ int
 pms_sec_enable(void *v)
 {
        struct pms_softc *sc = v;
+       int rv;
+
+       rw_enter_write(&sc->sc_state_lock);
+       rv = pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_SECONDARY);
+       rw_exit_write(&sc->sc_state_lock);
 
-       return (pms_change_state(sc, PMS_STATE_ENABLED, PMS_DEV_SECONDARY));
+       return (rv);
 }
 
 void
@@ -798,7 +815,9 @@ pms_sec_disable(void *v)
 {
        struct pms_softc *sc = v;
 
+       rw_enter_write(&sc->sc_state_lock);
        pms_change_state(sc, PMS_STATE_DISABLED, PMS_DEV_SECONDARY);
+       rw_exit_write(&sc->sc_state_lock);
 }
 
 int

Reply via email to