android_kernel_xiaomi_sm8350/include/linux
Paul Jackson 4247bdc600 [PATCH] cpuset semaphore depth check deadlock fix
The cpusets-formalize-intermediate-gfp_kernel-containment patch
has a deadlock problem.

This patch was part of a set of four patches to make more
extensive use of the cpuset 'mem_exclusive' attribute to
manage kernel GFP_KERNEL memory allocations and to constrain
the out-of-memory (oom) killer.

A task that is changing cpusets in particular ways on a system
when it is very short of free memory could double trip over
the global cpuset_sem semaphore (get the lock and then deadlock
trying to get it again).

The second attempt to get cpuset_sem would be in the routine
cpuset_zone_allowed().  This was discovered by code inspection.
I can not reproduce the problem except with an artifically
hacked kernel and a specialized stress test.

In real life you cannot hit this unless you are manipulating
cpusets, and are very unlikely to hit it unless you are rapidly
modifying cpusets on a memory tight system.  Even then it would
be a rare occurence.

If you did hit it, the task double tripping over cpuset_sem
would deadlock in the kernel, and any other task also trying
to manipulate cpusets would deadlock there too, on cpuset_sem.
Your batch manager would be wedged solid (if it was cpuset
savvy), but classic Unix shells and utilities would work well
enough to reboot the system.

The unusual condition that led to this bug is that unlike most
semaphores, cpuset_sem _can_ be acquired while in the page
allocation code, when __alloc_pages() calls cpuset_zone_allowed.
So it easy to mistakenly perform the following sequence:
  1) task makes system call to alter a cpuset
  2) take cpuset_sem
  3) try to allocate memory
  4) memory allocator, via cpuset_zone_allowed, trys to take cpuset_sem
  5) deadlock

The reason that this is not a serious bug for most users
is that almost all calls to allocate memory don't require
taking cpuset_sem.  Only some code paths off the beaten
track require taking cpuset_sem -- which is good.  Taking
a global semaphore on the main code path for allocating
memory would not scale well.

This patch fixes this deadlock by wrapping the up() and down()
calls on cpuset_sem in kernel/cpuset.c with code that tracks
the nesting depth of the current task on that semaphore, and
only does the real down() if the task doesn't hold the lock
already, and only does the real up() if the nesting depth
(number of unmatched downs) is exactly one.

The previous required use of refresh_mems(), anytime that
the cpuset_sem semaphore was acquired and the code executed
while holding that semaphore might try to allocate memory, is
no longer required.  Two refresh_mems() calls were removed
thanks to this.  This is a good change, as failing to get
all the necessary refresh_mems() calls placed was a primary
source of bugs in this cpuset code.  The only remaining call
to refresh_mems() is made while doing a memory allocation,
if certain task memory placement data needs to be updated
from its cpuset, due to the cpuset having been changed behind
the tasks back.

