Re: [PATCH 5.15 000/251] 5.15.47-rc2 review

Jan Kara
2022-06-15T13:38:57Z

[-- Attachment #1: Type: text/plain, Size: 900 bytes --]

On Wed 15-06-22 13:00:22, Jan Kara wrote:
> On Tue 14-06-22 12:00:22, Linus Torvalds wrote:
> > On Tue, Jun 14, 2022 at 11:51 AM Linus Torvalds
> > <torvalds@linux-foundation.org> wrote:
> > >
> > > Or just make sure that noop_backing_dev_info is fully initialized
> > > before it's used.
> >
> > I don't see any real reason why that
> >
> > err = bdi_init(&noop_backing_dev_info);
> >
> > couldn't just be done very early. Maybe as the first call in
> > driver_init(), before the whole devtmpfs_init() etc.
>
> I've checked the dependencies and cgroups (which are the only non-trivial
> dependency besides per-CPU infrastructure) are initialized early enough so
> it should work fine. So let's try that.

Attached patch boots for me. Guys, who was able to reproduce the failure: Can
you please confirm this patch fixes your problem?

Honza
--
Jan Kara <jack@suse.com>
SUSE Labs, CR

[-- Attachment #2: 0001-init-Initialized-noop_backing_dev_info-early.patch --]
[-- Type: text/x-patch, Size: 2370 bytes --]

From 8f998b182be7563fc92aa8914cc7d21f75a3c20e Mon Sep 17 00:00:00 2001
From: Jan Kara <jack@suse.cz>
Date: Wed, 15 Jun 2022 15:22:29 +0200
Subject: [PATCH] init: Initialized noop_backing_dev_info early

noop_backing_dev_info is used by superblocks of various
pseudofilesystems such as kdevtmpfs. Initialize it before the
filesystems get mounted.

Signed-off-by: Jan Kara <jack@suse.cz>
---
drivers/base/init.c | 2 ++
include/linux/backing-dev.h | 2 ++
mm/backing-dev.c | 11 ++---------
3 files changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/base/init.c b/drivers/base/init.c
index d8d0fe687111..397eb9880cec 100644
--- a/drivers/base/init.c
+++ b/drivers/base/init.c
@@ -8,6 +8,7 @@
#include <linux/init.h>
#include <linux/memory.h>
#include <linux/of.h>
+#include <linux/backing-dev.h>

#include "base.h"

@@ -20,6 +21,7 @@
void __init driver_init(void)
{
/* These are the core pieces */
+ bdi_init(&noop_backing_dev_info);
devtmpfs_init();
devices_init();
buses_init();
diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h
index 2bd073fa6bb5..f0baef68f90f 100644
--- a/include/linux/backing-dev.h
+++ b/include/linux/backing-dev.h
@@ -119,6 +119,8 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);

extern struct backing_dev_info noop_backing_dev_info;

+extern int bdi_init(struct backing_dev_info *bdi);
+
/**
* writeback_in_progress - determine whether there is writeback in progress
* @wb: bdi_writeback of interest
diff --git a/mm/backing-dev.c b/mm/backing-dev.c
index ff60bd7d74e0..95550b8fa7fe 100644
--- a/mm/backing-dev.c
+++ b/mm/backing-dev.c
@@ -231,20 +231,13 @@ static __init int bdi_class_init(void)
}
postcore_initcall(bdi_class_init);

-static int bdi_init(struct backing_dev_info *bdi);
-
static int __init default_bdi_init(void)
{
- int err;
-
bdi_wq = alloc_workqueue("writeback", WQ_MEM_RECLAIM | WQ_UNBOUND |
WQ_SYSFS, 0);
if (!bdi_wq)
return -ENOMEM;
-
- err = bdi_init(&noop_backing_dev_info);
-
- return err;
+ return 0;
}
subsys_initcall(default_bdi_init);

@@ -781,7 +774,7 @@ static void cgwb_remove_from_bdi_list(struct bdi_writeback *wb)

#endif /* CONFIG_CGROUP_WRITEBACK */

-static int bdi_init(struct backing_dev_info *bdi)
+int bdi_init(struct backing_dev_info *bdi)
{
int ret;

--
2.35.3