Skip to contentSkip to conversation

New: SCSI Generic (sg): BUG: sleeping function called from invalid context

Bug 12945 [email protected] 5 participants 12 messages Mar 26, 2009 – Jan 25, 2010 SCSI

lore
Share & tools
lore
#0 lore raw

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
#1 lore raw

[Bug 12945] SCSI Generic (sg): BUG: sleeping function called from invalid context

http://bugzilla.kernel.org/show_bug.cgi?id=12945

--- Comment #1 from Tobias <[email protected]> 2009-03-26 12:29:05 --- Created an attachment (id=20686)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20686)
Stack trace on timeout (2.6.28.7)

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
#2 lore raw

[Bug 12945] SCSI Generic (sg): BUG: sleeping function called from invalid context

In reply to [email protected]

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Andrew Morton <[email protected]> changed:

What |Removed |Added
----------------------------------------------------------------------------

                 CC|                            |[email protected]
         Regression|No                          |Yes
Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
#3 lore raw
In reply to [email protected]

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42

Author:     FUJITA Tomonori <[email protected]>
AuthorDate: Thu Aug 28 16:17:08 2008 +0900
Commit:     Jens Axboe <[email protected]>
CommitDate: Thu Oct 9 08:56:10 2008 +0200

sg: convert the direct IO path to use the block layer

This patch converts the direct IO path (SG_FLAG_DIRECT_IO) to use the block layer functions (blk_get_request, blk_execute_rq_nowait, blk_rq_map_user, etc) instead of scsi_execute_async().

#4 lore raw
Quoted 76 lines · Andrew Morton

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

Quoted 4 lines

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42

Yep, it is. The problem is the usage of:

        blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
                              srp->rq, 1, sg_rq_end_io);

and then doing the sg_finish_rem_req() -> blk_rq_unmap_user() from the end_io path, where other users do a sync request and then unmap from the same context. Hmm. Perhaps we can add some request flag to specify doing the completion from user context, then other users could be converted do the _nowait() approach as well and get some unification/cleanup there as well.

I'll cook up a patch.

Signature · 1 line
Jens Axboe
#5 lore raw
Quoted 82 lines · On Thu, 26 Mar 2009 19:43:02 +0100 Jens Axboe <[email protected]> wrote:
Quoted 76 lines · Andrew Morton

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

Quoted 4 lines

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42

Quoted 8 lines

Yep, it is. The problem is the usage of:

        blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
                              srp->rq, 1, sg_rq_end_io);

and then doing the sg_finish_rem_req() -> blk_rq_unmap_user() from the end_io path, where other users do a sync request and then unmap from the same context.

Right. And only sg does that. I've already converted st and osst to use the block layer but they works synchronously.

Quoted 4 lines

Hmm. Perhaps we can add some request flag to specify doing the completion from user context, then other users could be converted do the _nowait() approach as well and get some unification/cleanup there as well.

Since only sg needs this so I simply fixed sg instead of changing the block layer. But it might be nice if block layer can handle this.

Seems there are several patches for the block layer (including mapping) from Tejun and Boaz. I'll read them to see what we could do. I'm always too busy in March with the company matters.

#6 lore raw
Quoted 90 lines · FUJITA Tomonori
Quoted 87 lines · On Thu, 26 Mar 2009 19:43:02 +0100 Jens Axboe <[email protected]> wrote:
Quoted 76 lines · Andrew Morton

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

Quoted 4 lines

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42

Yep, it is. The problem is the usage of:

        blk_execute_rq_nowait(sdp->device->request_queue, sdp->disk,
                              srp->rq, 1, sg_rq_end_io);
Quoted 6 lines
Quoted 3 lines

and then doing the sg_finish_rem_req() -> blk_rq_unmap_user() from the end_io path, where other users do a sync request and then unmap from the same context.

Right. And only sg does that. I've already converted st and osst to use the block layer but they works synchronously.

Precisely.

Quoted 6 lines
Quoted 5 lines

Hmm. Perhaps we can add some request flag to specify doing the completion from user context, then other users could be converted do the _nowait() approach as well and get some unification/cleanup there as well.

Quoted 6 lines

Since only sg needs this so I simply fixed sg instead of changing the block layer. But it might be nice if block layer can handle this.

Seems there are several patches for the block layer (including mapping) from Tejun and Boaz. I'll read them to see what we could do. I'm always too busy in March with the company matters.

