On Sun, Jan 28, 2024 at 04:45:32PM +0100, Michal Hocko wrote: > On Fri 26-01-24 17:07:56, Kent Overstreet wrote: > > If we're using PF_MEMALLOC, we might have a fallback and might not to > > warn about a failing allocation - thus we need a PF_* equivalent of > > __GFP_NOWARN. > > Could you be more specific about the user? Is this an allocation from > the reclaim path or an explicit PF_MEMALLOC one? It would be also really > helpful to explain why GFP_NOWARN cannot be used directly. Explicit PF_MEMALLOC. It's for a call to alloc_inode(), which doesn't take gfp flags, and plumbing it would require modifying a s_ops callback and would touch every filesystem - but we want to get away from gfp flags anyways :) More specifically, the code where I'm using it is doing a "try GFP_NOWAIT first; if that fails drop locks and do GFP_KERNEL" dance; it's part of a cleanup for some weird lifetime stuff related to fs/inode.c. #define memalloc_flags_do(_flags, _do) \ ({ \ unsigned _saved_flags = memalloc_flags_save(_flags); \ typeof(_do) _ret = _do; \ memalloc_noreclaim_restore(_saved_flags); \ _ret; \ }) /* * Allocate a new inode, dropping/retaking btree locks if necessary: */ static struct bch_inode_info *bch2_new_inode(struct btree_trans *trans) { struct bch_fs *c = trans->c; struct bch_inode_info *inode = memalloc_flags_do(PF_MEMALLOC|PF_MEMALLOC_NOWARN, to_bch_ei(new_inode(c->vfs_sb))); if (unlikely(!inode)) { int ret = drop_locks_do(trans, (inode = to_bch_ei(new_inode(c->vfs_sb))) ? 0 : -ENOMEM); if (ret && inode) discard_new_inode(&inode->v); if (ret) return ERR_PTR(ret); } return inode; }