linux/drivers/scsi
Hugh Dickins 164fc5dcd6 scsi: fix sense_slab/bio swapping livelock
Since 2.6.25-rc7, I've been seeing an occasional livelock on one x86_64
machine, copying kernel trees to tmpfs, paging out to swap.

Signature: 6000 pages under writeback but never getting written; most
tasks of interest trying to reclaim, but each get_swap_bio waiting for a
bio in mempool_alloc's io_schedule_timeout(5*HZ); every five seconds an
atomic page allocation failure report from kblockd failing to allocate a
sense_buffer in __scsi_get_command.

__scsi_get_command has a (one item) free_list to protect against this,
but rc1's [SCSI] use dynamically allocated sense buffer
de25deb180 upset that slightly.  When it
fails to allocate from the separate sense_slab, instead of giving up, it
must fall back to the command free_list, which is sure to have a
sense_buffer attached.

Either my earlier -rc testing missed this, or there's some recent
contributory factor.  One very significant factor is SLUB, which merges
slab caches when it can, and on 64-bit happens to merge both bio cache
and sense_slab cache into kmalloc's 128-byte cache: so that under this
swapping load, bios above are liable to gobble up all the slots needed
for scsi_cmnd sense_buffers below.

That's disturbing behaviour, and I tried a few things to fix it.  Adding
a no-op constructor to the sense_slab inhibits SLUB from merging it, and
stops all the allocation failures I was seeing; but it's rather a hack,
and perhaps in different configurations we have other caches on the
swapout path which are ill-merged.

Another alternative is to revert the separate sense_slab, using
cache-line-aligned sense_buffer allocated beyond scsi_cmnd from the one
kmem_cache; but that might waste more memory, and is only a way of
diverting around the known problem.