OK, let me know what you find in the scsi tree. I'll hold off on this one.

Signature · 1 line
Jens Axboe
#7 lore raw
In reply to Andrew Morton
Quoted 91 lines · Andrew Morton

(switched to email.  Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

           Summary: SCSI Generic (sg): BUG: sleeping function called from invalid context
           Product: SCSI Drivers
           Version: 2.5
    Kernel Version: 2.6.28.9
          Platform: All
        OS/Version: Linux
              Tree: Mainline
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Other
        AssignedTo: [email protected]
        ReportedBy: [email protected]
        Regression: No

Created an attachment (id=20685)
 --> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh.  sg_finish_rem_req() is called from interrupt context.  But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule().  If it does call schedule(), the machine will crash.

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42
Author:     FUJITA Tomonori <[email protected]>
AuthorDate: Thu Aug 28 16:17:08 2008 +0900
Commit:     Jens Axboe <[email protected]>
CommitDate: Thu Oct 9 08:56:10 2008 +0200

   sg: convert the direct IO path to use the block layer

   This patch converts the direct IO path (SG_FLAG_DIRECT_IO) to use the block layer functions (blk_get_request, blk_execute_rq_nowait, blk_rq_map_user, etc) instead of scsi_execute_async().

Quoted 7 lines

Andrew,

thank you for your quick response. So as a temporary workaround I will not use direct I/O and wait for a patch.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

#8 lore raw
In reply to Andrew Morton
Quoted 71 lines · On Thu, 26 Mar 2009 07:49:52 -0700 Andrew Morton <[email protected]>…

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 56 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)
--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic driver for this.

My test program uses read() and write() (instead of ioctl) to send requests to the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped the entire CD), I am often rewarded with messages like "BUG: sleeping function called from invalid context at linux-2.6.28.9/include/linux/pagemap.h:347". I have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD drive doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at /mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283 [scsi_mod]
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b [scsi_mod]
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
Quoted 8 lines
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6 [processor]
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6 [processor]
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73
Quoted 7 lines

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

I think that I've already fixed this bug. The patch has been in James' tree. It will be backported to stable trees once the patch is merged into mainline.

Sorry about the bug.

#9 lore raw

[Bug 12945] SCSI Generic (sg): BUG: sleeping function called from invalid context

In reply to [email protected]

http://bugzilla.kernel.org/show_bug.cgi?id=12945

--- Comment #2 from Tobias <[email protected]> 2009-03-26 18:38:47 ---

Quoted 26 lines · Andrew Morton

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 20 lines · On Thu, 26 Mar 2009 12:27:53 GMT [email protected]:

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Summary: SCSI Generic (sg): BUG: sleeping function called from
invalid context
Product: SCSI Drivers
Version: 2.5
Kernel Version: 2.6.28.9
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: normal
Priority: P1
Component: Other
AssignedTo: [email protected]
ReportedBy: [email protected]
Regression: No

Created an attachment (id=20685)

--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)

Quoted 76 lines
Quoted 4 lines