Signed-off-by: Paul Jackson <pj@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-09-10 10:06:21 -07:00
..
byteorder
dvb
hdlc
isdn
lockd
mmc [MMC] Ensure correct mmc_priv() behaviour 2005-09-08 22:46:00 +01:00
mtd
netfilter
netfilter_arp
netfilter_bridge
netfilter_ipv4 [NETFILTER]: kill __ip_ct_expect_unlink_destroy 2005-09-06 15:10:46 -07:00
netfilter_ipv6
nfsd
raid [PATCH] md: add write-intent-bitmap support to raid5 2005-09-09 16:39:12 -07:00
sunrpc [PATCH] sunrpc: cache_register can use wrong module reference 2005-09-07 16:57:25 -07:00
tc_act
tc_ematch
8250_pci.h
a.out.h
ac97_codec.h
acct.h
acpi.h
adb.h
adfs_fs_i.h
adfs_fs_sb.h
adfs_fs.h
affs_fs.h
affs_hardblocks.h
agp_backend.h
agpgart.h
aio_abi.h
aio.h
amifd.h
amifdreg.h
amigaffs.h
apm_bios.h
arcdevice.h
arcfb.h
ata.h
atalk.h
atm_eni.h
atm_he.h
atm_idt77105.h
atm_nicstar.h
atm_suni.h
atm_tcp.h
atm_zatm.h
atm.h
atmapi.h
atmarp.h
atmbr2684.h
atmclip.h
atmdev.h
atmioc.h
atmlec.h
atmmpc.h
atmppp.h
atmsap.h
atmsvc.h
attribute_container.h
audit.h
auto_fs4.h
auto_fs.h
auxvec.h [PATCH] auxiliary vector cleanups 2005-09-07 16:57:21 -07:00
awe_voice.h
ax25.h
b1lli.h
b1pcmcia.h
backing-dev.h
backlight.h
baycom.h
bcd.h
bfs_fs.h [PATCH] bfs: fix endianness, signedness; add trivial bugfix 2005-09-09 13:57:32 -07:00
binfmts.h
bio.h Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6 2005-09-07 17:31:27 -07:00
bit_spinlock.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
bitmap.h
bitops.h
blkdev.h
blkpg.h
blockgroup_lock.h
bootmem.h
bpqether.h
buffer_head.h
cache.h
capability.h [PATCH] VM: add capabilites check to set_zone_reclaim 2005-09-05 00:05:44 -07:00
capi.h
cciss_ioctl.h
cd1400.h
cdev.h
cdk.h
cdrom.h
chio.h
circ_buf.h
cobalt-nvram.h
coda_cache.h
coda_fs_i.h
coda_linux.h
coda_proc.h
coda_psdev.h
coda.h
coff.h
com20020.h
compat_ioctl.h
compat.h [PATCH] compat: be more consistent about [ug]id_t 2005-09-07 16:57:19 -07:00
compiler-gcc2.h
compiler-gcc3.h
compiler-gcc4.h
compiler-gcc.h
compiler-intel.h
compiler.h
completion.h
comstats.h
concap.h
config.h
console_struct.h
console.h
consolemap.h
cpu.h
cpufreq.h
cpumask.h
cpuset.h [PATCH] cpusets: confine oom_killer to mem_exclusive cpuset 2005-09-07 16:57:40 -07:00
cramfs_fs_sb.h
cramfs_fs.h
crash_dump.h
crc16.h [PATCH] lib/crc16: added crc16 algorithm. 2005-09-08 14:41:27 -07:00
crc32.h
crc32c.h
crc-ccitt.h
crypto.h
cryptohash.h
ctype.h
cuda.h
cyclades.h
cyclomx.h
cycx_cfm.h
cycx_drv.h
cycx_x25.h
dcache.h [PATCH] struct dentry: place d_hash close to d_parent and d_name to speedup lookups 2005-09-07 16:57:41 -07:00
dccp.h [DCCP] Introduce dccp_timestamp 2005-09-09 02:38:35 -03:00
dcookies.h
debugfs.h
delay.h
devfs_fs_kernel.h
devfs_fs.h
device-mapper.h
device.h
devpts_fs.h
dio.h
dirent.h
divert.h
dm9000.h
dm-ioctl.h
dma-mapping.h
dmapool.h
dmi.h [PATCH] dmi: add onboard devices discovery 2005-09-07 16:57:44 -07:00
dn.h
dnotify.h
dqblk_v1.h
dqblk_v2.h
dqblk_xfs.h
ds1286.h
dtlk.h
edd.h
eeprom.h
efi.h [PATCH] x86: fix EFI memory map parsing 2005-09-05 00:06:09 -07:00
efs_dir.h
efs_fs_i.h
efs_fs_sb.h
efs_fs.h
efs_vh.h
eisa.h
elevator.h
elf-fdpic.h
elf.h [PATCH] auxiliary vector cleanups 2005-09-07 16:57:21 -07:00
elfcore.h
err.h
errno.h
errqueue.h
etherdevice.h
ethtool.h
eventpoll.h
ext2_fs_sb.h
ext2_fs.h [PATCH] disk quotas fail when /etc/mtab is symlinked to /proc/mounts 2005-09-07 16:57:23 -07:00
ext3_fs_i.h
ext3_fs_sb.h
ext3_fs.h [PATCH] disk quotas fail when /etc/mtab is symlinked to /proc/mounts 2005-09-07 16:57:23 -07:00
ext3_jbd.h
fadvise.h
fb.h [PATCH] fbcon: Break up bit_putcs into its component functions 2005-09-09 14:03:41 -07:00
fcdevice.h
fcntl.h
fd1772.h
fd.h
fddidevice.h
fdreg.h
file.h [PATCH] files: files struct with RCU 2005-09-09 13:57:55 -07:00
filter.h
firmware.h [PATCH] modified firmware_class.c to support no hotplug 2005-09-07 16:57:26 -07:00
flat.h
font.h
fs_struct.h
fs.h [PATCH] files: files struct with RCU 2005-09-09 13:57:55 -07:00
fsl_devices.h
fsnotify.h
ftape-header-segment.h
ftape-vendors.h
ftape.h
fuse.h [PATCH] FUSE: add fsync operation for directories 2005-09-09 14:03:47 -07:00
futex.h [PATCH] FUTEX_WAKE_OP: pthread_cond_signal() speedup 2005-09-07 16:57:17 -07:00
gameport.h
gen_stats.h
genalloc.h
generic_serial.h
genhd.h
gfp.h [PATCH] cpusets: new __GFP_HARDWALL flag 2005-09-07 16:57:40 -07:00
hardirq.h
harrier_defs.h
hash.h
hayesesp.h
hdlc.h
hdlcdrv.h
hdpu_features.h
hdreg.h
hdsmart.h
hiddev.h
highmem.h
highuid.h
hippidevice.h
hpet.h
hpfs_fs.h
hugetlb.h [PATCH] remove hugetlb_clean_stale_pgtable() and fix huge_pte_alloc() 2005-09-05 00:05:46 -07:00
hwmon-sysfs.h [PATCH] I2C: W83792D driver 1/3 2005-09-05 09:14:13 -07:00
hwmon-vid.h [PATCH] hwmon: hwmon vs i2c, second round (10/11) 2005-09-05 09:14:23 -07:00
hwmon.h [PATCH] hwmon: move SENSORS_LIMIT to hwmon.h 2005-09-05 09:14:17 -07:00
hysdn_if.h
i2c-algo-bit.h
i2c-algo-ite.h
i2c-algo-pca.h
i2c-algo-pcf.h
i2c-algo-sgi.h
i2c-algo-sibyte.h
i2c-dev.h
i2c-id.h [PATCH] I2C: Kill i2c_algorithm.id (7/7) 2005-09-05 09:14:33 -07:00
i2c-isa.h [PATCH] I2C: Kill i2c_algorithm.id (5/7) 2005-09-05 09:14:31 -07:00
i2c-pxa.h
i2c.h [PATCH] I2C: Drop the I2C_ACK_TEST ioctl 2005-09-05 09:26:56 -07:00
i2o-dev.h
i2o.h
i8k.h
ibmtr.h
icmp.h
icmpv6.h
ide.h
idr.h
if_arcnet.h
if_arp.h
if_bonding.h
if_bridge.h
if_cablemodem.h
if_ec.h
if_eql.h
if_ether.h
if_fc.h
if_fddi.h
if_frad.h
if_hippi.h
if_infiniband.h
if_ltalk.h
if_packet.h
if_plip.h
if_ppp.h
if_pppox.h
if_shaper.h
if_slip.h
if_strip.h
if_tr.h
if_tun.h
if_tunnel.h
if_vlan.h
if_wanpipe_common.h
if_wanpipe.h
if.h
igmp.h
in6.h [IPV6]: Support IPV6_{RECV,}TCLASS socket options / ancillary data. 2005-09-08 10:19:03 +09:00
in_route.h
in.h
inet_diag.h
inet.h
inetdevice.h
init_task.h [PATCH] files: files struct with RCU 2005-09-09 13:57:55 -07:00
init.h
initrd.h
inotify.h [PATCH] inotify: fix event loss on hardlinked files 2005-09-07 16:57:39 -07:00
input.h [PATCH] Input: Add a new switch event type 2005-09-07 16:57:54 -07:00
interrupt.h
ioc4.h
ioctl32.h [PATCH] remove register_ioctl32_conversion and unregister_ioctl32_conversion 2005-09-07 16:57:20 -07:00
ioctl.h
ioport.h
ioprio.h
ip6_tunnel.h
ip_mp_alg.h
ip.h
ipc.h
ipmi_msgdefs.h
ipmi_smi.h
ipmi.h [PATCH] ipmi: fix panic ipmb response 2005-09-07 16:57:48 -07:00
ipsec.h
ipv6_route.h
ipv6.h [IPV6]: Support IPV6_{RECV,}TCLASS socket options / ancillary data. 2005-09-08 10:19:03 +09:00
ipx.h
irda.h
irq_cpustat.h
irq.h [PATCH] CHECK_IRQ_PER_CPU() to avoid dead code in __do_IRQ() 2005-09-07 16:57:29 -07:00
isapnp.h
isdn_divertif.h
isdn_ppp.h
isdn.h [PATCH] Remove non-arch consumers of asm/segment.h 2005-09-07 16:57:34 -07:00
isdnif.h
isicom.h
iso_fs.h
istallion.h
ite_gpio.h
ixjuser.h
jbd.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
jffs2_fs_i.h
jffs2_fs_sb.h
jffs2.h
jffs.h
jhash.h
jiffies.h
journal-head.h
joystick.h
kallsyms.h
kbd_diacr.h
kbd_kern.h
kd.h
kdev_t.h
kernel_stat.h
kernel.h
kernelcapi.h
kexec.h
key-ui.h
key.h
keyboard.h
keyctl.h
kfifo.h
klist.h [PATCH] fix klist semantics for lists which have elements removed on traversal 2005-09-07 18:26:54 -07:00
kmalloc_sizes.h
kmod.h
kobj_map.h
kobject_uevent.h
kobject.h
kprobes.h [PATCH] Kprobes: prevent possible race conditions generic 2005-09-07 16:57:59 -07:00
kref.h
kthread.h
lapb.h
lcd.h
libata.h /spare/repo/libata-dev branch 'iomap-try3' 2005-09-05 05:20:33 -04:00
libps2.h
limits.h
linkage.h [PATCH] Kprobes: prevent possible race conditions generic 2005-09-07 16:57:59 -07:00
linux_logo.h
list.h
llc.h
loop.h
lp.h
major.h
matroxfb.h
mbcache.h
mc6821.h
mc146818rtc.h
mca-legacy.h
mca.h
mempolicy.h [PATCH] PCI: Run PCI driver initialization on local node 2005-09-08 14:57:23 -07:00
mempool.h
meye.h
mii.h
minix_fs.h
miscdevice.h
mm_inline.h
mm.h
mman.h
mmtimer.h
mmzone.h
mod_devicetable.h
module.h
moduleloader.h
moduleparam.h
mount.h
mpage.h
mqueue.h
mroute.h
msdos_fs.h
msg.h [PATCH] ipc: convert /proc/sysvipc/* to generic seq_file interface 2005-09-07 16:57:26 -07:00
mtio.h
mv643xx.h [PATCH] ppc32: mv64x60 updates & enhancements 2005-09-05 00:06:00 -07:00
n_r3964.h
namei.h
namespace.h
nbd.h
ncp_fs_i.h
ncp_fs_sb.h
ncp_fs.h
ncp_mount.h
ncp_no.h
ncp.h
net.h
netdevice.h
netfilter_arp.h
netfilter_bridge.h
netfilter_decnet.h
netfilter_ipv4.h
netfilter_ipv6.h
netfilter_logging.h
netfilter.h
netlink.h
netpoll.h
netrom.h
nfs2.h
nfs3.h
nfs4_acl.h
nfs4_mount.h
nfs4.h
nfs_fs_i.h
nfs_fs_sb.h
nfs_fs.h
nfs_idmap.h
nfs_mount.h
nfs_page.h
nfs_xdr.h
nfs.h
nfsacl.h
nfsd_idmap.h
nls.h
nmi.h
node.h
nodemask.h
notifier.h
nubus.h
numa.h
nvram.h
openprom_fs.h
oprofile.h
page-flags.h [PATCH] VM: add page_state info to per-node meminfo 2005-09-05 00:05:49 -07:00
pagemap.h
pagevec.h
param.h
parport_pc.h
parport.h
parser.h
patchkey.h
pci_ids.h [PATCH] net: add driver for the NIC on Cell Blades 2005-09-06 22:17:49 -04:00
pci_regs.h [PATCH] PCI: restore BAR values after D3hot->D0 for devices that need it 2005-09-08 14:57:24 -07:00
pci-acpi.h
pci.h Remove "must_check" attributes in PCI-land 2005-09-09 15:43:46 -07:00
pcieport_if.h
percpu_counter.h
percpu.h
personality.h
pfkeyv2.h
pg.h
phonedev.h
phy.h
pid.h
pipe_fs_i.h [PATCH] remove pipe definitions 2005-09-07 16:57:24 -07:00
pkt_cls.h
pkt_sched.h
pktcdvd.h
platform.h
pm.h [PATCH] swsusp: switch pm_message_t to struct 2005-09-05 00:06:16 -07:00
pmu.h
pnp.h [PATCH] PNP: make pnp_dbg conditional directly on CONFIG_PNP_DEBUG 2005-09-07 16:57:25 -07:00
pnpbios.h
poll.h
posix_acl_xattr.h
posix_acl.h
posix_types.h
posix-timers.h
ppdev.h
ppp_channel.h
ppp_defs.h
ppp-comp.h
prctl.h
preempt.h
prefetch.h
prio_tree.h
proc_fs.h
profile.h
ps2esdi.h
ptrace.h [PATCH] remove duplicated code from proc and ptrace 2005-09-07 16:57:43 -07:00
qic117.h
qnx4_fs.h
qnxtypes.h
quota.h
quotaio_v1.h
quotaio_v2.h
quotaops.h
radeonfb.h
radix-tree.h
raid_class.h
ramfs.h
random.h
raw.h
rbtree.h
rcupdate.h [PATCH] files: fix rcu initializers 2005-09-09 13:57:54 -07:00
rcuref.h [PATCH] files: rcuref APIs 2005-09-09 13:57:54 -07:00
reboot_fixups.h
reboot.h
reiserfs_acl.h
reiserfs_fs_i.h
reiserfs_fs_sb.h
reiserfs_fs.h
reiserfs_xattr.h
relayfs_fs.h [PATCH] relayfs 2005-09-07 16:57:18 -07:00
resource.h
rmap.h
romfs_fs.h
root_dev.h
rose.h
route.h
rslib.h
rtc.h
rtnetlink.h
rwsem-spinlock.h
rwsem.h
sc26198.h
scatterlist.h
scc.h
sched.h [PATCH] cpuset semaphore depth check deadlock fix 2005-09-10 10:06:21 -07:00
sctp.h
scx200_gpio.h
scx200.h
sdla_asy.h
sdla_chdlc.h
sdla_fr.h
sdla_ppp.h
sdla_x25.h
sdla.h
sdladrv.h
sdlapci.h
sdlasfm.h
seccomp.h
securebits.h
security.h [PATCH] remove the inode_post_link and inode_post_rename LSM hooks 2005-09-09 13:57:28 -07:00
selection.h
selinux_netlink.h
sem.h [PATCH] ipc: convert /proc/sysvipc/* to generic seq_file interface 2005-09-07 16:57:26 -07:00
seq_file.h
seqlock.h
serial167.h
serial_8250.h [SERIAL] Use an enum for serial8250 platform device IDs 2005-09-08 16:04:41 +01:00
serial_core.h Fix up ARM serial driver compile failure 2005-09-08 14:47:12 -07:00
serial_reg.h
serial.h
serialP.h
serio.h
shm.h
shmem_fs.h
signal.h
skbuff.h [NET]: Optimize pskb_trim_rcsum() 2005-09-08 12:32:03 -07:00
slab.h [PATCH] introduce and use kzalloc 2005-09-07 16:57:45 -07:00
smb_fs_i.h
smb_fs_sb.h
smb_fs.h
smb_mount.h
smb.h
smbno.h
smp_lock.h
smp.h
snmp.h
socket.h
sockios.h
som.h
sonet.h
sonypi.h [PATCH] sonypi SPIC initialisation fix 2005-09-07 16:57:24 -07:00
sort.h
sound.h
soundcard.h
spinlock_api_smp.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
spinlock_api_up.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
spinlock_types_up.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
spinlock_types.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
spinlock_up.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
spinlock.h [PATCH] spinlock consolidation 2005-09-10 10:06:21 -07:00
stallion.h
stat.h
statfs.h
stddef.h
stop_machine.h
string.h
stringify.h
superhyway.h
suspend.h
swap.h
swapops.h [PATCH] comment typo fix 2005-09-05 00:05:45 -07:00
synclink.h
sys.h
syscalls.h
sysctl.h [PATCH] ipmi poweroff: fix chassis control 2005-09-07 16:57:49 -07:00
sysdev.h
sysfs.h
sysrq.h
sysv_fs.h
tcp.h
telephony.h
termios.h
textsearch_fsm.h
textsearch.h
thread_info.h
threads.h
ticable.h
time.h [PATCH] Delete unused do_nanosleep declaration 2005-09-07 16:57:30 -07:00
timer.h [PATCH] timer initialization cleanup: DEFINE_TIMER 2005-09-09 14:03:48 -07:00
times.h
timex.h [PATCH] NTP: ntp-helper functions 2005-09-07 16:57:34 -07:00
tiocl.h
topology.h [PATCH] cpusets: Move the ia64 domain setup code to the generic code 2005-09-07 16:57:40 -07:00
toshiba.h
transport_class.h
trdevice.h
tty_driver.h
tty_flip.h
tty_ldisc.h
tty.h [PATCH] vesafb: Add blanking support 2005-09-09 13:57:58 -07:00
types.h
udf_fs_i.h
udf_fs_sb.h
udf_fs.h
udp.h
ufs_fs_i.h
ufs_fs_sb.h
ufs_fs.h
uinput.h
uio.h
ultrasound.h
umem.h
un.h
unistd.h
usb_cdc.h
usb_ch9.h
usb_gadget.h
usb_gadgetfs.h
usb_input.h
usb_isp116x.h [PATCH] USB: isp116x-hcd: remove clock() and reset() 2005-09-08 16:22:48 -07:00
usb_otg.h
usb_sl811.h
usb.h [PATCH] USB: URB_ASYNC_UNLINK flag removed from the kernel 2005-09-08 16:23:04 -07:00
usbdevice_fs.h
user.h
utime.h
uts.h
utsname.h
vermagic.h
vfs.h
via.h
video_decoder.h
video_encoder.h
videodev2.h [PATCH] v4l: common part Updates and tuner additions 2005-09-09 13:57:49 -07:00
videodev.h [PATCH] v4l: common part Updates and tuner additions 2005-09-09 13:57:49 -07:00
videotext.h
vmalloc.h [PATCH] arm: allow for arch-specific IOREMAP_MAX_ORDER 2005-09-05 00:05:46 -07:00
vt_buffer.h
vt_kern.h
vt.h
wait.h
wanpipe.h
wanrouter.h
watchdog.h
wavefront.h
wireless.h [wireless] build fixes after merging WE-19 2005-09-07 00:27:54 -04:00
workqueue.h
writeback.h
x25.h
xattr.h
xfrm.h
yam.h
zconf.h
zftape.h
zlib.h
zorro_ids.h
zorro.h
zutil.h