Bug 22302 - 2.6.36 BUG: scheduling while atomic: rc.sysinit/1376/0x00000002
2.6.36 BUG: scheduling while atomic: rc.sysinit/1376/0x00000002
Status: CLOSED CODE_FIX
Product: File System
Classification: Unclassified
Component: ext4
All Linux
: P1 normal
Assigned To: fs_ext4@kernel-bugs.osdl.org
:
Depends on:
Blocks: 16444
  Show dependency treegraph
 
Reported: 2010-11-07 08:18 UTC by Maciej Rutecki
Modified: 2010-11-16 18:27 UTC (History)
5 users (show)

See Also:
Kernel Version: 2.6.36
Tree: Mainline
Regression: Yes


Attachments

Description Maciej Rutecki 2010-11-07 08:18:56 UTC
Subject    : 2.6.36 BUG: scheduling while atomic: rc.sysinit/1376/0x00000002
Submitter  : Mathias Burén <mathias.buren@gmail.com>
Date       : 2010-11-01 18:39
Message-ID : AANLkTi=kkW7ruOVp7mPsMDWRRkL2CqrOJCyZqxj_Vekm@mail.gmail.com
References : http://marc.info/?l=linux-kernel&m=128863676810517&w=2

This entry is being used for tracking a regression from 2.6.35. Please don't
close it until the problem is fixed in the mainline.
Comment 1 Theodore Tso 2010-11-07 22:25:01 UTC
This is caused by an interaction in two changes that happened in parallel in 2.6.36: commit id's dd3932eddf4 (block: remove BLKDEV_IFL_WAIT) and 
commit 5c521830cf3 (ext4: Support discard requests when running in no-journal mode).

The problem is that ext4_free_blocks() can be called by functions which are holding spinlocks, so it can't sleep --- and sb_issue_discard() now always waits for the discard to be completed.  It doesn't support an asynchronous mode at all.

The fix for the short-term is to remove the call to ext4_issue_discard() in ext4_free_blocks().  This effectively removes the functionality of commit  5c521830cf3.  The long-term fix would be to implement a version of sb_issue_discard() which supports asynchronous mode, with an optional callback.
Comment 2 Florian Mickler 2010-11-16 18:26:42 UTC
Fixed by:
commit b56ff9d397cecdaad6c98c9d57cc6fea475e1f50
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Mon Nov 8 13:49:33 2010 -0500

    ext4: Don't call sb_issue_discard() in ext4_free_blocks()

Note You need to log in before you can comment on or make changes to this bug.