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
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;