Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
Re: wsmux(4): mp-safe filterops
To:
Vitaliy Makkoveev <mvs@openbsd.org>
Cc:
"Kirill A. Korinsky" <kirill@openbsd.org>, tech@openbsd.org
Date:
Wed, 22 Jan 2025 15:13:35 +0100

Download raw body.

Thread
On Wed, Jan 22, 2025 at 12:22:06AM +0300, Vitaliy Makkoveev wrote:
> The next one of the wscons(4) devices.

OK bluhm@

> Index: sys/dev/wscons/wsmux.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/wscons/wsmux.c,v
> retrieving revision 1.60
> diff -u -p -r1.60 wsmux.c
> --- sys/dev/wscons/wsmux.c	30 Dec 2024 02:46:00 -0000	1.60
> +++ sys/dev/wscons/wsmux.c	21 Jan 2025 21:09:22 -0000
> @@ -208,7 +208,7 @@ wsmuxopen(dev_t dev, int flags, int mode
>  		return (EBUSY);
>  
>  	evar = &sc->sc_base.me_evar;
> -	if (wsevent_init(evar))
> +	if (wsevent_init_flags(evar, WSEVENT_MPSAFE))
>  		return (EBUSY);
>  #ifdef WSDISPLAY_COMPAT_RAWKBD
>  	sc->sc_rawkbd = 0;
> @@ -385,7 +385,7 @@ wsmux_do_ioctl(struct device *dv, u_long
>  	struct wsmux_softc *sc = (struct wsmux_softc *)dv;
>  	struct wsevsrc *me;
>  	int error, ok;
> -	int s, put, get, n;
> +	int put, get, n;
>  	struct wseventvar *evar;
>  	struct wscons_event *ev;
>  	struct wsmux_device_list *l;
> @@ -415,13 +415,12 @@ wsmux_do_ioctl(struct device *dv, u_long
>  			return (0);
>  		}
>  
> -		s = spltty();
> +		mtx_enter(&evar->ws_mtx);
>  		get = evar->ws_get;
>  		put = evar->ws_put;
>  		ev = &evar->ws_q[put];
>  		if (++put % WSEVENT_QSIZE == get) {
> -			put--;
> -			splx(s);
> +			mtx_leave(&evar->ws_mtx);
>  			return (ENOSPC);
>  		}
>  		if (put >= WSEVENT_QSIZE)
> @@ -429,8 +428,8 @@ wsmux_do_ioctl(struct device *dv, u_long
>  		*ev = *(struct wscons_event *)data;
>  		nanotime(&ev->time);
>  		evar->ws_put = put;
> -		WSEVENT_WAKEUP(evar);
> -		splx(s);
> +		mtx_leave(&evar->ws_mtx);
> +		wsevent_wakeup(evar);
>  		return (0);
>  	case WSMUXIO_ADD_DEVICE:
>  #define d ((struct wsmux_device *)data)
> @@ -496,7 +495,9 @@ wsmux_do_ioctl(struct device *dv, u_long
>  		evar = sc->sc_base.me_evp;
>  		if (evar == NULL)
>  			return (EINVAL);
> +		mtx_enter(&evar->ws_mtx);
>  		evar->ws_async = *(int *)data != 0;
> +		mtx_leave(&evar->ws_mtx);
>  		return (0);
>  	case FIOGETOWN:
>  	case TIOCGPGRP: