Message ID | 20220903012429.22555-1-hanjinke.666@bytedance.com |
---|---|
State | Awaiting Upstream |
Headers | show |
Series | [v2] ext4: place buffer head allocation before handle start | expand |
On Sat, 3 Sep 2022 09:24:29 +0800, Jinke Han wrote: > From: Jinke Han <hanjinke.666@bytedance.com> > > In our product environment, we encounter some jbd hung waiting handles to > stop while several writters were doing memory reclaim for buffer head > allocation in delay alloc write path. Ext4 do buffer head allocation with > holding transaction handle which may be blocked too long if the reclaim > works not so smooth. According to our bcc trace, the reclaim time in > buffer head allocation can reach 258s and the jbd transaction commit also > take almost the same time meanwhile. Except for these extreme cases, > we often see several seconds delays for cgroup memory reclaim on our > servers. This is more likely to happen considering docker environment. > > [...] Applied, thanks! [1/1] ext4: place buffer head allocation before handle start commit: 843b6ee4b8d0d9e7507dad491920db1fbde12439 Best regards,
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 601214453c3a..0d6c4ec7c840 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -1188,6 +1188,13 @@ static int ext4_write_begin(struct file *file, struct address_space *mapping, page = grab_cache_page_write_begin(mapping, index); if (!page) return -ENOMEM; + /* + * The same as page allocation, we prealloc buffer heads before + * starting the handle. + */ + if (!page_has_buffers(page)) + create_empty_buffers(page, inode->i_sb->s_blocksize, 0); + unlock_page(page); retry_journal: