On Fri, Jan 21, 2022 at 07:54:29PM +1100, Jonathan Gray wrote:
> On Thu, Jan 20, 2022 at 04:08:28PM -0700, Thomas Frohwein wrote:
> > On Fri, Jan 21, 2022 at 12:22:49AM +1100, Jonathan Gray wrote:
> > > On Wed, Jan 19, 2022 at 11:04:26PM -0800, [email protected] wrote:
> > [...]
> > > > The backtrace is kinda nonsensical, showing a copyout() call with no
> > > > predecessor, but maybe that's just from copy*() not setting up a proper
> > > > frame? However, that's not a change. Neither has there been any
> > > > change
> > > > in the pmap layer in multiple months. The areas of concern IMO are DRM
> > > > and (because it was the last thing mentioned) iwm, but the former seems
> > > > _much_ more likely.
> > >
> > > Booting bsd.mp with inteldrm disabled works?
> >
> > yes, boots and uses llvmpipe after I disable inteldrm*
>
> this fixes sleeping with a mtx held found with kern.pool_debug=2
> which may help
thanks, however no change after I built MP kernel and installed it. Still the
same pmap error that I posted in the original bug report.
>
> Index: sys/dev/pci/drm/drm_linux.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v
> retrieving revision 1.88
> diff -u -p -r1.88 drm_linux.c
> --- sys/dev/pci/drm/drm_linux.c 20 Jan 2022 06:33:03 -0000 1.88
> +++ sys/dev/pci/drm/drm_linux.c 21 Jan 2022 07:20:32 -0000
> @@ -936,11 +936,17 @@ int
> __xa_alloc(struct xarray *xa, u32 *id, void *entry, int limit, gfp_t gfp)
> {
> struct xarray_entry *xid;
> - int flags = (gfp & GFP_NOWAIT) ? PR_NOWAIT : PR_WAITOK;
> int start = (xa->xa_flags & XA_FLAGS_ALLOC1) ? 1 : 0;
> int begin;
>
> - xid = pool_get(&xa_pool, flags);
> + if (gfp & GFP_NOWAIT) {
> + xid = pool_get(&xa_pool, PR_NOWAIT);
> + } else {
> + mtx_leave(&xa->xa_lock);
> + xid = pool_get(&xa_pool, PR_WAITOK);
> + mtx_enter(&xa->xa_lock);
> + }
> +
> if (xid == NULL)
> return -ENOMEM;
>
> @@ -997,7 +1003,6 @@ __xa_store(struct xarray *xa, unsigned l
> {
> struct xarray_entry find, *res;
> void *prev;
> - int flags = (gfp & GFP_NOWAIT) ? PR_NOWAIT : PR_WAITOK;
>
> if (entry == NULL)
> return __xa_erase(xa, index);
> @@ -1013,7 +1018,13 @@ __xa_store(struct xarray *xa, unsigned l
> }
>
> /* index not found, add new */
> - res = pool_get(&xa_pool, flags);
> + if (gfp & GFP_NOWAIT) {
> + res = pool_get(&xa_pool, PR_NOWAIT);
> + } else {
> + mtx_leave(&xa->xa_lock);
> + res = pool_get(&xa_pool, PR_WAITOK);
> + mtx_enter(&xa->xa_lock);
> + }
> if (res == NULL)
> return XA_ERROR(-ENOMEM);
> res->id = index;