This works. Thanks On Mon, Feb 10, 2020 at 10:50 PM Jens Axboe <axboe@xxxxxxxxx> wrote: > > On 2/10/20 8:45 PM, Glauber Costa wrote: > > It crashes all the same > > > > New backtrace attached - looks very similar to the old one, although > > not identical. > > I missed the other spot we do the same thing... Try this. > > > diff --git a/fs/io-wq.c b/fs/io-wq.c > index 182aa17dc2ca..b8ef5a5483de 100644 > --- a/fs/io-wq.c > +++ b/fs/io-wq.c > @@ -1115,12 +1116,15 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) > > for_each_node(node) { > struct io_wqe *wqe; > + int alloc_node = node; > > - wqe = kzalloc_node(sizeof(struct io_wqe), GFP_KERNEL, node); > + if (!node_online(alloc_node)) > + alloc_node = NUMA_NO_NODE; > + wqe = kzalloc_node(sizeof(struct io_wqe), GFP_KERNEL, alloc_node); > if (!wqe) > goto err; > wq->wqes[node] = wqe; > - wqe->node = node; > + wqe->node = alloc_node; > wqe->acct[IO_WQ_ACCT_BOUND].max_workers = bounded; > atomic_set(&wqe->acct[IO_WQ_ACCT_BOUND].nr_running, 0); > if (wq->user) { > @@ -1128,7 +1132,6 @@ struct io_wq *io_wq_create(unsigned bounded, struct io_wq_data *data) > task_rlimit(current, RLIMIT_NPROC); > } > atomic_set(&wqe->acct[IO_WQ_ACCT_UNBOUND].nr_running, 0); > - wqe->node = node; > wqe->wq = wq; > spin_lock_init(&wqe->lock); > INIT_WQ_LIST(&wqe->work_list); > > -- > Jens Axboe >