While I don't like seeing the allocation failures, and hate the idea of
all those bios piled up above a scsi host working one by one, it does
seem to emerge fairly soon with the livelock fix.  So lacking better
ideas, stick with that one clear fix for now.

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Christoph Lameter <clameter@sgi.com>
Cc: Pekka Enberg <penberg@cs.helsinki.fi>
Cc: Peter Zijlstra <a.p.ziljstra@chello.nl>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2008-04-06 16:10:08 -07:00
..
aacraid [SCSI] aacraid: informational sysfs value corrections 2008-02-11 10:20:54 -06:00
aic7xxx Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6 2008-02-23 12:29:16 -08:00
aic7xxx_old
aic94xx [SCSI] aic94xx: fix TMF ascb handling to prevent sequencer panic 2008-02-24 00:40:57 -06:00
arcmsr [SCSI] arcmsr: fix iounmap error for Type B adapter 2008-03-14 15:25:26 -05:00
arm [SCSI] fas216: fix up the previous fas216 commit 2008-02-18 08:57:16 -06:00
dpt [SCSI] dpt: whitespace cleanup 2007-04-01 10:10:04 -05:00
ibmvscsi [SCSI] tgt: fix build errors when dprintk is defined 2008-03-03 13:19:52 -06:00
libsas [SCSI] libsas: Warn if ATA device detected but CONFIG_SCSI_SAS_ATA not set 2008-03-27 15:12:16 -07:00
lpfc [SCSI] lpfc: Balance locking 2008-02-22 17:15:35 -06:00
megaraid [SCSI] MegaRAID driver management char device moved to misc 2008-02-11 10:20:53 -06:00
pcmcia pcmcia: convert some internal-only ioaddr_t to unsigned int 2008-02-05 09:44:08 -08:00
qla2xxx [SCSI] qla2xxx: Update version number to 8.02.00-k9. 2008-03-03 13:11:50 -06:00
qla4xxx [SCSI] qla4xxx: regression - add start scan callout 2008-03-05 12:03:54 -06:00
sym53c8xx_2 [SCSI] sym53c8xx: fix resid calculation 2008-02-07 18:02:34 -06:00
.gitignore [SCSI] 53c7xx: fix removal fallout 2008-01-11 18:22:30 -06:00
3w-9xxx.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
3w-9xxx.h [SCSI] 3w-9xxx: add support for 9690SA 2007-07-21 08:57:40 -05:00
3w-xxxx.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
3w-xxxx.h [SCSI] 3ware 8000 serialize reset code 2007-01-06 09:18:00 -06:00
53c700_d.h_shipped
53c700.c [SCSI] replace sizeof sense_buffer with SCSI_SENSE_BUFFERSIZE 2008-01-23 11:29:27 -06:00
53c700.h [SCSI] 53c700: m68k support for the 53c700 SCSI core 2007-06-17 16:15:56 -05:00
53c700.scr
a100u2w.c [SCSI] a100u2w: fix bitmap lookup routine 2008-03-20 09:19:25 -05:00
a100u2w.h [SCSI] a100u2w: Convert into Linux style 2007-06-17 16:09:29 -05:00
a2091.c cleanup after APUS removal 2008-02-06 10:41:01 -08:00
a2091.h [SCSI] wd33c93: Scsi_Cmnd convertion 2006-09-12 17:12:31 -05:00
a3000.c cleanup after APUS removal 2008-02-06 10:41:01 -08:00
a3000.h [SCSI] wd33c93: Scsi_Cmnd convertion 2006-09-12 17:12:31 -05:00
a4000t.c [SCSI] kmalloc + memset conversion to kzalloc 2007-10-12 14:41:00 -04:00
advansys.c [SCSI] advansys: Fix bug in AdvLoadMicrocode 2008-03-07 10:05:43 -06:00
aha152x.c [SCSI] aha152x: Use scsi_eh API for REQUEST_SENSE invocation 2008-01-11 18:22:34 -06:00
aha152x.h [SCSI] aha152x: fix debug mode symbol conflict 2007-08-04 09:11:06 -05:00
aha1542.c MAINTAINERS: remove Adam Fritzler, remove his email address in other sources 2008-02-03 16:36:24 +02:00
aha1542.h
aha1740.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
aha1740.h
aic7xxx_old.c Remove pointless casts from void pointers 2008-02-06 10:41:01 -08:00
atari_dma_emul.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
atari_NCR5380.c [SCSI] atari_NCR5380, sun3_NCR5380: operator precedence fix 2008-01-11 18:28:57 -06:00
atari_scsi.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
atari_scsi.h m68k: Atari SCSI driver compile fixes 2007-05-04 17:59:05 -07:00
atp870u.c [SCSI] atp870u: convert to accessors and !use_sg cleanup 2008-01-11 18:22:38 -06:00
atp870u.h
BusLogic.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
BusLogic.h [SCSI] BusLogic: Replace 'boolean' by 'bool' 2007-02-07 18:32:29 -05:00
bvme6000_scsi.c [SCSI] kmalloc + memset conversion to kzalloc 2007-10-12 14:41:00 -04:00
ch.c [SCSI] ch: remove forward declarations 2008-01-25 09:22:12 -06:00
constants.c [SCSI] Add Documentation and integrate into docbook build 2008-01-11 18:22:40 -06:00
dc395x.c [SCSI] dc395x: fix uninitialized var warning 2008-02-07 18:02:43 -06:00
dc395x.h
dmx3191d.c [SCSI] pci_module_init conversion in scsi subsystem 2006-09-26 11:35:32 -07:00
dpt_i2o.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
dpti.h revert "dpt_i2o: convert to SCSI hotplug model" 2007-12-10 19:43:54 -08:00
dtc.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
dtc.h
eata_generic.h [SCSI] eata_pio: Remove FALSE/TRUE defines 2007-03-20 11:27:03 -05:00
eata_pio.c [SCSI] aic7xxx_old, eata_pio, ips, libsas: don't zero out sense_buffer in queuecommand 2008-01-23 11:29:26 -06:00
eata_pio.h
eata.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
esp_scsi.c esp_scsi: fix reset cleanup spinlock recursion 2007-12-10 19:43:55 -08:00
esp_scsi.h [SCSI] ESP: Revert ESP_BUS_TIMEOUT back down to 250 2007-07-31 10:51:25 -05:00
fd_mcs.c [SCSI] fd_mcs: convert to accessors and !use_sg cleanup 2008-01-11 18:22:35 -06:00
fdomain.c [SG] Update drivers to use sg helpers 2007-10-22 21:19:53 +02:00
fdomain.h
FlashPoint.c FlashPoint, use BIT instead of BITW 2007-10-19 11:53:42 -07:00
g_NCR5380_mmio.c
g_NCR5380.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
g_NCR5380.h
gdth_ioctl.h
gdth_proc.c [SCSI] gdth: don't call pci_free_consistent under spinlock 2008-02-18 09:02:25 -06:00
gdth_proc.h [SCSI] gdth: clean up host private data 2007-10-12 14:55:46 -04:00
gdth.c [SCSI] gdth: Allocate sense_buffer to prevent NULL pointer dereference 2008-03-14 20:31:18 -05:00
gdth.h [SCSI] gdth: fix to internal commands execution 2008-02-27 15:54:26 -08:00
gvp11.c cleanup after APUS removal 2008-02-06 10:41:01 -08:00
gvp11.h [SCSI] wd33c93: Scsi_Cmnd convertion 2006-09-12 17:12:31 -05:00
hosts.c [SCSI] hosts.c: fixes for "no error" reported after error scenarios 2008-03-27 15:09:54 -07:00
hptiop.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
hptiop.h [SCSI] hptiop: add more adapter models and other fixes 2008-01-11 18:28:06 -06:00
ibmmca.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
ide-scsi.c ide: add ide_read_[alt]status() inline helpers 2008-02-06 02:57:51 +01:00
imm.c [SCSI] imm: convert to accessors and !use_sg cleanup 2008-01-11 18:22:41 -06:00
imm.h Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
in2000.c [SCSI] in2000: convert to accessors and !use_sg cleanup 2008-01-11 18:22:36 -06:00
in2000.h
initio.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
initio.h [SCSI] initio: Convert into a real Linux driver and update to modern style 2007-05-22 11:08:56 -05:00
ipr.c libata: eliminate the home grown dma padding in favour of 2008-02-19 11:36:56 +01:00
ipr.h [SCSI] ipr: Use PCI-E reset API for new ipr adapter 2007-05-08 11:54:40 -05:00
ips.c [SCSI] ips: fix data buffer accessors conversion bug 2008-02-19 10:49:27 -06:00
ips.h [SCSI] ips: trim trailing whitespace 2008-01-11 18:27:59 -06:00
iscsi_tcp.c [SCSI] iscsi: fix up iscsi printk prefix 2008-02-07 18:02:37 -06:00
iscsi_tcp.h [SCSI] iscsi_tcp: enable sg chaining 2008-01-11 18:28:48 -06:00
jazz_esp.c [SCSI] esp: use shost_priv 2007-05-31 17:30:04 -04:00
Kconfig [SCSI] Fix dependency problems in SCSI drivers 2008-03-08 18:30:19 -06:00
lasi700.c some kmalloc/memset ->kzalloc (tree wide) 2007-07-19 10:04:50 -07:00
libiscsi.c [SCSI] iscsi regression: check for zero max session cmds 2008-02-27 15:52:46 -08:00
libsrp.c [SCSI] implement scsi_data_buffer 2008-01-30 13:03:40 -06:00
mac53c94.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
mac53c94.h
mac_scsi.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
mac_scsi.h
Makefile [SCSI] mvsas: Add Marvell 6440 SAS/SATA driver 2008-02-23 07:29:31 -06:00
megaraid.c [SCSI] megaraid: outb_p extermination 2008-02-18 08:57:16 -06:00
megaraid.h [SCSI] megaraid: fix warnings when CONFIG_PROC_FS=n 2007-05-08 11:15:08 -05:00
mesh.c PM: Introduce PM_EVENT_HIBERNATE callback state 2008-02-23 10:40:04 -08:00
mesh.h
mvme16x_scsi.c [SCSI] kmalloc + memset conversion to kzalloc 2007-10-12 14:41:00 -04:00
mvme147.c [PATCH] remove many unneeded #includes of sched.h 2007-02-14 08:09:54 -08:00
mvme147.h [SCSI] wd33c93: Scsi_Cmnd convertion 2006-09-12 17:12:31 -05:00
mvsas.c [SCSI] mvsas: check subsystem id 2008-03-28 12:32:22 -05:00
ncr53c8xx.c [SCSI] ncr53c8xx: fix sense_buffer access bug 2008-01-30 13:03:39 -06:00
ncr53c8xx.h [SCSI] ncr53c8xx: Call scsi_host_put in release 2007-10-12 14:51:18 -04:00
NCR53c406a.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
NCR5380.c [SCSI] NCR5380: fix section mismatch 2008-01-23 13:44:31 -06:00
NCR5380.h [SCSI] NCR5380: Use scsi_eh API for REQUEST_SENSE invocation 2007-10-12 14:55:07 -04:00
NCR_D700.c [SCSI] kmalloc + memset conversion to kzalloc 2007-10-12 14:41:00 -04:00
NCR_D700.h
NCR_Q720.c some kmalloc/memset ->kzalloc (tree wide) 2007-07-19 10:04:50 -07:00
NCR_Q720.h
nsp32_debug.c
nsp32_io.h
nsp32.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
nsp32.h define global BIT macro 2007-10-19 11:53:42 -07:00
osst_detect.h
osst_options.h
osst.c [SCSI] osst: fix if (...) \n #if... cases missing semicolons when false 2007-10-27 14:31:06 -05:00
osst.h [SCSI] osst: Use mutex instead of semaphore 2007-10-12 14:50:55 -04:00
pas16.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
pas16.h
ppa.c [SCSI] ppa: convert to accessors and !use_sg cleanup 2008-01-11 18:22:41 -06:00
ppa.h Remove all inclusions of <linux/config.h> 2006-10-04 03:38:54 -04:00
ps3rom.c [SCSI] ps3rom: disable clustering 2008-03-03 13:08:13 -06:00
ql1040_fw.h
ql1280_fw.h
ql12160_fw.h
qla1280.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
qla1280.h [SCSI] qla1280: eliminate wasted space in request and response ring 2007-10-23 12:35:35 -04:00
qlogicfas408.c [SG] Update drivers to use sg helpers 2007-10-22 21:19:53 +02:00
qlogicfas408.h [SCSI] Scsi_Cmnd conversion in qlogicfas408 driver 2006-10-25 15:11:55 -07:00
qlogicfas.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
qlogicpti_asm.c [SPARC]: Fix some section mismatch warnings in sparc drivers. 2006-10-17 19:28:51 -07:00
qlogicpti.c [SCSI] qlogicpt: section fixes 2008-02-23 09:07:32 -06:00
qlogicpti.h [SCSI] qlogicpti: Add a slave_configure method 2007-10-12 14:52:38 -04:00
raid_class.c [SCSI] raid class: handle component-add errors 2006-10-04 13:27:26 -05:00
script_asm.pl
scsi_debug.c [SCSI] scsi_debug: disable clustering 2008-02-18 08:57:16 -06:00
scsi_debug.h
scsi_devinfo.c [SCSI] kernel-doc: use correct function name 2008-01-11 18:22:44 -06:00
scsi_error.c [SCSI] bidirectional command support 2008-01-30 13:03:41 -06:00
scsi_ioctl.c [SCSI] sd,sr: add early detection of medium not present 2008-01-11 18:22:50 -06:00
scsi_lib_dma.c [SCSI] don't build scsi_dma_{map,unmap} for !HAS_DMA 2007-07-14 19:28:10 -05:00
scsi_lib.c [SCSI] fix media change events for polled devices 2008-03-19 11:51:28 -05:00
scsi_logging.h
scsi_module.c
scsi_netlink.c [NETNS]: Consolidate kernel netlink socket destruction. 2008-01-28 15:08:07 -08:00
scsi_priv.h [SCSI] don't use __GFP_DMA for sense buffers if not required 2008-01-23 11:37:44 -06:00
scsi_proc.c [SCSI] Add Documentation and integrate into docbook build 2008-01-11 18:22:40 -06:00
scsi_sas_internal.h
scsi_scan.c [SCSI] docbook: fix scsi source file 2008-03-03 13:17:14 -06:00
scsi_sysctl.c [SCSI] small cleanups 2007-07-18 11:16:32 -05:00
scsi_sysfs.c Revert "[SCSI] fix bsg queue oops with iscsi logout" 2008-03-26 09:09:19 -07:00
scsi_tgt_if.c [SCSI] tgt: convert to use the data buffer accessors 2008-01-11 18:22:30 -06:00
scsi_tgt_lib.c [SCSI] tgt: set the data length properly 2008-03-03 13:19:35 -06:00
scsi_tgt_priv.h [SCSI] tgt: add I_T nexus support 2007-10-12 14:37:50 -04:00
scsi_transport_api.h
scsi_transport_fc_internal.h [SCSI] fc_transport: add target driver support 2007-10-12 14:46:58 -04:00
scsi_transport_fc.c [SCSI] Add Documentation and integrate into docbook build 2008-01-11 18:22:40 -06:00
scsi_transport_iscsi.c [SCSI] iscsi class: regression - fix races with state manipulation and blocking/unblocking 2008-03-05 12:04:09 -06:00
scsi_transport_sas.c drivers/scsi/: Spelling fixes 2008-02-03 17:28:22 +02:00
scsi_transport_spi.c [SCSI] scsi_transport_spi: convert to attribute groups 2008-01-23 11:29:18 -06:00
scsi_transport_srp_internal.h [SCSI] scsi_transport_srp: remove tgt dependencies 2007-10-12 14:38:09 -04:00
scsi_transport_srp.c [SCSI] docbook and kernel-doc updates 2008-01-11 18:22:45 -06:00
scsi_typedefs.h
scsi_wait_scan.c [SCSI] Add ability to scan scsi busses asynchronously 2006-10-11 13:44:25 -05:00
scsi.c scsi: fix sense_slab/bio swapping livelock 2008-04-06 16:10:08 -07:00
scsi.h
scsicam.c [SCSI] Add Documentation and integrate into docbook build 2008-01-11 18:22:40 -06:00
sd.c [SCSI] sd, sr: do not emit change event at device add 2008-03-19 11:28:56 -05:00
ses.c [SCSI] ses: fix data corruption 2008-02-18 08:57:15 -06:00
sg.c Convert SG from nopage to fault. 2008-02-07 19:09:22 -08:00
sgiwd93.c [SCSI] sgiwd93: use cached memory access to make driver work on IP28 2008-01-30 13:03:39 -06:00
sim710.c Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6 2007-07-22 11:36:49 -07:00
sni_53c710.c [SCSI] sni_53c710: Cleanup 2007-07-14 19:12:15 -05:00
sr_ioctl.c [SCSI] sr: fix test unit ready responses 2008-02-07 18:02:44 -06:00
sr_vendor.c [PATCH] getting rid of all casts of k[cmz]alloc() calls 2006-12-13 09:05:58 -08:00
sr.c [SCSI] sd, sr: do not emit change event at device add 2008-03-19 11:28:56 -05:00
sr.h [SCSI] sr: fix test unit ready responses 2008-02-07 18:02:44 -06:00
st_options.h
st.c [SCSI] st: compile fix when DEBUG set to one 2008-02-22 17:21:37 -06:00
st.h [SCSI] st: compile fix when DEBUG set to one 2008-02-22 17:21:37 -06:00
stex.c [SCSI] stex: stex_internal_copy should be called with sg_count in struct st_ccb 2008-02-22 17:20:59 -06:00
sun3_NCR5380.c [SCSI] atari_NCR5380, sun3_NCR5380: operator precedence fix 2008-01-11 18:28:57 -06:00
sun3_scsi_vme.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
sun3_scsi.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
sun3_scsi.h [PATCH] Sun3 SCSI: Make sun3 scsi drivers compile/work again 2006-12-09 09:41:18 -08:00
sun3x_esp.c [SCSI] sun3x_esp: convert to esp_scsi 2008-02-07 18:02:33 -06:00
sun_esp.c [SCSI] esp: use shost_priv 2007-05-31 17:30:04 -04:00
sym53c416.c [SCSI] sym53c416: fix module parameters 2008-02-12 15:24:58 -06:00
sym53c416.h
t128.c [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage 2007-11-25 12:19:26 +02:00
t128.h [SCSI] scsi: t128 scsi_cmnd convertion 2006-11-15 16:43:50 -06:00
tmscsim.c [SCSI] replace sizeof sense_buffer with SCSI_SENSE_BUFFERSIZE 2008-01-23 11:29:27 -06:00
tmscsim.h [SCSI] tmscsim: Further clean-up of the driver 2007-07-14 18:56:33 -05:00
u14-34f.c [SCSI] u14-34f: fix data direction bug 2008-02-07 18:02:44 -06:00
ultrastor.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
ultrastor.h
wd33c93.c [SCSI] wd33c93: convert to accessors and !use_sg cleanup 2008-01-11 18:22:35 -06:00
wd33c93.h Spelling fix: explicitly 2007-10-19 23:22:55 +02:00
wd7000.c [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
zalon.c
zorro7xx.c m68k: zorro7xx needs <asm/amigahw.h> 2007-11-29 09:24:52 -08:00