--> (http://bugzilla.kernel.org/attachment.cgi?id=20685)
Stack trace on program kill (2.6.28.9)

I am experimenting with CD audio extraction. I use the SCSI Generic

driver for

Quoted 3 lines

this.

My test program uses read() and write() (instead of ioctl) to send

requests to

Quoted 3 lines

the driver and receive responses. I use SG_FLAG_DIRECT_IO.

When I kill my program (because I don't want to wait until it has ripped

the

Quoted 1 line

entire CD), I am often rewarded with messages like "BUG: sleeping

function

Quoted 1 line

called from invalid context at

linux-2.6.28.9/include/linux/pagemap.h:347". I

Quoted 3 lines

have attached typical stack trace.

Another case when I hit this BUG is when I set a time out and the CD

drive

Quoted 3 lines

doesn't respond fast enough. A stack trace is attached.

[34215.786870] BUG: sleeping function called from invalid context at

/mnt/var-pub/src/linux-2.6.28.9/include/linux/pagemap.h:347

Quoted 5 lines
[34215.786880] in_atomic(): 1, irqs_disabled(): 1, pid: 0, name: swapper
[34215.786886] Pid: 0, comm: swapper Not tainted 2.6.28.9 #1
[34215.786890] Call Trace:
[34215.786894]  <IRQ>  [<ffffffff8026c4cc>] set_page_dirty_lock+0x1a/0x45
[34215.786911]  [<ffffffff802ae17d>] bio_unmap_user+0x1e/0x4a
Quoted 8 lines
[34215.786920]  [<ffffffff802e876b>] __blk_rq_unmap_user+0x14/0x20
[34215.786928]  [<ffffffff80210852>] pit_next_event+0x2e/0x49
[34215.786934]  [<ffffffff802e8795>] blk_rq_unmap_user+0x1e/0x4b
[34215.786965]  [<ffffffffa0163475>] sg_finish_rem_req+0x6d/0x88 [sg]
[34215.786979]  [<ffffffffa0164ef3>] sg_rq_end_io+0x131/0x205 [sg]
[34215.786986]  [<ffffffff802e5c1f>] end_that_request_last+0x58/0x194
[34215.786992]  [<ffffffff802e5e00>] blk_end_io+0x48/0x7d
[34215.787019]  [<ffffffffa0026bef>] scsi_next_command+0x219/0x283

[scsi_mod]

Quoted 1 line
[34215.787039]  [<ffffffffa00279b1>] scsi_io_completion+0x181/0x53b

[scsi_mod]

Quoted 9 lines
[34215.787047]  [<ffffffff802e9737>] blk_done_softirq+0x5f/0x6d
[34215.787054]  [<ffffffff80230787>] __do_softirq+0x5e/0xf8
[34215.787061]  [<ffffffff8020ca8c>] call_softirq+0x1c/0x28
[34215.787067]  [<ffffffff8020d6bc>] do_softirq+0x2c/0x68
[34215.787073]  [<ffffffff80230696>] irq_exit+0x36/0x82
[34215.787079]  [<ffffffff8020d79e>] do_IRQ+0xa6/0xb8
[34215.787085]  [<ffffffff8020c256>] ret_from_intr+0x0/0xa
[34215.787088]  <EOI>  [<ffffffff8034f648>] menu_reflect+0x0/0x6d
[34215.787112]  [<ffffffffa0147d51>] acpi_idle_enter_simple+0x170/0x1d6

[processor]

Quoted 1 line
[34215.787127]  [<ffffffffa0147d47>] acpi_idle_enter_simple+0x166/0x1d6

[processor]

Quoted 2 lines
[34215.787134]  [<ffffffff8034eb32>] cpuidle_idle_call+0x73/0xb1
[34215.787140]  [<ffffffff8020ac2a>] cpu_idle+0x3c/0x73

Argh. sg_finish_rem_req() is called from interrupt context. But blk_rq_unmap_user() can run __bio_unmap_user()->set_page_dirty_lock()->lock_page(), which can call schedule(). If it does call schedule(), the machine will crash.

afacit, blk_rq_unmap_user() has always been a can-sleep function, and this is a regression caused by

commit 6e5a30cba5e7c03b2cd564e968f1dd667a0f7c42

Author:     FUJITA Tomonori <[email protected]>
AuthorDate: Thu Aug 28 16:17:08 2008 +0900
Commit:     Jens Axboe <[email protected]>
CommitDate: Thu Oct 9 08:56:10 2008 +0200

sg: convert the direct IO path to use the block layer

This patch converts the direct IO path (SG_FLAG_DIRECT_IO) to use the block layer functions (blk_get_request, blk_execute_rq_nowait, blk_rq_map_user, etc) instead of scsi_execute_async().

Quoted 7 lines

Andrew,

thank you for your quick response. So as a temporary workaround I will not use direct I/O and wait for a patch.

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
#10 lore raw

[Bug 12945] SCSI Generic (sg): BUG: sleeping function called from invalid context

In reply to [email protected]

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Alan <[email protected]> changed:

What |Removed |Added
----------------------------------------------------------------------------

             Status|NEW                         |RESOLVED
                 CC|                            |[email protected]
         Resolution|                            |CODE_FIX

--- Comment #4 from Alan <[email protected]> 2010-01-25 13:10:46 --- commit c96952ed7031e7c576ecf90cf95b8ec099d5295a

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.
#11 lore raw

[Bug 12945] SCSI Generic (sg): BUG: sleeping function called from invalid context

In reply to [email protected]

http://bugzilla.kernel.org/show_bug.cgi?id=12945

Alan <[email protected]> changed:

What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |CLOSED

Signature · 3 lines
Configure bugmail: http://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.