Merge branch 'bkl/ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 10 Aug 2010 20:58:28 +0000 (13:58 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 10 Aug 2010 20:58:28 +0000 (13:58 -0700)
* 'bkl/ioctl' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing:
  staging: Pushdown bkl to easycap ioctl handlers
  autofs/autofs4: Move compat_ioctl handling into fs
  v4l: Convert v4l2-dev to unlocked_ioctl
  ia64/perfmon: Convert to unlocked_ioctl
  sunrpc: Remove duplicated #include
  ncpfs: Remove duplicated #include

824 files changed:
Documentation/ABI/testing/sysfs-bus-i2c-devices-hm6352 [new file with mode: 0644]
Documentation/ABI/testing/sysfs-i2c-bmp085 [new file with mode: 0644]
Documentation/SubmittingPatches
Documentation/blackfin/00-INDEX
Documentation/blackfin/Filesystems [deleted file]
Documentation/blackfin/bfin-spi-notes.txt [new file with mode: 0644]
Documentation/blackfin/cachefeatures.txt [deleted file]
Documentation/feature-removal-schedule.txt
Documentation/filesystems/Locking
Documentation/filesystems/porting
Documentation/filesystems/proc.txt
Documentation/hwmon/coretemp
Documentation/hwmon/f71882fg
Documentation/hwmon/jc42 [new file with mode: 0644]
Documentation/hwmon/smm665 [new file with mode: 0644]
Documentation/networking/igb.txt [new file with mode: 0644]
Documentation/networking/igbvf.txt [new file with mode: 0644]
Documentation/sysctl/vm.txt
Documentation/trace/postprocess/trace-vmscan-postprocess.pl [new file with mode: 0644]
MAINTAINERS
arch/alpha/include/asm/hw_irq.h
arch/alpha/include/asm/md.h [deleted file]
arch/alpha/include/asm/perf_event.h
arch/alpha/include/asm/wrperfmon.h [new file with mode: 0644]
arch/alpha/kernel/Makefile
arch/alpha/kernel/irq.c
arch/alpha/kernel/irq_alpha.c
arch/alpha/kernel/osf_sys.c
arch/alpha/kernel/perf_event.c [new file with mode: 0644]
arch/alpha/kernel/time.c
arch/arm/include/asm/highmem.h
arch/arm/mach-ux500/devices-db8500.c
arch/arm/mach-ux500/include/mach/db8500-regs.h
arch/arm/mach-ux500/ste-dma40-db8500.h
arch/arm/mm/highmem.c
arch/arm/plat-nomadik/include/plat/ste_dma40.h
arch/avr32/mm/fault.c
arch/blackfin/Kconfig
arch/blackfin/Makefile
arch/blackfin/boot/Makefile
arch/blackfin/configs/BF518F-EZBRD_defconfig
arch/blackfin/configs/BF526-EZBRD_defconfig
arch/blackfin/configs/BF527-EZKIT-V2_defconfig
arch/blackfin/configs/BF527-EZKIT_defconfig
arch/blackfin/configs/BF533-EZKIT_defconfig
arch/blackfin/configs/BF533-STAMP_defconfig
arch/blackfin/configs/BF537-STAMP_defconfig
arch/blackfin/configs/BF538-EZKIT_defconfig
arch/blackfin/configs/BF548-EZKIT_defconfig
arch/blackfin/configs/BF561-ACVILON_defconfig
arch/blackfin/configs/BF561-EZKIT_defconfig
arch/blackfin/configs/CM-BF527_defconfig
arch/blackfin/configs/CM-BF533_defconfig
arch/blackfin/configs/CM-BF537E_defconfig
arch/blackfin/configs/CM-BF537U_defconfig
arch/blackfin/configs/CM-BF548_defconfig
arch/blackfin/configs/CM-BF561_defconfig
arch/blackfin/configs/PNAV-10_defconfig
arch/blackfin/configs/TCM-BF518_defconfig
arch/blackfin/configs/TCM-BF537_defconfig
arch/blackfin/include/asm/bfin_rotary.h
arch/blackfin/include/asm/bfin_sdh.h
arch/blackfin/include/asm/bitops.h
arch/blackfin/include/asm/cdef_LPBlackfin.h
arch/blackfin/include/asm/def_LPBlackfin.h
arch/blackfin/include/asm/dma.h
arch/blackfin/include/asm/elf.h
arch/blackfin/include/asm/ftrace.h
arch/blackfin/include/asm/gpio.h
arch/blackfin/include/asm/io.h
arch/blackfin/include/asm/mem_init.h
arch/blackfin/include/asm/nand.h
arch/blackfin/include/asm/portmux.h
arch/blackfin/kernel/Makefile
arch/blackfin/kernel/bfin_dma_5xx.c
arch/blackfin/kernel/bfin_gpio.c
arch/blackfin/kernel/cplb-mpu/cplbinit.c
arch/blackfin/kernel/ftrace-entry.S
arch/blackfin/kernel/ftrace.c
arch/blackfin/kernel/setup.c
arch/blackfin/kernel/vmlinux.lds.S
arch/blackfin/mach-bf518/Kconfig
arch/blackfin/mach-bf518/include/mach/anomaly.h
arch/blackfin/mach-bf518/include/mach/bf518.h
arch/blackfin/mach-bf518/include/mach/defBF514.h
arch/blackfin/mach-bf518/include/mach/defBF51x_base.h
arch/blackfin/mach-bf518/include/mach/gpio.h
arch/blackfin/mach-bf518/include/mach/portmux.h
arch/blackfin/mach-bf527/Kconfig
arch/blackfin/mach-bf527/include/mach/anomaly.h
arch/blackfin/mach-bf527/include/mach/bf527.h
arch/blackfin/mach-bf527/include/mach/defBF52x_base.h
arch/blackfin/mach-bf527/include/mach/gpio.h
arch/blackfin/mach-bf527/include/mach/portmux.h
arch/blackfin/mach-bf533/include/mach/anomaly.h
arch/blackfin/mach-bf533/include/mach/gpio.h
arch/blackfin/mach-bf533/include/mach/portmux.h
arch/blackfin/mach-bf537/include/mach/anomaly.h
arch/blackfin/mach-bf537/include/mach/defBF534.h
arch/blackfin/mach-bf537/include/mach/gpio.h
arch/blackfin/mach-bf537/include/mach/portmux.h
arch/blackfin/mach-bf538/include/mach/anomaly.h
arch/blackfin/mach-bf538/include/mach/cdefBF538.h
arch/blackfin/mach-bf538/include/mach/defBF539.h
arch/blackfin/mach-bf538/include/mach/gpio.h
arch/blackfin/mach-bf538/include/mach/portmux.h
arch/blackfin/mach-bf548/include/mach/anomaly.h
arch/blackfin/mach-bf548/include/mach/cdefBF54x_base.h
arch/blackfin/mach-bf548/include/mach/defBF542.h
arch/blackfin/mach-bf548/include/mach/defBF544.h
arch/blackfin/mach-bf548/include/mach/defBF547.h
arch/blackfin/mach-bf548/include/mach/defBF54x_base.h
arch/blackfin/mach-bf548/include/mach/gpio.h
arch/blackfin/mach-bf548/include/mach/portmux.h
arch/blackfin/mach-bf561/include/mach/anomaly.h
arch/blackfin/mach-bf561/include/mach/gpio.h
arch/blackfin/mach-bf561/include/mach/portmux.h
arch/blackfin/mach-common/arch_checks.c
arch/blackfin/mach-common/cache.S
arch/blackfin/mach-common/dpmc_modes.S
arch/blackfin/mach-common/pm.c
arch/cris/include/asm/ioctls.h
arch/frv/include/asm/highmem.h
arch/h8300/include/asm/md.h [deleted file]
arch/ia64/Kconfig
arch/ia64/kernel/smpboot.c
arch/m68k/include/asm/md.h [deleted file]
arch/mips/include/asm/highmem.h
arch/mips/include/asm/statfs.h
arch/mips/mm/highmem.c
arch/mn10300/include/asm/highmem.h
arch/parisc/hpux/sys_hpux.c
arch/parisc/include/asm/cacheflush.h
arch/powerpc/Makefile
arch/powerpc/configs/40x/acadia_defconfig
arch/powerpc/configs/40x/ep405_defconfig
arch/powerpc/configs/40x/hcu4_defconfig
arch/powerpc/configs/40x/kilauea_defconfig
arch/powerpc/configs/40x/makalu_defconfig
arch/powerpc/configs/40x/virtex_defconfig
arch/powerpc/configs/40x/walnut_defconfig
arch/powerpc/configs/44x/arches_defconfig
arch/powerpc/configs/44x/bamboo_defconfig
arch/powerpc/configs/44x/canyonlands_defconfig
arch/powerpc/configs/44x/ebony_defconfig
arch/powerpc/configs/44x/eiger_defconfig
arch/powerpc/configs/44x/icon_defconfig
arch/powerpc/configs/44x/iss476-smp_defconfig
arch/powerpc/configs/44x/katmai_defconfig
arch/powerpc/configs/44x/rainier_defconfig
arch/powerpc/configs/44x/redwood_defconfig
arch/powerpc/configs/44x/sam440ep_defconfig
arch/powerpc/configs/44x/sequoia_defconfig
arch/powerpc/configs/44x/taishan_defconfig
arch/powerpc/configs/44x/virtex5_defconfig
arch/powerpc/configs/44x/warp_defconfig
arch/powerpc/configs/52xx/cm5200_defconfig
arch/powerpc/configs/52xx/lite5200b_defconfig
arch/powerpc/configs/52xx/motionpro_defconfig
arch/powerpc/configs/52xx/pcm030_defconfig
arch/powerpc/configs/52xx/tqm5200_defconfig
arch/powerpc/configs/83xx/asp8347_defconfig
arch/powerpc/configs/83xx/kmeter1_defconfig
arch/powerpc/configs/83xx/mpc8313_rdb_defconfig
arch/powerpc/configs/83xx/mpc8315_rdb_defconfig
arch/powerpc/configs/83xx/mpc832x_mds_defconfig
arch/powerpc/configs/83xx/mpc832x_rdb_defconfig
arch/powerpc/configs/83xx/mpc834x_itx_defconfig
arch/powerpc/configs/83xx/mpc834x_itxgp_defconfig
arch/powerpc/configs/83xx/mpc834x_mds_defconfig
arch/powerpc/configs/83xx/mpc836x_mds_defconfig
arch/powerpc/configs/83xx/mpc836x_rdk_defconfig
arch/powerpc/configs/83xx/mpc837x_mds_defconfig
arch/powerpc/configs/83xx/mpc837x_rdb_defconfig
arch/powerpc/configs/83xx/sbc834x_defconfig
arch/powerpc/configs/85xx/ksi8560_defconfig
arch/powerpc/configs/85xx/mpc8540_ads_defconfig
arch/powerpc/configs/85xx/mpc8560_ads_defconfig
arch/powerpc/configs/85xx/mpc85xx_cds_defconfig
arch/powerpc/configs/85xx/sbc8548_defconfig
arch/powerpc/configs/85xx/sbc8560_defconfig
arch/powerpc/configs/85xx/socrates_defconfig
arch/powerpc/configs/85xx/stx_gp3_defconfig
arch/powerpc/configs/85xx/tqm8540_defconfig
arch/powerpc/configs/85xx/tqm8541_defconfig
arch/powerpc/configs/85xx/tqm8548_defconfig
arch/powerpc/configs/85xx/tqm8555_defconfig
arch/powerpc/configs/85xx/tqm8560_defconfig
arch/powerpc/configs/85xx/xes_mpc85xx_defconfig
arch/powerpc/configs/86xx/gef_ppc9a_defconfig
arch/powerpc/configs/86xx/gef_sbc310_defconfig
arch/powerpc/configs/86xx/gef_sbc610_defconfig
arch/powerpc/configs/86xx/mpc8610_hpcd_defconfig
arch/powerpc/configs/86xx/mpc8641_hpcn_defconfig
arch/powerpc/configs/86xx/sbc8641d_defconfig
arch/powerpc/configs/adder875_defconfig
arch/powerpc/configs/amigaone_defconfig
arch/powerpc/configs/c2k_defconfig
arch/powerpc/configs/cell_defconfig
arch/powerpc/configs/celleb_defconfig
arch/powerpc/configs/chrp32_defconfig
arch/powerpc/configs/ep8248e_defconfig
arch/powerpc/configs/ep88xc_defconfig
arch/powerpc/configs/g5_defconfig
arch/powerpc/configs/gamecube_defconfig
arch/powerpc/configs/holly_defconfig
arch/powerpc/configs/iseries_defconfig
arch/powerpc/configs/linkstation_defconfig
arch/powerpc/configs/maple_defconfig
arch/powerpc/configs/mgcoge_defconfig
arch/powerpc/configs/mgsuvd_defconfig
arch/powerpc/configs/mpc512x_defconfig
arch/powerpc/configs/mpc5200_defconfig
arch/powerpc/configs/mpc7448_hpc2_defconfig
arch/powerpc/configs/mpc8272_ads_defconfig
arch/powerpc/configs/mpc83xx_defconfig
arch/powerpc/configs/mpc85xx_defconfig
arch/powerpc/configs/mpc85xx_smp_defconfig
arch/powerpc/configs/mpc866_ads_defconfig
arch/powerpc/configs/mpc86xx_defconfig
arch/powerpc/configs/mpc885_ads_defconfig
arch/powerpc/configs/pasemi_defconfig
arch/powerpc/configs/pmac32_defconfig
arch/powerpc/configs/ppc40x_defconfig
arch/powerpc/configs/ppc44x_defconfig
arch/powerpc/configs/ppc64_defconfig
arch/powerpc/configs/ppc64e_defconfig
arch/powerpc/configs/ppc6xx_defconfig
arch/powerpc/configs/pq2fads_defconfig
arch/powerpc/configs/prpmc2800_defconfig
arch/powerpc/configs/ps3_defconfig
arch/powerpc/configs/pseries_defconfig
arch/powerpc/configs/storcenter_defconfig
arch/powerpc/configs/tqm8xx_defconfig
arch/powerpc/configs/wii_defconfig
arch/powerpc/include/asm/highmem.h
arch/powerpc/include/asm/mpc52xx.h
arch/powerpc/include/asm/mpc52xx_psc.h
arch/powerpc/kernel/setup-common.c
arch/powerpc/mm/highmem.c
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/platforms/cell/spufs/inode.c
arch/s390/hypfs/inode.c
arch/s390/include/asm/mmu.h
arch/s390/include/asm/statfs.h
arch/s390/mm/vmem.c
arch/sparc/Kconfig.debug
arch/sparc/configs/sparc64_defconfig
arch/sparc/include/asm/highmem.h
arch/sparc/include/asm/parport.h
arch/sparc/include/asm/perf_event.h
arch/sparc/include/asm/uaccess_32.h
arch/sparc/include/asm/uaccess_64.h
arch/sparc/kernel/helpers.S
arch/sparc/mm/highmem.c
arch/um/drivers/chan_kern.c
arch/um/include/shared/os.h
arch/um/kernel/ksyms.c
arch/um/kernel/ptrace.c
arch/um/os-Linux/file.c
arch/um/os-Linux/user_syms.c
arch/x86/ia32/ia32entry.S
arch/x86/ia32/sys_ia32.c
arch/x86/include/asm/highmem.h
arch/x86/include/asm/pgtable_64.h
arch/x86/include/asm/sys_ia32.h
arch/x86/include/asm/unistd_32.h
arch/x86/include/asm/unistd_64.h
arch/x86/kernel/smpboot.c
arch/x86/kernel/syscall_table_32.S
arch/x86/mm/highmem_32.c
drivers/atm/solos-pci.c
drivers/base/node.c
drivers/char/ipmi/ipmi_si_intf.c
drivers/char/misc.c
drivers/char/pcmcia/ipwireless/network.c
drivers/char/vt.c
drivers/cpuidle/cpuidle.c
drivers/cpuidle/governors/menu.c
drivers/dma/Kconfig
drivers/dma/Makefile
drivers/dma/at_hdmac.c
drivers/dma/coh901318.c
drivers/dma/dmatest.c
drivers/dma/intel_mid_dma.c [new file with mode: 0644]
drivers/dma/intel_mid_dma_regs.h [new file with mode: 0644]
drivers/dma/ioat/dma.h
drivers/dma/ioat/dma_v2.c
drivers/dma/ioat/dma_v3.c
drivers/dma/pch_dma.c [new file with mode: 0644]
drivers/dma/ste_dma40.c
drivers/dma/ste_dma40_ll.c
drivers/dma/ste_dma40_ll.h
drivers/dma/timb_dma.c
drivers/firmware/edd.c
drivers/gpu/drm/drm_crtc_helper.c
drivers/hwmon/Kconfig
drivers/hwmon/Makefile
drivers/hwmon/coretemp.c
drivers/hwmon/f71882fg.c
drivers/hwmon/hdaps.c
drivers/hwmon/jc42.c [new file with mode: 0644]
drivers/hwmon/smm665.c [new file with mode: 0644]
drivers/ide/ide-cd.c
drivers/ide/ide-taskfile.c
drivers/ide/tx4938ide.c
drivers/ide/tx4939ide.c
drivers/ide/via82cxxx.c
drivers/input/mouse/appletouch.c
drivers/isdn/gigaset/bas-gigaset.c
drivers/isdn/gigaset/capi.c
drivers/isdn/sc/ioctl.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/misc/bh1780gli.c [new file with mode: 0644]
drivers/misc/bmp085.c [new file with mode: 0644]
drivers/misc/hmc6352.c [new file with mode: 0644]
drivers/misc/hpilo.c
drivers/misc/hpilo.h
drivers/mtd/Kconfig
drivers/mtd/afs.c
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/chips/cfi_cmdset_0002.c
drivers/mtd/chips/cfi_cmdset_0020.c
drivers/mtd/chips/cfi_probe.c
drivers/mtd/chips/cfi_util.c
drivers/mtd/chips/chipreg.c
drivers/mtd/chips/map_absent.c
drivers/mtd/chips/map_ram.c
drivers/mtd/chips/map_rom.c
drivers/mtd/cmdlinepart.c
drivers/mtd/devices/docecc.c
drivers/mtd/devices/docprobe.c
drivers/mtd/devices/m25p80.c
drivers/mtd/devices/mtd_dataflash.c
drivers/mtd/devices/mtdram.c
drivers/mtd/devices/pmc551.c
drivers/mtd/devices/sst25l.c
drivers/mtd/ftl.c
drivers/mtd/inftlcore.c
drivers/mtd/inftlmount.c
drivers/mtd/lpddr/lpddr_cmds.c
drivers/mtd/maps/Kconfig
drivers/mtd/maps/Makefile
drivers/mtd/maps/ixp4xx.c
drivers/mtd/maps/physmap.c
drivers/mtd/maps/physmap_of.c
drivers/mtd/maps/redwood.c [deleted file]
drivers/mtd/mtd_blkdevs.c
drivers/mtd/mtdblock.c
drivers/mtd/mtdblock_ro.c
drivers/mtd/mtdchar.c
drivers/mtd/mtdconcat.c
drivers/mtd/mtdcore.c
drivers/mtd/mtdoops.c
drivers/mtd/mtdpart.c
drivers/mtd/mtdsuper.c
drivers/mtd/nand/Kconfig
drivers/mtd/nand/atmel_nand.c
drivers/mtd/nand/bf5xx_nand.c
drivers/mtd/nand/davinci_nand.c
drivers/mtd/nand/denali.c
drivers/mtd/nand/denali.h
drivers/mtd/nand/diskonchip.c
drivers/mtd/nand/mxc_nand.c
drivers/mtd/nand/nand_base.c
drivers/mtd/nand/nand_bbt.c
drivers/mtd/nand/nand_ids.c
drivers/mtd/nand/nandsim.c
drivers/mtd/nand/plat_nand.c
drivers/mtd/nand/r852.c
drivers/mtd/nand/rtc_from4.c
drivers/mtd/nand/s3c2410.c
drivers/mtd/nand/sm_common.c
drivers/mtd/nftlcore.c
drivers/mtd/nftlmount.c
drivers/mtd/ofpart.c
drivers/mtd/onenand/Kconfig
drivers/mtd/onenand/onenand_base.c
drivers/mtd/onenand/onenand_bbt.c
drivers/mtd/onenand/samsung.c
drivers/mtd/redboot.c
drivers/mtd/rfd_ftl.c
drivers/mtd/ssfdc.c
drivers/mtd/tests/mtd_pagetest.c
drivers/net/cxgb3/cxgb3_main.c
drivers/net/cxgb4vf/cxgb4vf_main.c
drivers/net/davinci_emac.c
drivers/net/e100.c
drivers/net/e1000/e1000_main.c
drivers/net/e1000e/netdev.c
drivers/net/enic/enic_main.c
drivers/net/igb/igb_main.c
drivers/net/igbvf/netdev.c
drivers/net/ixgb/ixgb_main.c
drivers/net/ixgbe/ixgbe_main.c
drivers/net/ixgbevf/ixgbevf_main.c
drivers/net/netxen/netxen_nic_main.c
drivers/net/ppp_async.c
drivers/net/ppp_synctty.c
drivers/net/pppoe.c
drivers/net/usb/usbnet.c
drivers/net/via-velocity.c
drivers/net/virtio_net.c
drivers/net/wireless/ath/ath9k/ar9002_calib.c
drivers/net/wireless/ath/ath9k/ar9003_calib.c
drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
drivers/net/wireless/ath/ath9k/ar9003_paprd.c
drivers/net/wireless/ath/ath9k/ar9003_phy.c
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/calib.c
drivers/net/wireless/ath/ath9k/calib.h
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_main.c
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/hw.h
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/ipw2x00/ipw2100.c
drivers/net/wireless/iwlwifi/iwl-agn-debugfs.c
drivers/net/wireless/iwlwifi/iwl-agn-lib.c
drivers/net/wireless/iwlwifi/iwl-agn-rs.c
drivers/net/wireless/iwlwifi/iwl-agn-tx.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl-debug.h
drivers/net/wireless/iwlwifi/iwl-devtrace.h
drivers/net/wireless/iwlwifi/iwl-scan.c
drivers/net/wireless/iwlwifi/iwl-sta.c
drivers/net/wireless/libertas/cfg.c
drivers/net/wireless/libertas/dev.h
drivers/net/wireless/libertas/main.c
drivers/net/wireless/p54/p54pci.c
drivers/net/wireless/rt2x00/rt2x00pci.c
drivers/net/wireless/rtl818x/rtl8180_dev.c
drivers/net/wireless/wl12xx/wl1271_spi.c
drivers/pci/intel-iommu.c
drivers/s390/block/dasd_eer.c
drivers/s390/char/monreader.c
drivers/s390/char/monwriter.c
drivers/serial/crisv10.c
drivers/staging/pohmelfs/inode.c
drivers/video/w100fb.c
fs/9p/v9fs_vfs.h
fs/9p/vfs_inode.c
fs/9p/vfs_super.c
fs/adfs/inode.c
fs/affs/affs.h
fs/affs/file.c
fs/affs/inode.c
fs/affs/super.c
fs/afs/inode.c
fs/afs/internal.h
fs/afs/super.c
fs/attr.c
fs/bfs/bfs.h
fs/bfs/file.c
fs/bfs/inode.c
fs/binfmt_misc.c
fs/block_dev.c
fs/btrfs/ctree.h
fs/btrfs/inode.c
fs/btrfs/super.c
fs/buffer.c
fs/cachefiles/bind.c
fs/cachefiles/daemon.c
fs/cifs/cifsfs.c
fs/cifs/inode.c
fs/coda/inode.c
fs/compat.c
fs/cramfs/inode.c
fs/dcache.c
fs/direct-io.c
fs/drop_caches.c
fs/ecryptfs/file.c
fs/ecryptfs/inode.c
fs/ecryptfs/messaging.c
fs/ecryptfs/super.c
fs/exec.c
fs/exofs/exofs.h
fs/exofs/file.c
fs/exofs/inode.c
fs/exofs/super.c
fs/ext2/balloc.c
fs/ext2/dir.c
fs/ext2/ext2.h
fs/ext2/ialloc.c
fs/ext2/inode.c
fs/ext2/super.c
fs/ext2/xattr.c
fs/ext3/ialloc.c
fs/ext3/inode.c
fs/ext3/super.c
fs/ext3/xattr.c
fs/ext4/ext4.h
fs/ext4/ialloc.c
fs/ext4/inode.c
fs/ext4/super.c
fs/ext4/xattr.c
fs/fat/fat.h
fs/fat/file.c
fs/fat/inode.c
fs/file_table.c
fs/freevxfs/vxfs_extern.h
fs/freevxfs/vxfs_inode.c
fs/freevxfs/vxfs_super.c
fs/fs-writeback.c
fs/fuse/dir.c
fs/fuse/inode.c
fs/gfs2/aops.c
fs/gfs2/inode.c
fs/gfs2/ops_inode.c
fs/gfs2/super.c
fs/gfs2/xattr.c
fs/hfs/hfs_fs.h
fs/hfs/inode.c
fs/hfs/super.c
fs/hfsplus/hfsplus_fs.h
fs/hfsplus/inode.c
fs/hfsplus/super.c
fs/hostfs/hostfs.h
fs/hostfs/hostfs_kern.c
fs/hostfs/hostfs_user.c
fs/hpfs/file.c
fs/hpfs/hpfs_fn.h
fs/hpfs/inode.c
fs/hpfs/super.c
fs/hppfs/hppfs.c
fs/hugetlbfs/inode.c
fs/inode.c
fs/jffs2/background.c
fs/jffs2/build.c
fs/jffs2/compr.c
fs/jffs2/compr.h
fs/jffs2/compr_lzo.c
fs/jffs2/compr_rtime.c
fs/jffs2/compr_rubin.c
fs/jffs2/compr_zlib.c
fs/jffs2/debug.c
fs/jffs2/debug.h
fs/jffs2/dir.c
fs/jffs2/erase.c
fs/jffs2/file.c
fs/jffs2/fs.c
fs/jffs2/gc.c
fs/jffs2/ioctl.c
fs/jffs2/jffs2_fs_i.h
fs/jffs2/jffs2_fs_sb.h
fs/jffs2/nodelist.h
fs/jffs2/os-linux.h
fs/jffs2/super.c
fs/jffs2/xattr.c
fs/jfs/file.c
fs/jfs/inode.c
fs/jfs/jfs_inode.h
fs/jfs/super.c
fs/libfs.c
fs/logfs/dir.c
fs/logfs/file.c
fs/logfs/inode.c
fs/logfs/journal.c
fs/logfs/logfs.h
fs/logfs/readwrite.c
fs/logfs/segment.c
fs/logfs/super.c
fs/mbcache.c
fs/minix/bitmap.c
fs/minix/dir.c
fs/minix/file.c
fs/minix/inode.c
fs/minix/minix.h
fs/namei.c
fs/namespace.c
fs/ncpfs/inode.c
fs/nfs/inode.c
fs/nfs/internal.h
fs/nfs/super.c
fs/nfsd/nfs4xdr.c
fs/nfsd/vfs.c
fs/nilfs2/dir.c
fs/nilfs2/gcdat.c
fs/nilfs2/inode.c
fs/nilfs2/nilfs.h
fs/nilfs2/recovery.c
fs/nilfs2/super.c
fs/notify/Kconfig
fs/notify/Makefile
fs/notify/dnotify/dnotify.c
fs/notify/fanotify/Kconfig [new file with mode: 0644]
fs/notify/fanotify/Makefile [new file with mode: 0644]
fs/notify/fanotify/fanotify.c [new file with mode: 0644]
fs/notify/fanotify/fanotify_user.c [new file with mode: 0644]
fs/notify/fsnotify.c
fs/notify/fsnotify.h
fs/notify/group.c
fs/notify/inode_mark.c
fs/notify/inotify/Kconfig
fs/notify/inotify/Makefile
fs/notify/inotify/inotify.c [deleted file]
fs/notify/inotify/inotify.h
fs/notify/inotify/inotify_fsnotify.c
fs/notify/inotify/inotify_user.c
fs/notify/mark.c [new file with mode: 0644]
fs/notify/notification.c
fs/notify/vfsmount_mark.c [new file with mode: 0644]
fs/ntfs/inode.c
fs/ntfs/inode.h
fs/ntfs/super.c
fs/ocfs2/aops.c
fs/ocfs2/dlmfs/dlmfs.c
fs/ocfs2/file.c
fs/ocfs2/inode.c
fs/ocfs2/inode.h
fs/ocfs2/super.c
fs/omfs/dir.c
fs/omfs/file.c
fs/omfs/inode.c
fs/omfs/omfs.h
fs/omfs/omfs_fs.h
fs/open.c
fs/proc/base.c
fs/proc/generic.c
fs/proc/inode.c
fs/proc/proc_sysctl.c
fs/qnx4/inode.c
fs/quota/dquot.c
fs/ramfs/file-nommu.c
fs/read_write.c
fs/readdir.c
fs/reiserfs/file.c
fs/reiserfs/inode.c
fs/reiserfs/super.c
fs/smbfs/inode.c
fs/statfs.c
fs/super.c
fs/sync.c
fs/sysfs/inode.c
fs/sysfs/mount.c
fs/sysfs/sysfs.h
fs/sysv/dir.c
fs/sysv/file.c
fs/sysv/ialloc.c
fs/sysv/inode.c
fs/sysv/itree.c
fs/sysv/super.c
fs/sysv/sysv.h
fs/ubifs/file.c
fs/ubifs/super.c
fs/ubifs/ubifs.h
fs/udf/file.c
fs/udf/ialloc.c
fs/udf/inode.c
fs/udf/super.c
fs/udf/udfdecl.h
fs/ufs/dir.c
fs/ufs/ialloc.c
fs/ufs/inode.c
fs/ufs/super.c
fs/ufs/truncate.c
fs/ufs/ufs.h
fs/ufs/util.h
fs/xfs/linux-2.6/xfs_aops.c
fs/xfs/linux-2.6/xfs_iops.c
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/linux-2.6/xfs_trace.h
fs/xfs/xfs_vnodeops.c
include/asm-generic/atomic.h
include/asm-generic/fcntl.h
include/asm-generic/io.h
include/asm-generic/statfs.h
include/asm-generic/topology.h
include/asm-generic/unistd.h
include/linux/Kbuild
include/linux/buffer_head.h
include/linux/compiler-gcc.h
include/linux/cpuidle.h
include/linux/dcache.h
include/linux/dmaengine.h
include/linux/dnotify.h
include/linux/ext3_fs.h
include/linux/fanotify.h [new file with mode: 0644]
include/linux/flex_array.h
include/linux/fs.h
include/linux/fsnotify.h
include/linux/fsnotify_backend.h
include/linux/highmem.h
include/linux/inotify.h
include/linux/intel_mid_dma.h [new file with mode: 0644]
include/linux/iommu-helper.h
include/linux/jffs2.h
include/linux/kernel.h
include/linux/ksm.h
include/linux/mbcache.h
include/linux/memcontrol.h
include/linux/mempolicy.h
include/linux/mm.h
include/linux/mmdebug.h
include/linux/mmzone.h
include/linux/mount.h
include/linux/mtd/bbm.h
include/linux/mtd/blktrans.h
include/linux/mtd/cfi.h
include/linux/mtd/cfi_endian.h
include/linux/mtd/compatmac.h [deleted file]
include/linux/mtd/concat.h
include/linux/mtd/doc2000.h
include/linux/mtd/flashchip.h
include/linux/mtd/gen_probe.h
include/linux/mtd/map.h
include/linux/mtd/mtd.h
include/linux/mtd/nand.h
include/linux/mtd/nand_ecc.h
include/linux/mtd/nftl.h
include/linux/mtd/onenand.h
include/linux/mtd/physmap.h
include/linux/oom.h
include/linux/pagemap.h
include/linux/pch_dma.h [new file with mode: 0644]
include/linux/percpu_counter.h
include/linux/posix-timers.h
include/linux/ppp_channel.h
include/linux/radix-tree.h
include/linux/reiserfs_fs.h
include/linux/reiserfs_fs_i.h
include/linux/resource.h
include/linux/rmap.h
include/linux/sched.h
include/linux/security.h
include/linux/shmem_fs.h
include/linux/skbuff.h
include/linux/statfs.h
include/linux/swap.h
include/linux/syscalls.h
include/linux/topology.h
include/mtd/mtd-abi.h
include/mtd/mtd-user.h
include/mtd/nftl-user.h
include/mtd/ubi-user.h
include/net/bluetooth/hci_core.h
include/trace/events/gfpflags.h [new file with mode: 0644]
include/trace/events/kmem.h
include/trace/events/vmscan.h [new file with mode: 0644]
init/Kconfig
init/main.c
ipc/mqueue.c
kernel/Makefile
kernel/acct.c
kernel/audit.c
kernel/audit.h
kernel/audit_tree.c
kernel/audit_watch.c
kernel/auditfilter.c
kernel/auditsc.c
kernel/compat.c
kernel/exec_domain.c
kernel/fork.c
kernel/posix-cpu-timers.c
kernel/power/hibernate.c
kernel/power/snapshot.c
kernel/power/swap.c
kernel/printk.c
kernel/range.c
kernel/stop_machine.c
kernel/sys.c
kernel/sys_ni.c
kernel/sysctl.c
kernel/workqueue.c
lib/Kconfig.debug
lib/flex_array.c
lib/iommu-helper.c
lib/list_debug.c
lib/percpu_counter.c
lib/radix-tree.c
lib/rwsem.c
lib/scatterlist.c
lib/vsprintf.c
mm/filemap.c
mm/hugetlb.c
mm/init-mm.c
mm/kmemleak.c
mm/ksm.c
mm/memblock.c
mm/memcontrol.c
mm/memory.c
mm/mempolicy.c
mm/migrate.c
mm/mmap.c
mm/oom_kill.c
mm/page-writeback.c
mm/page_alloc.c
mm/rmap.c
mm/shmem.c
mm/slab.c
mm/swapfile.c
mm/truncate.c
mm/util.c
mm/vmalloc.c
mm/vmscan.c
mm/vmstat.c
net/atm/pppoatm.c
net/bluetooth/hci_core.c
net/bluetooth/hci_sock.c
net/bluetooth/hci_sysfs.c
net/bluetooth/l2cap.c
net/bluetooth/rfcomm/tty.c
net/core/dev.c
net/ipv4/tcp_input.c
net/irda/irnet/irnet_ppp.c
net/l2tp/l2tp_ppp.c
net/mac80211/main.c
net/mac80211/scan.c
net/rxrpc/ar-ack.c
net/rxrpc/ar-call.c
net/sched/act_nat.c
net/sched/cls_flow.c
net/sched/cls_rsvp.h
net/sched/sch_sfq.c
scripts/checkpatch.pl
scripts/mod/modpost.c
security/capability.c
security/security.c
security/selinux/hooks.c
sound/soc/fsl/mpc5200_psc_ac97.c

diff --git a/Documentation/ABI/testing/sysfs-bus-i2c-devices-hm6352 b/Documentation/ABI/testing/sysfs-bus-i2c-devices-hm6352
new file mode 100644 (file)
index 0000000..feb2e4a
--- /dev/null
@@ -0,0 +1,21 @@
+Where:         /sys/bus/i2c/devices/.../heading0_input
+Date:          April 2010
+Kernel Version: 2.6.36?
+Contact:       alan.cox@intel.com
+Description:   Reports the current heading from the compass as a floating
+               point value in degrees.
+
+Where:         /sys/bus/i2c/devices/.../power_state
+Date:          April 2010
+Kernel Version: 2.6.36?
+Contact:       alan.cox@intel.com
+Description:   Sets the power state of the device. 0 sets the device into
+               sleep mode, 1 wakes it up.
+
+Where:         /sys/bus/i2c/devices/.../calibration
+Date:          April 2010
+Kernel Version: 2.6.36?
+Contact:       alan.cox@intel.com
+Description:   Sets the calibration on or off (1 = on, 0 = off). See the
+               chip data sheet.
+
diff --git a/Documentation/ABI/testing/sysfs-i2c-bmp085 b/Documentation/ABI/testing/sysfs-i2c-bmp085
new file mode 100644 (file)
index 0000000..585962a
--- /dev/null
@@ -0,0 +1,31 @@
+What:          /sys/bus/i2c/devices/<busnum>-<devaddr>/pressure0_input
+Date:          June 2010
+Contact:       Christoph Mair <christoph.mair@gmail.com>
+Description:   Start a pressure measurement and read the result. Values
+               represent the ambient air pressure in pascal (0.01 millibar).
+
+               Reading: returns the current air pressure.
+
+
+What:          /sys/bus/i2c/devices/<busnum>-<devaddr>/temp0_input
+Date:          June 2010
+Contact:       Christoph Mair <christoph.mair@gmail.com>
+Description:   Measure the ambient temperature. The returned value represents
+               the ambient temperature in units of 0.1 degree celsius.
+
+               Reading: returns the current temperature.
+
+
+What:          /sys/bus/i2c/devices/<busnum>-<devaddr>/oversampling
+Date:          June 2010
+Contact:       Christoph Mair <christoph.mair@gmail.com>
+Description:   Tell the bmp085 to use more samples to calculate a pressure
+               value. When writing to this file the chip will use 2^x samples
+               to calculate the next pressure value with x being the value
+               written. Using this feature will decrease RMS noise and
+               increase the measurement time.
+
+               Reading: returns the current oversampling setting.
+
+               Writing: sets a new oversampling setting.
+               Accepted values: 0..3.
index 72651f788f4e3536149ef5e7ddfbed96a8f14d2f..689e2371095cc5dfea9927120009341f369159aa 100644 (file)
@@ -98,6 +98,17 @@ system, git, as a "commit log".  See #15, below.
 If your description starts to get long, that's a sign that you probably
 need to split up your patch.  See #3, next.
 
+When you submit or resubmit a patch or patch series, include the
+complete patch description and justification for it.  Don't just
+say that this is version N of the patch (series).  Don't expect the
+patch merger to refer back to earlier patch versions or referenced
+URLs to find the patch description and put that into the patch.
+I.e., the patch (series) and its description should be self-contained.
+This benefits both the patch merger(s) and reviewers.  Some reviewers
+probably didn't even receive earlier versions of the patch.
+
+If the patch fixes a logged bug entry, refer to that bug entry by
+number and URL.
 
 
 3) Separate your changes.
index c34e12440fec39f6191418877ba13085b5b3edb1..2df0365f2dff0ec2a02fd35025f0565ae31648fa 100644 (file)
@@ -1,11 +1,8 @@
 00-INDEX
        - This file
 
-cachefeatures.txt
-       - Supported cache features.
-
-Filesystems
-       - Requirements for mounting the root file system.
-
-bfin-gpio-note.txt
+bfin-gpio-notes.txt
        - Notes in developing/using bfin-gpio driver.
+
+bfin-spi-notes.txt
+       - Notes for using bfin spi bus driver.
diff --git a/Documentation/blackfin/Filesystems b/Documentation/blackfin/Filesystems
deleted file mode 100644 (file)
index 51260a1..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * File:         Documentation/blackfin/Filesystems
- * Based on:
- * Author:
- *
- * Created:
- * Description:  This file contains the simple DMA Implementation for Blackfin
- *
- * Rev:          $Id: Filesystems 2384 2006-11-01 04:12:43Z magicyang $
- *
- * Modified:
- *               Copyright 2004-2006 Analog Devices Inc.
- *
- * Bugs:         Enter bugs at http://blackfin.uclinux.org/
- *
- */
-
-               How to mount the root file system in uClinux/Blackfin
-               -----------------------------------------------------
-
-1      Mounting EXT3 File system.
-       ------------------------
-
-       Creating an EXT3 File system for uClinux/Blackfin:
-
-
-Please follow the steps to form the EXT3 File system and mount the same as root
-file system.
-
-a      Make an ext3 file system as large as you want the final root file
-       system.
-
-               mkfs.ext3  /dev/ram0 <your-rootfs-size-in-1k-blocks>
-
-b      Mount this Empty file system on a free directory as:
-
-               mount -t ext3 /dev/ram0  ./test
-                       where ./test is the empty directory.
-
-c      Copy your root fs directory that you have so carefully made over.
-
-               cp -af  /tmp/my_final_rootfs_files/* ./test
-
-               (For ex: cp -af uClinux-dist/romfs/* ./test)
-
-d      If you have done everything right till now you should be able to see
-       the required "root" dir's (that's etc, root, bin, lib, sbin...)
-
-e      Now unmount the file system
-
-               umount  ./test
-
-f      Create the root file system image.
-
-               dd if=/dev/ram0 bs=1k count=<your-rootfs-size-in-1k-blocks> \
-               > ext3fs.img
-
-
-Now you have to tell the kernel that will be mounting this file system as
-rootfs.
-So do a make menuconfig under kernel and select the Ext3 journaling file system
-support under File system --> submenu.
-
-
-2.     Mounting EXT2 File system.
-       -------------------------
-
-By default the ext2 file system image will be created if you invoke make from
-the top uClinux-dist directory.
-
-
-3.     Mounting CRAMFS File System
-       ----------------------------
-
-To create a CRAMFS file system image execute the command
-
-       mkfs.cramfs ./test cramfs.img
-
-       where ./test is the target directory.
-
-
-4.     Mounting ROMFS File System
-       --------------------------
-
-To create a ROMFS file system image execute the command
-
-       genromfs -v -V "ROMdisk" -f romfs.img -d ./test
-
-       where ./test is the target directory
-
-
-5.     Mounting the JFFS2 Filesystem
-       -----------------------------
-
-To create a compressed JFFS filesystem (JFFS2), please execute the command
-
-       mkfs.jffs2 -d ./test -o jffs2.img
-
-       where ./test is the target directory.
-
-However, please make sure the following is in your kernel config.
-
-/*
- * RAM/ROM/Flash chip drivers
- */
-#define CONFIG_MTD_CFI 1
-#define CONFIG_MTD_ROM 1
-/*
- * Mapping drivers for chip access
- */
-#define CONFIG_MTD_COMPLEX_MAPPINGS 1
-#define CONFIG_MTD_BF533 1
-#undef CONFIG_MTD_UCLINUX
-
-Through the u-boot boot loader, use the jffs2.img in the corresponding
-partition made in linux-2.6.x/drivers/mtd/maps/bf533_flash.c.
-
-NOTE -         Currently the Flash driver is available only for EZKIT. Watch out for a
-       STAMP driver soon.
-
-
-6.     Mounting the NFS File system
-       -----------------------------
-
-       For mounting the NFS please do the following in the kernel config.
-
-       In Networking Support --> Networking options --> TCP/IP networking -->
-               IP: kernel level autoconfiguration
-
-       Enable BOOTP Support.
-
-       In Kernel hacking --> Compiled-in kernel boot parameter add the following
-
-               root=/dev/nfs rw ip=bootp
-
-       In File system --> Network File system, Enable
-
-               NFS file system support --> NFSv3 client support
-               Root File system on NFS
-
-       in uClibc menuconfig, do the following
-       In Networking Support
-               enable Remote Procedure Call (RPC) support
-                       Full RPC Support
-
-       On the Host side, ensure that /etc/dhcpd.conf looks something like this
-
-               ddns-update-style ad-hoc;
-               allow bootp;
-               subnet 10.100.4.0 netmask 255.255.255.0 {
-               default-lease-time 122209600;
-               max-lease-time 31557600;
-               group {
-                       host bf533 {
-                               hardware ethernet 00:CF:52:49:C3:01;
-                               fixed-address 10.100.4.50;
-                               option root-path "/home/nfsmount";
-                       }
-               }
-
-       ensure that /etc/exports looks something like this
-               /home/nfsmount *(rw,no_root_squash,no_all_squash)
-
-        run the following commands as root (may differ depending on your
-        distribution) :
-               -  service nfs start
-               -  service portmap start
-               -  service dhcpd start
-               -  /usr/sbin/exportfs
diff --git a/Documentation/blackfin/bfin-spi-notes.txt b/Documentation/blackfin/bfin-spi-notes.txt
new file mode 100644 (file)
index 0000000..556fa87
--- /dev/null
@@ -0,0 +1,14 @@
+SPI Chip Select behavior:
+
+With the Blackfin on-chip SPI peripheral, there is some logic tied to the CPHA
+bit whether the Slave Select Line is controlled by hardware (CPHA=0) or
+controlled by software (CPHA=1). However, the Linux SPI bus driver assumes that
+the Slave Select is always under software control and being asserted during
+the entire SPI transfer. - And not just bits_per_word duration.
+
+In most cases you can utilize SPI MODE_3 instead of MODE_0 to work-around this
+behavior. If your SPI slave device in question requires SPI MODE_0 or MODE_2
+timing, you can utilize the GPIO controlled SPI Slave Select option instead.
+
+You can even use the same pin whose peripheral role is a SSEL,
+but use it as a GPIO instead.
diff --git a/Documentation/blackfin/cachefeatures.txt b/Documentation/blackfin/cachefeatures.txt
deleted file mode 100644 (file)
index 75de51f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * File:         Documentation/blackfin/cachefeatures.txt
- * Based on:
- * Author:
- *
- * Created:
- * Description:  This file contains the simple DMA Implementation for Blackfin
- *
- * Rev:          $Id: cachefeatures.txt 2384 2006-11-01 04:12:43Z magicyang $
- *
- * Modified:
- *               Copyright 2004-2006 Analog Devices Inc.
- *
- * Bugs:         Enter bugs at http://blackfin.uclinux.org/
- *
- */
-
-       - Instruction and Data cache initialization.
-               icache_init();
-               dcache_init();
-
-       -  Instruction and Data cache Invalidation Routines, when flushing the
-          same is not required.
-               _icache_invalidate();
-               _dcache_invalidate();
-
-       Also, for invalidating the entire instruction and data cache, the below
-       routines are provided (another method for invalidation, refer page no 267 and 287 of
-       ADSP-BF533 Hardware Reference manual)
-
-               invalidate_entire_dcache();
-               invalidate_entire_icache();
-
-       -External Flushing of Instruction and data cache routines.
-
-               flush_instruction_cache();
-               flush_data_cache();
-
-       - Internal Flushing of Instruction and Data Cache.
-
-               icplb_flush();
-               dcplb_flush();
-
-       - Miscellaneous cache functions.
-
-               flush_cache_all();
-               flush_cache_mm();
-               invalidate_dcache_range();
-               flush_dcache_range();
-               flush_dcache_page();
-               flush_cache_range();
-               flush_cache_page();
-               invalidate_dcache_range();
-               flush_page_to_ram();
-
index 71f0fea1058f8d2b460596a8c8c15e18a275566d..b16cbe4152ea3560e32a98624c53cc77b22fc659 100644 (file)
@@ -151,6 +151,31 @@ Who:       Eric Biederman <ebiederm@xmission.com>
 
 ---------------------------
 
+What:  /proc/<pid>/oom_adj
+When:  August 2012
+Why:   /proc/<pid>/oom_adj allows userspace to influence the oom killer's
+       badness heuristic used to determine which task to kill when the kernel
+       is out of memory.
+
+       The badness heuristic has since been rewritten since the introduction of
+       this tunable such that its meaning is deprecated.  The value was
+       implemented as a bitshift on a score generated by the badness()
+       function that did not have any precise units of measure.  With the
+       rewrite, the score is given as a proportion of available memory to the
+       task allocating pages, so using a bitshift which grows the score
+       exponentially is, thus, impossible to tune with fine granularity.
+
+       A much more powerful interface, /proc/<pid>/oom_score_adj, was
+       introduced with the oom killer rewrite that allows users to increase or
+       decrease the badness() score linearly.  This interface will replace
+       /proc/<pid>/oom_adj.
+
+       A warning will be emitted to the kernel log if an application uses this
+       deprecated interface.  After it is printed once, future warnings will be
+       suppressed until the kernel is rebooted.
+
+---------------------------
+
 What:  remove EXPORT_SYMBOL(kernel_thread)
 When:  August 2006
 Files: arch/*/kernel/*_ksyms.c
@@ -335,14 +360,6 @@ When:      2.6.33
 Why:   Should be implemented in userspace, policy daemon.
 Who:   Johannes Berg <johannes@sipsolutions.net>
 
----------------------------
-
-What:  CONFIG_INOTIFY
-When:  2.6.33
-Why:   last user (audit) will be converted to the newer more generic
-       and more easily maintained fsnotify subsystem
-Who:   Eric Paris <eparis@redhat.com>
-
 ----------------------------
 
 What:  sound-slot/service-* module aliases and related clutters in
index 96d4293607ecfe22ed30e8d0ab518a8ddacbbba9..bbcc15651a21c1e1dac6c390d0fc17e93dda66be 100644 (file)
@@ -92,8 +92,8 @@ prototypes:
        void (*destroy_inode)(struct inode *);
        void (*dirty_inode) (struct inode *);
        int (*write_inode) (struct inode *, int);
-       void (*drop_inode) (struct inode *);
-       void (*delete_inode) (struct inode *);
+       int (*drop_inode) (struct inode *);
+       void (*evict_inode) (struct inode *);
        void (*put_super) (struct super_block *);
        void (*write_super) (struct super_block *);
        int (*sync_fs)(struct super_block *sb, int wait);
@@ -101,14 +101,13 @@ prototypes:
        int (*unfreeze_fs) (struct super_block *);
        int (*statfs) (struct dentry *, struct kstatfs *);
        int (*remount_fs) (struct super_block *, int *, char *);
-       void (*clear_inode) (struct inode *);
        void (*umount_begin) (struct super_block *);
        int (*show_options)(struct seq_file *, struct vfsmount *);
        ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
        ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
 
 locking rules:
-       All may block.
+       All may block [not true, see below]
        None have BKL
                        s_umount
 alloc_inode:
@@ -116,22 +115,25 @@ destroy_inode:
 dirty_inode:                           (must not sleep)
 write_inode:
 drop_inode:                            !!!inode_lock!!!
-delete_inode:
+evict_inode:
 put_super:             write
 write_super:           read
 sync_fs:               read
 freeze_fs:             read
 unfreeze_fs:           read
-statfs:                        no
-remount_fs:            maybe           (see below)
-clear_inode:
+statfs:                        maybe(read)     (see below)
+remount_fs:            write
 umount_begin:          no
 show_options:          no              (namespace_sem)
 quota_read:            no              (see below)
 quota_write:           no              (see below)
 
-->remount_fs() will have the s_umount exclusive lock if it's already mounted.
-When called from get_sb_single, it does NOT have the s_umount lock.
+->statfs() has s_umount (shared) when called by ustat(2) (native or
+compat), but that's an accident of bad API; s_umount is used to pin
+the superblock down when we only have dev_t given us by userland to
+identify the superblock.  Everything else (statfs(), fstatfs(), etc.)
+doesn't hold it when calling ->statfs() - superblock is pinned down
+by resolving the pathname passed to syscall.
 ->quota_read() and ->quota_write() functions are both guaranteed to
 be the only ones operating on the quota file by the quota code (via
 dqio_sem) (unless an admin really wants to screw up something and
index a7e9746ee7ea44934c017b4c2a26ef6df9361db8..b12c89538680aaf5f2cf3f5f872321f73a3d57ab 100644 (file)
@@ -273,3 +273,48 @@ it's safe to remove it.  If you don't need it, remove it.
 deliberate; as soon as struct block_device * is propagated in a reasonable
 way by that code fixing will become trivial; until then nothing can be
 done.
+
+[mandatory]
+
+       block truncatation on error exit from ->write_begin, and ->direct_IO
+moved from generic methods (block_write_begin, cont_write_begin,
+nobh_write_begin, blockdev_direct_IO*) to callers.  Take a look at
+ext2_write_failed and callers for an example.
+
+[mandatory]
+
+       ->truncate is going away.  The whole truncate sequence needs to be
+implemented in ->setattr, which is now mandatory for filesystems
+implementing on-disk size changes.  Start with a copy of the old inode_setattr
+and vmtruncate, and the reorder the vmtruncate + foofs_vmtruncate sequence to
+be in order of zeroing blocks using block_truncate_page or similar helpers,
+size update and on finally on-disk truncation which should not fail.
+inode_change_ok now includes the size checks for ATTR_SIZE and must be called
+in the beginning of ->setattr unconditionally.
+
+[mandatory]
+
+       ->clear_inode() and ->delete_inode() are gone; ->evict_inode() should
+be used instead.  It gets called whenever the inode is evicted, whether it has
+remaining links or not.  Caller does *not* evict the pagecache or inode-associated
+metadata buffers; getting rid of those is responsibility of method, as it had
+been for ->delete_inode().
+       ->drop_inode() returns int now; it's called on final iput() with inode_lock
+held and it returns true if filesystems wants the inode to be dropped.  As before,
+generic_drop_inode() is still the default and it's been updated appropriately.
+generic_delete_inode() is also alive and it consists simply of return 1.  Note that
+all actual eviction work is done by caller after ->drop_inode() returns.
+       clear_inode() is gone; use end_writeback() instead.  As before, it must
+be called exactly once on each call of ->evict_inode() (as it used to be for
+each call of ->delete_inode()).  Unlike before, if you are using inode-associated
+metadata buffers (i.e. mark_buffer_dirty_inode()), it's your responsibility to
+call invalidate_inode_buffers() before end_writeback().
+       No async writeback (and thus no calls of ->write_inode()) will happen
+after end_writeback() returns, so actions that should not overlap with ->write_inode()
+(e.g. freeing on-disk inode if i_nlink is 0) ought to be done after that call.
+
+       NOTE: checking i_nlink in the beginning of ->write_inode() and bailing out
+if it's zero is not *and* *never* *had* *been* enough.  Final unlink() and iput()
+may happen while the inode is in the middle of ->write_inode(); e.g. if you blindly
+free the on-disk inode, you may end up doing that while ->write_inode() is writing
+to it.
index 8fe8895894d83463038b876ff078ba1c44a4c9b0..a6aca87408830b12aa0302dad05da5fa79244617 100644 (file)
@@ -33,7 +33,8 @@ Table of Contents
   2    Modifying System Parameters
 
   3    Per-Process Parameters
-  3.1  /proc/<pid>/oom_adj - Adjust the oom-killer score
+  3.1  /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj - Adjust the oom-killer
+                                                               score
   3.2  /proc/<pid>/oom_score - Display current oom-killer score
   3.3  /proc/<pid>/io - Display the IO accounting fields
   3.4  /proc/<pid>/coredump_filter - Core dump filtering settings
@@ -1234,42 +1235,64 @@ of the kernel.
 CHAPTER 3: PER-PROCESS PARAMETERS
 ------------------------------------------------------------------------------
 
-3.1 /proc/<pid>/oom_adj - Adjust the oom-killer score
-------------------------------------------------------
-
-This file can be used to adjust the score used to select which processes
-should be killed in an  out-of-memory  situation.  Giving it a high score will
-increase the likelihood of this process being killed by the oom-killer.  Valid
-values are in the range -16 to +15, plus the special value -17, which disables
-oom-killing altogether for this process.
-
-The process to be killed in an out-of-memory situation is selected among all others
-based on its badness score. This value equals the original memory size of the process
-and is then updated according to its CPU time (utime + stime) and the
-run time (uptime - start time). The longer it runs the smaller is the score.
-Badness score is divided by the square root of the CPU time and then by
-the double square root of the run time.
-
-Swapped out tasks are killed first. Half of each child's memory size is added to
-the parent's score if they do not share the same memory. Thus forking servers
-are the prime candidates to be killed. Having only one 'hungry' child will make
-parent less preferable than the child.
-
-/proc/<pid>/oom_score shows process' current badness score.
-
-The following heuristics are then applied:
- * if the task was reniced, its score doubles
- * superuser or direct hardware access tasks (CAP_SYS_ADMIN, CAP_SYS_RESOURCE
-       or CAP_SYS_RAWIO) have their score divided by 4
- * if oom condition happened in one cpuset and checked process does not belong
-       to it, its score is divided by 8
- * the resulting score is multiplied by two to the power of oom_adj, i.e.
-       points <<= oom_adj when it is positive and
-       points >>= -(oom_adj) otherwise
-
-The task with the highest badness score is then selected and its children
-are killed, process itself will be killed in an OOM situation when it does
-not have children or some of them disabled oom like described above.
+3.1 /proc/<pid>/oom_adj & /proc/<pid>/oom_score_adj- Adjust the oom-killer score
+--------------------------------------------------------------------------------
+
+These file can be used to adjust the badness heuristic used to select which
+process gets killed in out of memory conditions.
+
+The badness heuristic assigns a value to each candidate task ranging from 0
+(never kill) to 1000 (always kill) to determine which process is targeted.  The
+units are roughly a proportion along that range of allowed memory the process
+may allocate from based on an estimation of its current memory and swap use.
+For example, if a task is using all allowed memory, its badness score will be
+1000.  If it is using half of its allowed memory, its score will be 500.
+
+There is an additional factor included in the badness score: root
+processes are given 3% extra memory over other tasks.
+
+The amount of "allowed" memory depends on the context in which the oom killer
+was called.  If it is due to the memory assigned to the allocating task's cpuset
+being exhausted, the allowed memory represents the set of mems assigned to that
+cpuset.  If it is due to a mempolicy's node(s) being exhausted, the allowed
+memory represents the set of mempolicy nodes.  If it is due to a memory
+limit (or swap limit) being reached, the allowed memory is that configured
+limit.  Finally, if it is due to the entire system being out of memory, the
+allowed memory represents all allocatable resources.
+
+The value of /proc/<pid>/oom_score_adj is added to the badness score before it
+is used to determine which task to kill.  Acceptable values range from -1000
+(OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX).  This allows userspace to
+polarize the preference for oom killing either by always preferring a certain
+task or completely disabling it.  The lowest possible value, -1000, is
+equivalent to disabling oom killing entirely for that task since it will always
+report a badness score of 0.
+
+Consequently, it is very simple for userspace to define the amount of memory to
+consider for each task.  Setting a /proc/<pid>/oom_score_adj value of +500, for
+example, is roughly equivalent to allowing the remainder of tasks sharing the
+same system, cpuset, mempolicy, or memory controller resources to use at least
+50% more memory.  A value of -500, on the other hand, would be roughly
+equivalent to discounting 50% of the task's allowed memory from being considered
+as scoring against the task.
+
+For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
+be used to tune the badness score.  Its acceptable values range from -16
+(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
+(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
+scaled linearly with /proc/<pid>/oom_score_adj.
+
+Writing to /proc/<pid>/oom_score_adj or /proc/<pid>/oom_adj will change the
+other with its scaled value.
+
+NOTICE: /proc/<pid>/oom_adj is deprecated and will be removed, please see
+Documentation/feature-removal-schedule.txt.
+
+Caveat: when a parent task is selected, the oom killer will sacrifice any first
+generation children with seperate address spaces instead, if possible.  This
+avoids servers and important system daemons from being killed and loses the
+minimal amount of work.
+
 
 3.2 /proc/<pid>/oom_score - Display current oom-killer score
 -------------------------------------------------------------
index 92267b62db5937f05ff7da2b6a0a760d3e4321a4..25568f844804d7d5cc43560898251c85eca2c912 100644 (file)
@@ -21,8 +21,8 @@ Temperature is measured in degrees Celsius and measurement resolution is
 1 degree C. Valid temperatures are from 0 to TjMax degrees C, because
 the actual value of temperature register is in fact a delta from TjMax.
 
-Temperature known as TjMax is the maximum junction temperature of processor.
-Intel defines this temperature as 85C or 100C. At this temperature, protection
+Temperature known as TjMax is the maximum junction temperature of processor,
+which depends on the CPU model. See table below. At this temperature, protection
 mechanism will perform actions to forcibly cool down the processor. Alarm
 may be raised, if the temperature grows enough (more than TjMax) to trigger
 the Out-Of-Spec bit. Following table summarizes the exported sysfs files:
@@ -38,3 +38,104 @@ temp1_label  - Contains string "Core X", where X is processor
 The TjMax temperature is set to 85 degrees C if undocumented model specific
 register (UMSR) 0xee has bit 30 set. If not the TjMax is 100 degrees C as
 (sometimes) documented in processor datasheet.
+
+Appendix A. Known TjMax lists (TBD):
+Some information comes from ark.intel.com
+
+Process                Processor                                       TjMax(C)
+
+32nm           Core i3/i5/i7 Processors
+               i7 660UM/640/620, 640LM/620, 620M, 610E         105
+               i5 540UM/520/430, 540M/520/450/430              105
+               i3 330E, 370M/350/330                           90 rPGA, 105 BGA
+               i3 330UM                                        105
+
+32nm           Core i7 Extreme Processors
+               980X                                            100
+
+32nm           Celeron Processors
+               U3400                                           105
+               P4505/P4500                                     90
+
+45nm           Xeon Processors 5400 Quad-Core
+               X5492, X5482, X5472, X5470, X5460, X5450        85
+               E5472, E5462, E5450/40/30/20/10/05              85
+               L5408                                           95
+               L5430, L5420, L5410                             70
+
+45nm           Xeon Processors 5200 Dual-Core
+               X5282, X5272, X5270, X5260                      90
+               E5240                                           90
+               E5205, E5220                                    70, 90
+               L5240                                           70
+               L5238, L5215                                    95
+
+45nm           Atom Processors
+               D525/510/425/410                                100
+               Z560/550/540/530P/530/520PT/520/515/510PT/510P  90
+               Z510/500                                        90
+               N475/470/455/450                                100
+               N280/270                                        90
+               330/230                                         125
+
+45nm           Core2 Processors
+               Solo ULV SU3500/3300                            100
+               T9900/9800/9600/9550/9500/9400/9300/8300/8100   105
+               T6670/6500/6400                                 105
+               T6600                                           90
+               SU9600/9400/9300                                105
+               SP9600/9400                                     105
+               SL9600/9400/9380/9300                           105
+               P9700/9600/9500/8800/8700/8600/8400/7570        105
+               P7550/7450                                      90
+
+45nm           Core2 Quad Processors
+               Q9100/9000                                      100
+
+45nm           Core2 Extreme Processors
+               X9100/9000                                      105
+               QX9300                                          100
+
+45nm           Core i3/i5/i7 Processors
+               i7 940XM/920                                    100
+               i7 840QM/820/740/720                            100
+
+45nm           Celeron Processors
+               SU2300                                          100
+               900                                             105
+
+65nm           Core2 Duo Processors
+               Solo U2200, U2100                               100
+               U7700/7600/7500                                 100
+               T7800/7700/7600/7500/7400/7300/7250/7200/7100   100
+               T5870/5670/5600/5550/5500/5470/5450/5300/5270   100
+               T5250                                           100
+               T5800/5750/5200                                 85
+               L7700/7500/7400/7300/7200                       100
+
+65nm           Core2 Extreme Processors
+               X7900/7800                                      100
+
+65nm           Core Duo Processors
+               U2500/2400                                      100
+               T2700/2600/2450/2400/2350/2300E/2300/2250/2050  100
+               L2500/2400/2300                                 100
+
+65nm           Core Solo Processors
+               U1500/1400/1300                                 100
+               T1400/1350/1300/1250                            100
+
+65nm           Xeon Processors 5000 Quad-Core
+               X5000                                           90-95
+               E5000                                           80
+               L5000                                           70
+               L5318                                           95
+
+65nm           Xeon Processors 5000 Dual-Core
+               5080, 5063, 5060, 5050, 5030                    80-90
+               5160, 5150, 5148, 5140, 5130, 5120, 5110        80
+               L5138                                           100
+
+65nm           Celeron Processors
+               T1700/1600                                      100
+               560/550/540/530                                 100
index a7952c2bd959338d4358a8fbdb51ee80c62fa61d..1a07fd674cd0e64198373459f04ad9e16f6fe0e6 100644 (file)
@@ -2,6 +2,10 @@ Kernel driver f71882fg
 ======================
 
 Supported chips:
+  * Fintek F71808E
+    Prefix: 'f71808fg'
+    Addresses scanned: none, address read from Super I/O config space
+    Datasheet: Not public
   * Fintek F71858FG
     Prefix: 'f71858fg'
     Addresses scanned: none, address read from Super I/O config space
diff --git a/Documentation/hwmon/jc42 b/Documentation/hwmon/jc42
new file mode 100644 (file)
index 0000000..0e76ef1
--- /dev/null
@@ -0,0 +1,97 @@
+Kernel driver jc42
+==================
+
+Supported chips:
+  * Analog Devices ADT7408
+    Prefix: 'adt7408'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
+  * IDT TSE2002B3, TS3000B3
+    Prefix: 'tse2002b3', 'ts3000b3'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://www.idt.com/products/getdoc.cfm?docid=18715691
+       http://www.idt.com/products/getdoc.cfm?docid=18715692
+  * Maxim MAX6604
+    Prefix: 'max6604'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf
+  * Microchip MCP9805, MCP98242, MCP98243, MCP9843
+    Prefixes: 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
+       http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
+       http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
+  * NXP Semiconductors SE97, SE97B
+    Prefix: 'se97'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://www.nxp.com/documents/data_sheet/SE97.pdf
+       http://www.nxp.com/documents/data_sheet/SE97B.pdf
+  * NXP Semiconductors SE98
+    Prefix: 'se98'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://www.nxp.com/documents/data_sheet/SE98.pdf
+  * ON Semiconductor CAT34TS02, CAT6095
+    Prefix: 'cat34ts02', 'cat6095'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheet:
+       http://www.onsemi.com/pub_link/Collateral/CAT34TS02-D.PDF
+       http://www.onsemi.com/pub/Collateral/CAT6095-D.PDF
+  * ST Microelectronics STTS424, STTS424E02
+    Prefix: 'stts424'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheets:
+       http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf
+       http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf
+  * JEDEC JC 42.4 compliant temperature sensor chips
+    Prefix: 'jc42'
+    Addresses scanned: I2C 0x18 - 0x1f
+    Datasheet: -
+
+Author:
+       Guenter Roeck <guenter.roeck@ericsson.com>
+
+
+Description
+-----------
+
+This driver implements support for JEDEC JC 42.4 compliant temperature sensors.
+The driver auto-detects the chips listed above, but can be manually instantiated
+to support other JC 42.4 compliant chips.
+
+Example: the following will load the driver for a generic JC 42.4 compliant
+temperature sensor at address 0x18 on I2C bus #1:
+
+# modprobe jc42
+# echo jc42 0x18 > /sys/bus/i2c/devices/i2c-1/new_device
+
+A JC 42.4 compliant chip supports a single temperature sensor. Minimum, maximum,
+and critical temperature can be configured. There are alarms for high, low,
+and critical thresholds.
+
+There is also an hysteresis to control the thresholds for resetting alarms.
+Per JC 42.4 specification, the hysteresis threshold can be configured to 0, 1.5,
+3.0, and 6.0 degrees C. Configured hysteresis values will be rounded to those
+limits. The chip supports only a single register to configure the hysteresis,
+which applies to all limits. This register can be written by writing into
+temp1_crit_hyst. Other hysteresis attributes are read-only.
+
+Sysfs entries
+-------------
+
+temp1_input            Temperature (RO)
+temp1_min              Minimum temperature (RW)
+temp1_max              Maximum temperature (RW)
+temp1_crit             Critical high temperature (RW)
+
+temp1_crit_hyst                Critical hysteresis temperature (RW)
+temp1_max_hyst         Maximum hysteresis temperature (RO)
+
+temp1_min_alarm                Temperature low alarm
+temp1_max_alarm                Temperature high alarm
+temp1_crit_alarm       Temperature critical alarm
diff --git a/Documentation/hwmon/smm665 b/Documentation/hwmon/smm665
new file mode 100644 (file)
index 0000000..3820fc9
--- /dev/null
@@ -0,0 +1,157 @@
+Kernel driver smm665
+====================
+
+Supported chips:
+  * Summit Microelectronics SMM465
+    Prefix: 'smm465'
+    Addresses scanned: -
+    Datasheet:
+      http://www.summitmicro.com/prod_select/summary/SMM465/SMM465DS.pdf
+  * Summit Microelectronics SMM665, SMM665B
+    Prefix: 'smm665'
+    Addresses scanned: -
+    Datasheet:
+      http://www.summitmicro.com/prod_select/summary/SMM665/SMM665B_2089_20.pdf
+  * Summit Microelectronics SMM665C
+    Prefix: 'smm665c'
+    Addresses scanned: -
+    Datasheet:
+      http://www.summitmicro.com/prod_select/summary/SMM665C/SMM665C_2125.pdf
+  * Summit Microelectronics SMM764
+    Prefix: 'smm764'
+    Addresses scanned: -
+    Datasheet:
+      http://www.summitmicro.com/prod_select/summary/SMM764/SMM764_2098.pdf
+  * Summit Microelectronics SMM766, SMM766B
+    Prefix: 'smm766'
+    Addresses scanned: -
+    Datasheets:
+      http://www.summitmicro.com/prod_select/summary/SMM766/SMM766_2086.pdf
+      http://www.summitmicro.com/prod_select/summary/SMM766B/SMM766B_2122.pdf
+
+Author: Guenter Roeck <guenter.roeck@ericsson.com>
+
+
+Module Parameters
+-----------------
+
+* vref: int
+  Default: 1250 (mV)
+  Reference voltage on VREF_ADC pin in mV. It should not be necessary to set
+  this parameter unless a non-default reference voltage is used.
+
+
+Description
+-----------
+
+[From datasheet] The SMM665 is an Active DC Output power supply Controller
+that monitors, margins and cascade sequences power. The part monitors six
+power supply channels as well as VDD, 12V input, two general-purpose analog
+inputs and an internal temperature sensor using a 10-bit ADC.
+
+Each monitored channel has its own high and low limits, plus a critical
+limit.
+
+Support for SMM465, SMM764, and SMM766 has been implemented but is untested.
+
+
+Usage Notes
+-----------
+
+This driver does not probe for devices, since there is no register which
+can be safely used to identify the chip. You will have to instantiate
+the devices explicitly. When instantiating the device, you have to specify
+its configuration register address.
+
+Example: the following will load the driver for an SMM665 at address 0x57
+on I2C bus #1:
+$ modprobe smm665
+$ echo smm665 0x57 > /sys/bus/i2c/devices/i2c-1/new_device
+
+
+Sysfs entries
+-------------
+
+This driver uses the values in the datasheet to convert ADC register values
+into the values specified in the sysfs-interface document. All attributes are
+read only.
+
+Min, max, lcrit, and crit values are used by the chip to trigger external signals
+and/or other activity. Triggered signals can include HEALTHY, RST, Power Off,
+or Fault depending on the chip configuration. The driver reports values as lcrit
+or crit if exceeding the limits triggers RST, Power Off, or Fault, and as min or
+max otherwise. For details please see the SMM665 datasheet.
+
+For SMM465 and SMM764, values for Channel E and F are reported but undefined.
+
+in1_input              12V input voltage (mV)
+in2_input              3.3V (VDD) input voltage (mV)
+in3_input              Channel A voltage (mV)
+in4_input              Channel B voltage (mV)
+in5_input              Channel C voltage (mV)
+in6_input              Channel D voltage (mV)
+in7_input              Channel E voltage (mV)
+in8_input              Channel F voltage (mV)
+in9_input              AIN1 voltage (mV)
+in10_input             AIN2 voltage (mV)
+
+in1_min                        12v input minimum voltage (mV)
+in2_min                        3.3V (VDD) input minimum voltage (mV)
+in3_min                        Channel A minimum voltage (mV)
+in4_min                        Channel B minimum voltage (mV)
+in5_min                        Channel C minimum voltage (mV)
+in6_min                        Channel D minimum voltage (mV)
+in7_min                        Channel E minimum voltage (mV)
+in8_min                        Channel F minimum voltage (mV)
+in9_min                        AIN1 minimum voltage (mV)
+in10_min               AIN2 minimum voltage (mV)
+
+in1_max                        12v input maximum voltage (mV)
+in2_max                        3.3V (VDD) input maximum voltage (mV)
+in3_max                        Channel A maximum voltage (mV)
+in4_max                        Channel B maximum voltage (mV)
+in5_max                        Channel C maximum voltage (mV)
+in6_max                        Channel D maximum voltage (mV)
+in7_max                        Channel E maximum voltage (mV)
+in8_max                        Channel F maximum voltage (mV)
+in9_max                        AIN1 maximum voltage (mV)
+in10_max               AIN2 maximum voltage (mV)
+
+in1_lcrit              12v input critical minimum voltage (mV)
+in2_lcrit              3.3V (VDD) input critical minimum voltage (mV)
+in3_lcrit              Channel A critical minimum voltage (mV)
+in4_lcrit              Channel B critical minimum voltage (mV)
+in5_lcrit              Channel C critical minimum voltage (mV)
+in6_lcrit              Channel D critical minimum voltage (mV)
+in7_lcrit              Channel E critical minimum voltage (mV)
+in8_lcrit              Channel F critical minimum voltage (mV)
+in9_lcrit              AIN1 critical minimum voltage (mV)
+in10_lcrit             AIN2 critical minimum voltage (mV)
+
+in1_crit               12v input critical maximum voltage (mV)
+in2_crit               3.3V (VDD) input critical maximum voltage (mV)
+in3_crit               Channel A critical maximum voltage (mV)
+in4_crit               Channel B critical maximum voltage (mV)
+in5_crit               Channel C critical maximum voltage (mV)
+in6_crit               Channel D critical maximum voltage (mV)
+in7_crit               Channel E critical maximum voltage (mV)
+in8_crit               Channel F critical maximum voltage (mV)
+in9_crit               AIN1 critical maximum voltage (mV)
+in10_crit              AIN2 critical maximum voltage (mV)
+
+in1_crit_alarm         12v input critical alarm
+in2_crit_alarm         3.3V (VDD) input critical alarm
+in3_crit_alarm         Channel A critical alarm
+in4_crit_alarm         Channel B critical alarm
+in5_crit_alarm         Channel C critical alarm
+in6_crit_alarm         Channel D critical alarm
+in7_crit_alarm         Channel E critical alarm
+in8_crit_alarm         Channel F critical alarm
+in9_crit_alarm         AIN1 critical alarm
+in10_crit_alarm                AIN2 critical alarm
+
+temp1_input            Chip tempererature
+temp1_min              Mimimum chip tempererature
+temp1_max              Maximum chip tempererature
+temp1_crit             Critical chip tempererature
+temp1_crit_alarm       Temperature critical alarm
diff --git a/Documentation/networking/igb.txt b/Documentation/networking/igb.txt
new file mode 100644 (file)
index 0000000..ab2d718
--- /dev/null
@@ -0,0 +1,132 @@
+Linux* Base Driver for Intel(R) Network Connection
+==================================================
+
+Intel Gigabit Linux driver.
+Copyright(c) 1999 - 2010 Intel Corporation.
+
+Contents
+========
+
+- Identifying Your Adapter
+- Additional Configurations
+- Support
+
+Identifying Your Adapter
+========================
+
+This driver supports all 82575, 82576 and 82580-based Intel (R) gigabit network
+connections.
+
+For specific information on how to identify your adapter, go to the Adapter &
+Driver ID Guide at:
+
+    http://support.intel.com/support/go/network/adapter/idguide.htm
+
+Command Line Parameters
+=======================
+
+The default value for each parameter is generally the recommended setting,
+unless otherwise noted.
+
+max_vfs
+-------
+Valid Range:   0-7
+Default Value: 0
+
+This parameter adds support for SR-IOV.  It causes the driver to spawn up to
+max_vfs worth of virtual function.
+
+Additional Configurations
+=========================
+
+  Jumbo Frames
+  ------------
+  Jumbo Frames support is enabled by changing the MTU to a value larger than
+  the default of 1500.  Use the ifconfig command to increase the MTU size.
+  For example:
+
+       ifconfig eth<x> mtu 9000 up
+
+  This setting is not saved across reboots.
+
+  Notes:
+
+  - The maximum MTU setting for Jumbo Frames is 9216.  This value coincides
+    with the maximum Jumbo Frames size of 9234 bytes.
+
+  - Using Jumbo Frames at 10 or 100 Mbps may result in poor performance or
+    loss of link.
+
+  Ethtool
+  -------
+  The driver utilizes the ethtool interface for driver configuration and
+  diagnostics, as well as displaying statistical information.
+
+  http://sourceforge.net/projects/gkernel.
+
+  Enabling Wake on LAN* (WoL)
+  ---------------------------
+  WoL is configured through the Ethtool* utility.
+
+  For instructions on enabling WoL with Ethtool, refer to the Ethtool man page.
+
+  WoL will be enabled on the system during the next shut down or reboot.
+  For this driver version, in order to enable WoL, the igb driver must be
+  loaded when shutting down or rebooting the system.
+
+  Wake On LAN is only supported on port A of multi-port adapters.
+
+  Wake On LAN is not supported for the Intel(R) Gigabit VT Quad Port Server
+  Adapter.
+
+  Multiqueue
+  ----------
+  In this mode, a separate MSI-X vector is allocated for each queue and one
+  for "other" interrupts such as link status change and errors.  All
+  interrupts are throttled via interrupt moderation.  Interrupt moderation
+  must be used to avoid interrupt storms while the driver is processing one
+  interrupt.  The moderation value should be at least as large as the expected
+  time for the driver to process an interrupt. Multiqueue is off by default.
+
+  REQUIREMENTS: MSI-X support is required for Multiqueue. If MSI-X is not
+  found, the system will fallback to MSI or to Legacy interrupts.
+
+  LRO
+  ---
+  Large Receive Offload (LRO) is a technique for increasing inbound throughput
+  of high-bandwidth network connections by reducing CPU overhead. It works by
+  aggregating multiple incoming packets from a single stream into a larger
+  buffer before they are passed higher up the networking stack, thus reducing
+  the number of packets that have to be processed. LRO combines multiple
+  Ethernet frames into a single receive in the stack, thereby potentially
+  decreasing CPU utilization for receives.
+
+  NOTE: You need to have inet_lro enabled via either the CONFIG_INET_LRO or
+  CONFIG_INET_LRO_MODULE kernel config option. Additionally, if
+  CONFIG_INET_LRO_MODULE is used, the inet_lro module needs to be loaded
+  before the igb driver.
+
+  You can verify that the driver is using LRO by looking at these counters in
+  Ethtool:
+
+  lro_aggregated - count of total packets that were combined
+  lro_flushed - counts the number of packets flushed out of LRO
+  lro_no_desc - counts the number of times an LRO descriptor was not available
+  for the LRO packet
+
+  NOTE: IPv6 and UDP are not supported by LRO.
+
+Support
+=======
+
+For general information, go to the Intel support website at:
+
+    www.intel.com/support/
+
+or the Intel Wired Networking project hosted by Sourceforge at:
+
+    http://sourceforge.net/projects/e1000
+
+If an issue is identified with the released source code on the supported
+kernel with a supported adapter, email the specific information related
+to the issue to e1000-devel@lists.sf.net
diff --git a/Documentation/networking/igbvf.txt b/Documentation/networking/igbvf.txt
new file mode 100644 (file)
index 0000000..0560281
--- /dev/null
@@ -0,0 +1,78 @@
+Linux* Base Driver for Intel(R) Network Connection
+==================================================
+
+Intel Gigabit Linux driver.
+Copyright(c) 1999 - 2010 Intel Corporation.
+
+Contents
+========
+
+- Identifying Your Adapter
+- Additional Configurations
+- Support
+
+This file describes the igbvf Linux* Base Driver for Intel Network Connection.
+
+The igbvf driver supports 82576-based virtual function devices that can only
+be activated on kernels that support SR-IOV. SR-IOV requires the correct
+platform and OS support.
+
+The igbvf driver requires the igb driver, version 2.0 or later. The igbvf
+driver supports virtual functions generated by the igb driver with a max_vfs
+value of 1 or greater. For more information on the max_vfs parameter refer
+to the README included with the igb driver.
+
+The guest OS loading the igbvf driver must support MSI-X interrupts.
+
+This driver is only supported as a loadable module at this time.  Intel is
+not supplying patches against the kernel source to allow for static linking
+of the driver.  For questions related to hardware requirements, refer to the
+documentation supplied with your Intel Gigabit adapter.  All hardware
+requirements listed apply to use with Linux.
+
+Instructions on updating ethtool can be found in the section "Additional
+Configurations" later in this document.
+
+VLANs: There is a limit of a total of 32 shared VLANs to 1 or more VFs.
+
+Identifying Your Adapter
+========================
+
+The igbvf driver supports 82576-based virtual function devices that can only
+be activated on kernels that support SR-IOV.
+
+For more information on how to identify your adapter, go to the Adapter &
+Driver ID Guide at:
+
+    http://support.intel.com/support/go/network/adapter/idguide.htm
+
+For the latest Intel network drivers for Linux, refer to the following
+website.  In the search field, enter your adapter name or type, or use the
+networking link on the left to search for your adapter:
+
+    http://downloadcenter.intel.com/scripts-df-external/Support_Intel.aspx
+
+Additional Configurations
+=========================
+
+  Ethtool
+  -------
+  The driver utilizes the ethtool interface for driver configuration and
+  diagnostics, as well as displaying statistical information.
+
+  http://sourceforge.net/projects/gkernel.
+
+Support
+=======
+
+For general information, go to the Intel support website at:
+
+    http://support.intel.com
+
+or the Intel Wired Networking project hosted by Sourceforge at:
+
+    http://sourceforge.net/projects/e1000
+
+If an issue is identified with the released source code on the supported
+kernel with a supported adapter, email the specific information related
+to the issue to e1000-devel@lists.sf.net
index 82b2da18c45d8e43c71f3e381cde3b5e99f18296..b606c2c4dd37c4f2e5f5caf7803d66adadd59e6a 100644 (file)
@@ -511,7 +511,7 @@ information may not be desired.
 If this is set to non-zero, this information is shown whenever the
 OOM killer actually kills a memory-hogging task.
 
-The default value is 0.
+The default value is 1 (enabled).
 
 ==============================================================
 
diff --git a/Documentation/trace/postprocess/trace-vmscan-postprocess.pl b/Documentation/trace/postprocess/trace-vmscan-postprocess.pl
new file mode 100644 (file)
index 0000000..1b55146
--- /dev/null
@@ -0,0 +1,686 @@
+#!/usr/bin/perl
+# This is a POC for reading the text representation of trace output related to
+# page reclaim. It makes an attempt to extract some high-level information on
+# what is going on. The accuracy of the parser may vary
+#
+# Example usage: trace-vmscan-postprocess.pl < /sys/kernel/debug/tracing/trace_pipe
+# other options
+#   --read-procstat    If the trace lacks process info, get it from /proc
+#   --ignore-pid       Aggregate processes of the same name together
+#
+# Copyright (c) IBM Corporation 2009
+# Author: Mel Gorman <mel@csn.ul.ie>
+use strict;
+use Getopt::Long;
+
+# Tracepoint events
+use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN    => 1;
+use constant MM_VMSCAN_DIRECT_RECLAIM_END      => 2;
+use constant MM_VMSCAN_KSWAPD_WAKE             => 3;
+use constant MM_VMSCAN_KSWAPD_SLEEP            => 4;
+use constant MM_VMSCAN_LRU_SHRINK_ACTIVE       => 5;
+use constant MM_VMSCAN_LRU_SHRINK_INACTIVE     => 6;
+use constant MM_VMSCAN_LRU_ISOLATE             => 7;
+use constant MM_VMSCAN_WRITEPAGE_FILE_SYNC     => 8;
+use constant MM_VMSCAN_WRITEPAGE_ANON_SYNC     => 9;
+use constant MM_VMSCAN_WRITEPAGE_FILE_ASYNC    => 10;
+use constant MM_VMSCAN_WRITEPAGE_ANON_ASYNC    => 11;
+use constant MM_VMSCAN_WRITEPAGE_ASYNC         => 12;
+use constant EVENT_UNKNOWN                     => 13;
+
+# Per-order events
+use constant MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER => 11;
+use constant MM_VMSCAN_WAKEUP_KSWAPD_PERORDER  => 12;
+use constant MM_VMSCAN_KSWAPD_WAKE_PERORDER    => 13;
+use constant HIGH_KSWAPD_REWAKEUP_PERORDER     => 14;
+
+# Constants used to track state
+use constant STATE_DIRECT_BEGIN                => 15;
+use constant STATE_DIRECT_ORDER                => 16;
+use constant STATE_KSWAPD_BEGIN                        => 17;
+use constant STATE_KSWAPD_ORDER                        => 18;
+
+# High-level events extrapolated from tracepoints
+use constant HIGH_DIRECT_RECLAIM_LATENCY       => 19;
+use constant HIGH_KSWAPD_LATENCY               => 20;
+use constant HIGH_KSWAPD_REWAKEUP              => 21;
+use constant HIGH_NR_SCANNED                   => 22;
+use constant HIGH_NR_TAKEN                     => 23;
+use constant HIGH_NR_RECLAIM                   => 24;
+use constant HIGH_NR_CONTIG_DIRTY              => 25;
+
+my %perprocesspid;
+my %perprocess;
+my %last_procmap;
+my $opt_ignorepid;
+my $opt_read_procstat;
+
+my $total_wakeup_kswapd;
+my ($total_direct_reclaim, $total_direct_nr_scanned);
+my ($total_direct_latency, $total_kswapd_latency);
+my ($total_direct_writepage_file_sync, $total_direct_writepage_file_async);
+my ($total_direct_writepage_anon_sync, $total_direct_writepage_anon_async);
+my ($total_kswapd_nr_scanned, $total_kswapd_wake);
+my ($total_kswapd_writepage_file_sync, $total_kswapd_writepage_file_async);
+my ($total_kswapd_writepage_anon_sync, $total_kswapd_writepage_anon_async);
+
+# Catch sigint and exit on request
+my $sigint_report = 0;
+my $sigint_exit = 0;
+my $sigint_pending = 0;
+my $sigint_received = 0;
+sub sigint_handler {
+       my $current_time = time;
+       if ($current_time - 2 > $sigint_received) {
+               print "SIGINT received, report pending. Hit ctrl-c again to exit\n";
+               $sigint_report = 1;
+       } else {
+               if (!$sigint_exit) {
+                       print "Second SIGINT received quickly, exiting\n";
+               }
+               $sigint_exit++;
+       }
+
+       if ($sigint_exit > 3) {
+               print "Many SIGINTs received, exiting now without report\n";
+               exit;
+       }
+
+       $sigint_received = $current_time;
+       $sigint_pending = 1;
+}
+$SIG{INT} = "sigint_handler";
+
+# Parse command line options
+GetOptions(
+       'ignore-pid'     =>     \$opt_ignorepid,
+       'read-procstat'  =>     \$opt_read_procstat,
+);
+
+# Defaults for dynamically discovered regex's
+my $regex_direct_begin_default = 'order=([0-9]*) may_writepage=([0-9]*) gfp_flags=([A-Z_|]*)';
+my $regex_direct_end_default = 'nr_reclaimed=([0-9]*)';
+my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)';
+my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
+my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*)';
+my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_taken=([0-9]*) contig_taken=([0-9]*) contig_dirty=([0-9]*) contig_failed=([0-9]*)';
+my $regex_lru_shrink_inactive_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) priority=([0-9]*)';
+my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
+my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
+
+# Dyanically discovered regex
+my $regex_direct_begin;
+my $regex_direct_end;
+my $regex_kswapd_wake;
+my $regex_kswapd_sleep;
+my $regex_wakeup_kswapd;
+my $regex_lru_isolate;
+my $regex_lru_shrink_inactive;
+my $regex_lru_shrink_active;
+my $regex_writepage;
+
+# Static regex used. Specified like this for readability and for use with /o
+#                      (process_pid)     (cpus      )   ( time  )   (tpoint    ) (details)
+my $regex_traceevent = '\s*([a-zA-Z0-9-]*)\s*(\[[0-9]*\])\s*([0-9.]*):\s*([a-zA-Z_]*):\s*(.*)';
+my $regex_statname = '[-0-9]*\s\((.*)\).*';
+my $regex_statppid = '[-0-9]*\s\(.*\)\s[A-Za-z]\s([0-9]*).*';
+
+sub generate_traceevent_regex {
+       my $event = shift;
+       my $default = shift;
+       my $regex;
+
+       # Read the event format or use the default
+       if (!open (FORMAT, "/sys/kernel/debug/tracing/events/$event/format")) {
+               print("WARNING: Event $event format string not found\n");
+               return $default;
+       } else {
+               my $line;
+               while (!eof(FORMAT)) {
+                       $line = <FORMAT>;
+                       $line =~ s/, REC->.*//;
+                       if ($line =~ /^print fmt:\s"(.*)".*/) {
+                               $regex = $1;
+                               $regex =~ s/%s/\([0-9a-zA-Z|_]*\)/g;
+                               $regex =~ s/%p/\([0-9a-f]*\)/g;
+                               $regex =~ s/%d/\([-0-9]*\)/g;
+                               $regex =~ s/%ld/\([-0-9]*\)/g;
+                               $regex =~ s/%lu/\([0-9]*\)/g;
+                       }
+               }
+       }
+
+       # Can't handle the print_flags stuff but in the context of this
+       # script, it really doesn't matter
+       $regex =~ s/\(REC.*\) \? __print_flags.*//;
+
+       # Verify fields are in the right order
+       my $tuple;
+       foreach $tuple (split /\s/, $regex) {
+               my ($key, $value) = split(/=/, $tuple);
+               my $expected = shift;
+               if ($key ne $expected) {
+                       print("WARNING: Format not as expected for event $event '$key' != '$expected'\n");
+                       $regex =~ s/$key=\((.*)\)/$key=$1/;
+               }
+       }
+
+       if (defined shift) {
+               die("Fewer fields than expected in format");
+       }
+
+       return $regex;
+}
+
+$regex_direct_begin = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_direct_reclaim_begin",
+                       $regex_direct_begin_default,
+                       "order", "may_writepage",
+                       "gfp_flags");
+$regex_direct_end = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_direct_reclaim_end",
+                       $regex_direct_end_default,
+                       "nr_reclaimed");
+$regex_kswapd_wake = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_kswapd_wake",
+                       $regex_kswapd_wake_default,
+                       "nid", "order");
+$regex_kswapd_sleep = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_kswapd_sleep",
+                       $regex_kswapd_sleep_default,
+                       "nid");
+$regex_wakeup_kswapd = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_wakeup_kswapd",
+                       $regex_wakeup_kswapd_default,
+                       "nid", "zid", "order");
+$regex_lru_isolate = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_lru_isolate",
+                       $regex_lru_isolate_default,
+                       "isolate_mode", "order",
+                       "nr_requested", "nr_scanned", "nr_taken",
+                       "contig_taken", "contig_dirty", "contig_failed");
+$regex_lru_shrink_inactive = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_lru_shrink_inactive",
+                       $regex_lru_shrink_inactive_default,
+                       "nid", "zid",
+                       "lru",
+                       "nr_scanned", "nr_reclaimed", "priority");
+$regex_lru_shrink_active = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_lru_shrink_active",
+                       $regex_lru_shrink_active_default,
+                       "nid", "zid",
+                       "lru",
+                       "nr_scanned", "nr_rotated", "priority");
+$regex_writepage = generate_traceevent_regex(
+                       "vmscan/mm_vmscan_writepage",
+                       $regex_writepage_default,
+                       "page", "pfn", "flags");
+
+sub read_statline($) {
+       my $pid = $_[0];
+       my $statline;
+
+       if (open(STAT, "/proc/$pid/stat")) {
+               $statline = <STAT>;
+               close(STAT);
+       }
+
+       if ($statline eq '') {
+               $statline = "-1 (UNKNOWN_PROCESS_NAME) R 0";
+       }
+
+       return $statline;
+}
+
+sub guess_process_pid($$) {
+       my $pid = $_[0];
+       my $statline = $_[1];
+
+       if ($pid == 0) {
+               return "swapper-0";
+       }
+
+       if ($statline !~ /$regex_statname/o) {
+               die("Failed to math stat line for process name :: $statline");
+       }
+       return "$1-$pid";
+}
+
+# Convert sec.usec timestamp format
+sub timestamp_to_ms($) {
+       my $timestamp = $_[0];
+
+       my ($sec, $usec) = split (/\./, $timestamp);
+       return ($sec * 1000) + ($usec / 1000);
+}
+
+sub process_events {
+       my $traceevent;
+       my $process_pid;
+       my $cpus;
+       my $timestamp;
+       my $tracepoint;
+       my $details;
+       my $statline;
+
+       # Read each line of the event log
+EVENT_PROCESS:
+       while ($traceevent = <STDIN>) {
+               if ($traceevent =~ /$regex_traceevent/o) {
+                       $process_pid = $1;
+                       $timestamp = $3;
+                       $tracepoint = $4;
+
+                       $process_pid =~ /(.*)-([0-9]*)$/;
+                       my $process = $1;
+                       my $pid = $2;
+
+                       if ($process eq "") {
+                               $process = $last_procmap{$pid};
+                               $process_pid = "$process-$pid";
+                       }
+                       $last_procmap{$pid} = $process;
+
+                       if ($opt_read_procstat) {
+                               $statline = read_statline($pid);
+                               if ($opt_read_procstat && $process eq '') {
+                                       $process_pid = guess_process_pid($pid, $statline);
+                               }
+                       }
+               } else {
+                       next;
+               }
+
+               # Perl Switch() sucks majorly
+               if ($tracepoint eq "mm_vmscan_direct_reclaim_begin") {
+                       $timestamp = timestamp_to_ms($timestamp);
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}++;
+                       $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN} = $timestamp;
+
+                       $details = $5;
+                       if ($details !~ /$regex_direct_begin/o) {
+                               print "WARNING: Failed to parse mm_vmscan_direct_reclaim_begin as expected\n";
+                               print "         $details\n";
+                               print "         $regex_direct_begin\n";
+                               next;
+                       }
+                       my $order = $1;
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order]++;
+                       $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER} = $order;
+               } elsif ($tracepoint eq "mm_vmscan_direct_reclaim_end") {
+                       # Count the event itself
+                       my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END};
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_END}++;
+
+                       # Record how long direct reclaim took this time
+                       if (defined $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN}) {
+                               $timestamp = timestamp_to_ms($timestamp);
+                               my $order = $perprocesspid{$process_pid}->{STATE_DIRECT_ORDER};
+                               my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_DIRECT_BEGIN});
+                               $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] = "$order-$latency";
+                       }
+               } elsif ($tracepoint eq "mm_vmscan_kswapd_wake") {
+                       $details = $5;
+                       if ($details !~ /$regex_kswapd_wake/o) {
+                               print "WARNING: Failed to parse mm_vmscan_kswapd_wake as expected\n";
+                               print "         $details\n";
+                               print "         $regex_kswapd_wake\n";
+                               next;
+                       }
+
+                       my $order = $2;
+                       $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER} = $order;
+                       if (!$perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN}) {
+                               $timestamp = timestamp_to_ms($timestamp);
+                               $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}++;
+                               $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = $timestamp;
+                               $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order]++;
+                       } else {
+                               $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP}++;
+                               $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order]++;
+                       }
+               } elsif ($tracepoint eq "mm_vmscan_kswapd_sleep") {
+
+                       # Count the event itself
+                       my $index = $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP};
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_SLEEP}++;
+
+                       # Record how long kswapd was awake
+                       $timestamp = timestamp_to_ms($timestamp);
+                       my $order = $perprocesspid{$process_pid}->{STATE_KSWAPD_ORDER};
+                       my $latency = ($timestamp - $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN});
+                       $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index] = "$order-$latency";
+                       $perprocesspid{$process_pid}->{STATE_KSWAPD_BEGIN} = 0;
+               } elsif ($tracepoint eq "mm_vmscan_wakeup_kswapd") {
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}++;
+
+                       $details = $5;
+                       if ($details !~ /$regex_wakeup_kswapd/o) {
+                               print "WARNING: Failed to parse mm_vmscan_wakeup_kswapd as expected\n";
+                               print "         $details\n";
+                               print "         $regex_wakeup_kswapd\n";
+                               next;
+                       }
+                       my $order = $3;
+                       $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order]++;
+               } elsif ($tracepoint eq "mm_vmscan_lru_isolate") {
+                       $details = $5;
+                       if ($details !~ /$regex_lru_isolate/o) {
+                               print "WARNING: Failed to parse mm_vmscan_lru_isolate as expected\n";
+                               print "         $details\n";
+                               print "         $regex_lru_isolate/o\n";
+                               next;
+                       }
+                       my $nr_scanned = $4;
+                       my $nr_contig_dirty = $7;
+                       $perprocesspid{$process_pid}->{HIGH_NR_SCANNED} += $nr_scanned;
+                       $perprocesspid{$process_pid}->{HIGH_NR_CONTIG_DIRTY} += $nr_contig_dirty;
+               } elsif ($tracepoint eq "mm_vmscan_writepage") {
+                       $details = $5;
+                       if ($details !~ /$regex_writepage/o) {
+                               print "WARNING: Failed to parse mm_vmscan_writepage as expected\n";
+                               print "         $details\n";
+                               print "         $regex_writepage\n";
+                               next;
+                       }
+
+                       my $flags = $3;
+                       my $file = 0;
+                       my $sync_io = 0;
+                       if ($flags =~ /RECLAIM_WB_FILE/) {
+                               $file = 1;
+                       }
+                       if ($flags =~ /RECLAIM_WB_SYNC/) {
+                               $sync_io = 1;
+                       }
+                       if ($sync_io) {
+                               if ($file) {
+                                       $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC}++;
+                               } else {
+                                       $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC}++;
+                               }
+                       } else {
+                               if ($file) {
+                                       $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC}++;
+                               } else {
+                                       $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC}++;
+                               }
+                       }
+               } else {
+                       $perprocesspid{$process_pid}->{EVENT_UNKNOWN}++;
+               }
+
+               if ($sigint_pending) {
+                       last EVENT_PROCESS;
+               }
+       }
+}
+
+sub dump_stats {
+       my $hashref = shift;
+       my %stats = %$hashref;
+
+       # Dump per-process stats
+       my $process_pid;
+       my $max_strlen = 0;
+
+       # Get the maximum process name
+       foreach $process_pid (keys %perprocesspid) {
+               my $len = length($process_pid);
+               if ($len > $max_strlen) {
+                       $max_strlen = $len;
+               }
+       }
+       $max_strlen += 2;
+
+       # Work out latencies
+       printf("\n") if !$opt_ignorepid;
+       printf("Reclaim latencies expressed as order-latency_in_ms\n") if !$opt_ignorepid;
+       foreach $process_pid (keys %stats) {
+
+               if (!$stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[0] &&
+                               !$stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[0]) {
+                       next;
+               }
+
+               printf "%-" . $max_strlen . "s ", $process_pid if !$opt_ignorepid;
+               my $index = 0;
+               while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index] ||
+                       defined $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) {
+
+                       if ($stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) {
+                               printf("%s ", $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) if !$opt_ignorepid;
+                               my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]);
+                               $total_direct_latency += $latency;
+                       } else {
+                               printf("%s ", $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]) if !$opt_ignorepid;
+                               my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_KSWAPD_LATENCY}[$index]);
+                               $total_kswapd_latency += $latency;
+                       }
+                       $index++;
+               }
+               print "\n" if !$opt_ignorepid;
+       }
+
+       # Print out process activity
+       printf("\n");
+       printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s %8s\n", "Process", "Direct",  "Wokeup", "Pages",   "Pages",   "Pages",     "Time");
+       printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s %8s\n", "details", "Rclms",   "Kswapd", "Scanned", "Sync-IO", "ASync-IO",  "Stalled");
+       foreach $process_pid (keys %stats) {
+
+               if (!$stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) {
+                       next;
+               }
+
+               $total_direct_reclaim += $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN};
+               $total_wakeup_kswapd += $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD};
+               $total_direct_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED};
+               $total_direct_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
+               $total_direct_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
+               $total_direct_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
+
+               $total_direct_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
+
+               my $index = 0;
+               my $this_reclaim_delay = 0;
+               while (defined $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]) {
+                        my ($dummy, $latency) = split(/-/, $stats{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$index]);
+                       $this_reclaim_delay += $latency;
+                       $index++;
+               }
+
+               printf("%-" . $max_strlen . "s %8d %10d   %8u   %8u %8u %8.3f",
+                       $process_pid,
+                       $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN},
+                       $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD},
+                       $stats{$process_pid}->{HIGH_NR_SCANNED},
+                       $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC},
+                       $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC},
+                       $this_reclaim_delay / 1000);
+
+               if ($stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN}) {
+                       print "      ";
+                       for (my $order = 0; $order < 20; $order++) {
+                               my $count = $stats{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order];
+                               if ($count != 0) {
+                                       print "direct-$order=$count ";
+                               }
+                       }
+               }
+               if ($stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD}) {
+                       print "      ";
+                       for (my $order = 0; $order < 20; $order++) {
+                               my $count = $stats{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order];
+                               if ($count != 0) {
+                                       print "wakeup-$order=$count ";
+                               }
+                       }
+               }
+               if ($stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY}) {
+                       print "      ";
+                       my $count = $stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY};
+                       if ($count != 0) {
+                               print "contig-dirty=$count ";
+                       }
+               }
+
+               print "\n";
+       }
+
+       # Print out kswapd activity
+       printf("\n");
+       printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s\n", "Kswapd",   "Kswapd",  "Order",     "Pages",   "Pages",  "Pages");
+       printf("%-" . $max_strlen . "s %8s %10s   %8s   %8s %8s %8s\n", "Instance", "Wakeups", "Re-wakeup", "Scanned", "Sync-IO", "ASync-IO");
+       foreach $process_pid (keys %stats) {
+
+               if (!$stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) {
+                       next;
+               }
+
+               $total_kswapd_wake += $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE};
+               $total_kswapd_nr_scanned += $stats{$process_pid}->{HIGH_NR_SCANNED};
+               $total_kswapd_writepage_file_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
+               $total_kswapd_writepage_anon_sync += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
+               $total_kswapd_writepage_file_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
+               $total_kswapd_writepage_anon_async += $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
+
+               printf("%-" . $max_strlen . "s %8d %10d   %8u   %8i %8u",
+                       $process_pid,
+                       $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE},
+                       $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP},
+                       $stats{$process_pid}->{HIGH_NR_SCANNED},
+                       $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC},
+                       $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} + $stats{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC});
+
+               if ($stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE}) {
+                       print "      ";
+                       for (my $order = 0; $order < 20; $order++) {
+                               my $count = $stats{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order];
+                               if ($count != 0) {
+                                       print "wake-$order=$count ";
+                               }
+                       }
+               }
+               if ($stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP}) {
+                       print "      ";
+                       for (my $order = 0; $order < 20; $order++) {
+                               my $count = $stats{$process_pid}->{HIGH_KSWAPD_REWAKEUP_PERORDER}[$order];
+                               if ($count != 0) {
+                                       print "rewake-$order=$count ";
+                               }
+                       }
+               }
+               printf("\n");
+       }
+
+       # Print out summaries
+       $total_direct_latency /= 1000;
+       $total_kswapd_latency /= 1000;
+       print "\nSummary\n";
+       print "Direct reclaims:                         $total_direct_reclaim\n";
+       print "Direct reclaim pages scanned:            $total_direct_nr_scanned\n";
+       print "Direct reclaim write file sync I/O:      $total_direct_writepage_file_sync\n";
+       print "Direct reclaim write anon sync I/O:      $total_direct_writepage_anon_sync\n";
+       print "Direct reclaim write file async I/O:     $total_direct_writepage_file_async\n";
+       print "Direct reclaim write anon async I/O:     $total_direct_writepage_anon_async\n";
+       print "Wake kswapd requests:                    $total_wakeup_kswapd\n";
+       printf "Time stalled direct reclaim:            %-1.2f seconds\n", $total_direct_latency;
+       print "\n";
+       print "Kswapd wakeups:                          $total_kswapd_wake\n";
+       print "Kswapd pages scanned:                    $total_kswapd_nr_scanned\n";
+       print "Kswapd reclaim write file sync I/O:      $total_kswapd_writepage_file_sync\n";
+       print "Kswapd reclaim write anon sync I/O:      $total_kswapd_writepage_anon_sync\n";
+       print "Kswapd reclaim write file async I/O:     $total_kswapd_writepage_file_async\n";
+       print "Kswapd reclaim write anon async I/O:     $total_kswapd_writepage_anon_async\n";
+       printf "Time kswapd awake:                      %-1.2f seconds\n", $total_kswapd_latency;
+}
+
+sub aggregate_perprocesspid() {
+       my $process_pid;
+       my $process;
+       undef %perprocess;
+
+       foreach $process_pid (keys %perprocesspid) {
+               $process = $process_pid;
+               $process =~ s/-([0-9])*$//;
+               if ($process eq '') {
+                       $process = "NO_PROCESS_NAME";
+               }
+
+               $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN} += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN};
+               $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE} += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE};
+               $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD} += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD};
+               $perprocess{$process}->{HIGH_KSWAPD_REWAKEUP} += $perprocesspid{$process_pid}->{HIGH_KSWAPD_REWAKEUP};
+               $perprocess{$process}->{HIGH_NR_SCANNED} += $perprocesspid{$process_pid}->{HIGH_NR_SCANNED};
+               $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_SYNC};
+               $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_SYNC};
+               $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_FILE_ASYNC};
+               $perprocess{$process}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC} += $perprocesspid{$process_pid}->{MM_VMSCAN_WRITEPAGE_ANON_ASYNC};
+
+               for (my $order = 0; $order < 20; $order++) {
+                       $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_DIRECT_RECLAIM_BEGIN_PERORDER}[$order];
+                       $perprocess{$process}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_WAKEUP_KSWAPD_PERORDER}[$order];
+                       $perprocess{$process}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order] += $perprocesspid{$process_pid}->{MM_VMSCAN_KSWAPD_WAKE_PERORDER}[$order];
+
+               }
+
+               # Aggregate direct reclaim latencies
+               my $wr_index = $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END};
+               my $rd_index = 0;
+               while (defined $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index]) {
+                       $perprocess{$process}->{HIGH_DIRECT_RECLAIM_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_DIRECT_RECLAIM_LATENCY}[$rd_index];
+                       $rd_index++;
+                       $wr_index++;
+               }
+               $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index;
+
+               # Aggregate kswapd latencies
+               my $wr_index = $perprocess{$process}->{MM_VMSCAN_KSWAPD_SLEEP};
+               my $rd_index = 0;
+               while (defined $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index]) {
+                       $perprocess{$process}->{HIGH_KSWAPD_LATENCY}[$wr_index] = $perprocesspid{$process_pid}->{HIGH_KSWAPD_LATENCY}[$rd_index];
+                       $rd_index++;
+                       $wr_index++;
+               }
+               $perprocess{$process}->{MM_VMSCAN_DIRECT_RECLAIM_END} = $wr_index;
+       }
+}
+
+sub report() {
+       if (!$opt_ignorepid) {
+               dump_stats(\%perprocesspid);
+       } else {
+               aggregate_perprocesspid();
+               dump_stats(\%perprocess);
+       }
+}
+
+# Process events or signals until neither is available
+sub signal_loop() {
+       my $sigint_processed;
+       do {
+               $sigint_processed = 0;
+               process_events();
+
+               # Handle pending signals if any
+               if ($sigint_pending) {
+                       my $current_time = time;
+
+                       if ($sigint_exit) {
+                               print "Received exit signal\n";
+                               $sigint_pending = 0;
+                       }
+                       if ($sigint_report) {
+                               if ($current_time >= $sigint_received + 2) {
+                                       report();
+                                       $sigint_report = 0;
+                                       $sigint_pending = 0;
+                                       $sigint_processed = 1;
+                               }
+                       }
+               }
+       } while ($sigint_pending || $sigint_processed);
+}
+
+signal_loop();
+report();
index 0af9595884aae3efb177d3b08eebb74208000a0e..832f904db114bec15af5e1cad54b2fd62e765f37 100644 (file)
@@ -574,7 +574,6 @@ L:  linux-mtd@lists.infradead.org
 S:     Maintained
 F:     drivers/mtd/nand/bcm_umi_nand.c
 F:     drivers/mtd/nand/bcm_umi_bch.c
-F:     drivers/mtd/nand/bcm_umi_hamming.c
 F:     drivers/mtd/nand/nand_bcm_umi.h
 
 ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT
@@ -975,12 +974,11 @@ F:        drivers/input/keyboard/w90p910_keypad.c
 F:     drivers/input/touchscreen/w90p910_ts.c
 F:     drivers/watchdog/nuc900_wdt.c
 F:     drivers/net/arm/w90p910_ether.c
-F:     drivers/mtd/nand/w90p910_nand.c
+F:     drivers/mtd/nand/nuc900_nand.c
 F:     drivers/rtc/rtc-nuc900.c
 F:     drivers/spi/spi_nuc900.c
 F:     drivers/usb/host/ehci-w90x900.c
 F:     drivers/video/nuc900fb.c
-F:     drivers/sound/soc/nuc900/
 
 ARM/U300 MACHINE SUPPORT
 M:     Linus Walleij <linus.walleij@stericsson.com>
@@ -1010,14 +1008,14 @@ M:      Marek Vasut <marek.vasut@gmail.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     arch/arm/mach-pxa/vpac270.c
-F:     arch/arm/mach-pxa/include/mach-pxa/vpac270.h
+F:     arch/arm/mach-pxa/include/mach/vpac270.h
 
 ARM/ZIPIT Z2 SUPPORT
 M:     Marek Vasut <marek.vasut@gmail.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     arch/arm/mach-pxa/z2.c
-F:     arch/arm/mach-pxa/include/mach-pxa/z2.h
+F:     arch/arm/mach-pxa/include/mach/z2.h
 
 ASC7621 HARDWARE MONITOR DRIVER
 M:     George Joseph <george.joseph@fairview5.com>
@@ -1087,7 +1085,6 @@ F:        drivers/net/wireless/ath/ath5k/
 ATHEROS ATH9K WIRELESS DRIVER
 M:     "Luis R. Rodriguez" <lrodriguez@atheros.com>
 M:     Jouni Malinen <jmalinen@atheros.com>
-M:     Sujith Manoharan <Sujith.Manoharan@atheros.com>
 M:     Vasanthakumar Thiagarajan <vasanth@atheros.com>
 M:     Senthil Balasubramanian <senthilkumar@atheros.com>
 L:     linux-wireless@vger.kernel.org
@@ -1253,8 +1250,7 @@ S:        Maintained
 F:     drivers/net/hamradio/baycom*
 
 BEFS FILE SYSTEM
-M:     "Sergey S. Kostyliov" <rathamahata@php4.ru>
-S:     Maintained
+S:     Orphan
 F:     Documentation/filesystems/befs.txt
 F:     fs/befs/
 
@@ -1734,6 +1730,8 @@ CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
 M:     Neil Horman <nhorman@tuxdriver.com>
 L:     linux-crypto@vger.kernel.org
 S:     Maintained
+F:     crypto/ansi_cprng.c
+F:     crypto/rng.c
 
 CS5535 Audio ALSA driver
 M:     Jaya Kumar <jayakumar.alsa@gmail.com>
@@ -1892,6 +1890,7 @@ F:        drivers/firmware/dcdbas.*
 DELL WMI EXTRAS DRIVER
 M:     Matthew Garrett <mjg59@srcf.ucam.org>
 S:     Maintained
+F:     drivers/platform/x86/dell-wmi.c
 
 DEVICE NUMBER REGISTRY
 M:     Torben Mathiasen <device@lanana.org>
@@ -2021,6 +2020,7 @@ L:        dri-devel@lists.freedesktop.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6.git
 S:     Maintained
 F:     drivers/gpu/drm/
+F:     include/drm/
 
 DSCC4 DRIVER
 M:     Francois Romieu <romieu@fr.zoreil.com>
@@ -3210,6 +3210,13 @@ F:       Documentation/video4linux/*.ivtv
 F:     drivers/media/video/ivtv/
 F:     include/linux/ivtv*
 
+JC42.4 TEMPERATURE SENSOR DRIVER
+M:     Guenter Roeck <linux@roeck-us.net>
+L:     lm-sensors@lm-sensors.org
+S:     Maintained
+F:     drivers/hwmon/jc42.c
+F:     Documentation/hwmon/jc42
+
 JFS FILESYSTEM
 M:     Dave Kleikamp <shaggy@linux.vnet.ibm.com>
 L:     jfs-discussion@lists.sourceforge.net
@@ -3521,6 +3528,7 @@ M:        Marcelo Tosatti <marcelo@kvack.org>
 W:     http://www.penguinppc.org/
 L:     linuxppc-dev@ozlabs.org
 S:     Maintained
+F:     arch/powerpc/platforms/8xx/
 
 LINUX FOR POWERPC EMBEDDED PPC83XX AND PPC85XX
 M:     Kumar Gala <galak@kernel.crashing.org>
@@ -3623,7 +3631,7 @@ M:        Mike Frysinger <vapier@gentoo.org>
 M:     Subrata Modak <subrata@linux.vnet.ibm.com>
 L:     ltp-list@lists.sourceforge.net (subscribers-only)
 W:     http://ltp.sourceforge.net/
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
+T:     git git://ltp.git.sourceforge.net/gitroot/ltp/ltp-dev
 S:     Maintained
 
 M32R ARCHITECTURE
@@ -4045,7 +4053,7 @@ F:        net/rfkill/
 F:     net/wireless/
 F:     include/net/ieee80211*
 F:     include/linux/wireless.h
-F:     include/linux/iw_handler.h
+F:     include/net/iw_handler.h
 F:     drivers/net/wireless/
 
 NETWORKING DRIVERS
@@ -4193,6 +4201,8 @@ M:        David Brownell <dbrownell@users.sourceforge.net>
 L:     linux-usb@vger.kernel.org
 L:     linux-omap@vger.kernel.org
 S:     Maintained
+F:     drivers/usb/*/*omap*
+F:     arch/arm/*omap*/usb*
 
 OMFS FILESYSTEM
 M:     Bob Copeland <me@bobcopeland.com>
@@ -4533,7 +4543,7 @@ F:        drivers/net/pppox.c
 PPP OVER L2TP
 M:     James Chapman <jchapman@katalix.com>
 S:     Maintained
-F:     drivers/net/pppol2tp.c
+F:     net/l2tp/l2tp_ppp.c
 F:     include/linux/if_pppol2tp.h
 
 PPS SUPPORT
@@ -4560,11 +4570,6 @@ W:       http://prism54.org
 S:     Obsolete
 F:     drivers/net/wireless/prism54/
 
-PROMISE DC4030 CACHING DISK CONTROLLER DRIVER
-M:     Peter Denison <promise@pnd-pc.demon.co.uk>
-W:     http://www.pnd-pc.demon.co.uk/promise/
-S:     Maintained
-
 PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER
 M:     Mikael Pettersson <mikpe@it.uu.se>
 L:     linux-ide@vger.kernel.org
@@ -4597,6 +4602,7 @@ PS3VRAM DRIVER
 M:     Jim Paris <jim@jtan.com>
 L:     cbe-oss-dev@ozlabs.org
 S:     Maintained
+F:     drivers/block/ps3vram.c
 
 PTRACE SUPPORT
 M:     Roland McGrath <roland@redhat.com>
@@ -4823,8 +4829,8 @@ F:        net/rfkill/
 RICOH SMARTMEDIA/XD DRIVER
 M:     Maxim Levitsky <maximlevitsky@gmail.com>
 S:     Maintained
-F:     drivers/mtd/nand/r822.c
-F:     drivers/mtd/nand/r822.h
+F:     drivers/mtd/nand/r852.c
+F:     drivers/mtd/nand/r852.h
 
 RISCOM8 DRIVER
 S:     Orphan
@@ -5251,6 +5257,13 @@ M:       Nicolas Pitre <nico@fluxnic.net>
 S:     Odd Fixes
 F:     drivers/net/smc91x.*
 
+SMM665 HARDWARE MONITOR DRIVER
+M:     Guenter Roeck <linux@roeck-us.net>
+L:     lm-sensors@lm-sensors.org
+S:     Maintained
+F:     Documentation/hwmon/smm665
+F:     drivers/hwmon/smm665.c
+
 SMSC47B397 HARDWARE MONITOR DRIVER
 M:     "Mark M. Hoffman" <mhoffman@lightlink.com>
 L:     lm-sensors@lm-sensors.org
@@ -5271,11 +5284,6 @@ L:       netdev@vger.kernel.org
 S:     Supported
 F:     drivers/net/smsc9420.*
 
-SMX UIO Interface
-M:     Ben Nizette <bn@niasdigital.com>
-S:     Maintained
-F:     drivers/uio/uio_smx.c
-
 SN-IA64 (Itanium) SUB-PLATFORM
 M:     Jes Sorensen <jes@sgi.com>
 L:     linux-altix@sgi.com
@@ -5405,7 +5413,8 @@ S:        Maintained
 F:     arch/arm/mach-spear*/clock.c
 F:     arch/arm/mach-spear*/include/mach/clkdev.h
 F:     arch/arm/plat-spear/clock.c
-F:     arch/arm/plat-spear/include/plat/clock.h and clkdev.h
+F:     arch/arm/plat-spear/include/plat/clkdev.h
+F:     arch/arm/plat-spear/include/plat/clock.h
 
 SPEAR PAD MULTIPLEXING SUPPORT
 M:     Viresh Kumar <viresh.kumar@st.com>
@@ -5485,11 +5494,6 @@ M:       Ion Badulescu <ionut@badula.org>
 S:     Odd Fixes
 F:     drivers/net/starfire*
 
-STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
-S:     Orphan
-F:     drivers/staging/strip/strip.c
-F:     include/linux/if_strip.h
-
 STRADIS MPEG-2 DECODER DRIVER
 M:     Nathan Laredo <laredo@gnu.org>
 W:     http://www.stradis.com/
@@ -5769,6 +5773,9 @@ UCLINUX FOR RENESAS H8/300 (H8300)
 M:     Yoshinori Sato <ysato@users.sourceforge.jp>
 W:     http://uclinux-h8.sourceforge.jp/
 S:     Supported
+F:     arch/h8300/
+F:     drivers/ide/ide-h8300.c
+F:     drivers/net/ne-h8300.c
 
 UDF FILESYSTEM
 M:     Jan Kara <jack@suse.cz>
@@ -6060,7 +6067,7 @@ F:        drivers/net/usb/usbnet.c
 F:     include/linux/usb/usbnet.h
 
 USB VIDEO CLASS
-M:     Laurent Pinchart <laurent.pinchart@skynet.be>
+M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 L:     linux-uvc-devel@lists.berlios.de (subscribers-only)
 L:     linux-media@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
@@ -6312,6 +6319,11 @@ M:       linux-wimax@intel.com
 L:     wimax@linuxwimax.org
 S:     Supported
 W:     http://linuxwimax.org
+F:     Documentation/wimax/README.wimax
+F:     include/linux/wimax.h
+F:     include/linux/wimax/debug.h
+F:     include/net/wimax.h
+F:     net/wimax/
 
 WIMEDIA LLC PROTOCOL (WLP) SUBSYSTEM
 M:     David Vrabel <david.vrabel@csr.com>
index a37db0f95092f495a02819a7382631c34b686c37..5050ac81cd90281effea54f2e9c0e2c9f2da5198 100644 (file)
@@ -3,6 +3,7 @@
 
 
 extern volatile unsigned long irq_err_count;
+DECLARE_PER_CPU(unsigned long, irq_pmi_count);
 
 #ifdef CONFIG_ALPHA_GENERIC
 #define ACTUAL_NR_IRQS alpha_mv.nr_irqs
diff --git a/arch/alpha/include/asm/md.h b/arch/alpha/include/asm/md.h
deleted file mode 100644 (file)
index 6c9b822..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/* $Id: md.h,v 1.1 1997/12/15 15:11:48 jj Exp $
- * md.h: High speed xor_block operation for RAID4/5 
- *
- */
-#ifndef __ASM_MD_H
-#define __ASM_MD_H
-
-/* #define HAVE_ARCH_XORBLOCK */
-
-#define MD_XORBLOCK_ALIGNMENT  sizeof(long)
-
-#endif /* __ASM_MD_H */
index 3bef8522017c23094e1cee52ffd2ef6da28a54e0..4157cd3c44a96d2811410b334a35f11923ba6fbf 100644 (file)
@@ -2,8 +2,14 @@
 #define __ASM_ALPHA_PERF_EVENT_H
 
 /* Alpha only supports software events through this interface. */
-static inline void set_perf_event_pending(void) { }
+extern void set_perf_event_pending(void);
 
 #define PERF_EVENT_INDEX_OFFSET 0
 
+#ifdef CONFIG_PERF_EVENTS
+extern void init_hw_perf_events(void);
+#else
+static inline void init_hw_perf_events(void)    { }
+#endif
+
 #endif /* __ASM_ALPHA_PERF_EVENT_H */
diff --git a/arch/alpha/include/asm/wrperfmon.h b/arch/alpha/include/asm/wrperfmon.h
new file mode 100644 (file)
index 0000000..319bf67
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Definitions for use with the Alpha wrperfmon PAL call.
+ */
+
+#ifndef __ALPHA_WRPERFMON_H
+#define __ALPHA_WRPERFMON_H
+
+/* Following commands are implemented on all CPUs */
+#define PERFMON_CMD_DISABLE 0
+#define PERFMON_CMD_ENABLE 1
+#define PERFMON_CMD_DESIRED_EVENTS 2
+#define PERFMON_CMD_LOGGING_OPTIONS 3
+/* Following commands on EV5/EV56/PCA56 only */
+#define PERFMON_CMD_INT_FREQ 4
+#define PERFMON_CMD_ENABLE_CLEAR 7
+/* Following commands are on EV5 and better CPUs */
+#define PERFMON_CMD_READ 5
+#define PERFMON_CMD_WRITE 6
+/* Following command are on EV6 and better CPUs */
+#define PERFMON_CMD_ENABLE_WRITE 7
+/* Following command are on EV67 and better CPUs */
+#define PERFMON_CMD_I_STAT 8
+#define PERFMON_CMD_PMPC 9
+
+
+/* EV5/EV56/PCA56 Counters */
+#define EV5_PCTR_0 (1UL<<0)
+#define EV5_PCTR_1 (1UL<<1)
+#define EV5_PCTR_2 (1UL<<2)
+
+#define EV5_PCTR_0_COUNT_SHIFT 48
+#define EV5_PCTR_1_COUNT_SHIFT 32
+#define EV5_PCTR_2_COUNT_SHIFT 16
+
+#define EV5_PCTR_0_COUNT_MASK 0xffffUL
+#define EV5_PCTR_1_COUNT_MASK 0xffffUL
+#define EV5_PCTR_2_COUNT_MASK 0x3fffUL
+
+/* EV6 Counters */
+#define EV6_PCTR_0 (1UL<<0)
+#define EV6_PCTR_1 (1UL<<1)
+
+#define EV6_PCTR_0_COUNT_SHIFT 28
+#define EV6_PCTR_1_COUNT_SHIFT 6
+
+#define EV6_PCTR_0_COUNT_MASK 0xfffffUL
+#define EV6_PCTR_1_COUNT_MASK 0xfffffUL
+
+/* EV67 (and subsequent) counters */
+#define EV67_PCTR_0 (1UL<<0)
+#define EV67_PCTR_1 (1UL<<1)
+
+#define EV67_PCTR_0_COUNT_SHIFT 28
+#define EV67_PCTR_1_COUNT_SHIFT 6
+
+#define EV67_PCTR_0_COUNT_MASK 0xfffffUL
+#define EV67_PCTR_1_COUNT_MASK 0xfffffUL
+
+
+/*
+ * The Alpha Architecure Handbook, vers. 4 (1998) appears to have a misprint
+ *  in Table E-23 regarding the bits that set the event PCTR 1 counts.
+ *  Hopefully what we have here is correct.
+ */
+#define EV6_PCTR_0_EVENT_MASK 0x10UL
+#define EV6_PCTR_1_EVENT_MASK 0x0fUL
+
+/* EV6 Events */
+#define EV6_PCTR_0_CYCLES (0UL << 4)
+#define EV6_PCTR_0_INSTRUCTIONS (1UL << 4)
+
+#define EV6_PCTR_1_CYCLES 0
+#define EV6_PCTR_1_BRANCHES 1
+#define EV6_PCTR_1_BRANCH_MISPREDICTS 2
+#define EV6_PCTR_1_DTB_SINGLE_MISSES 3
+#define EV6_PCTR_1_DTB_DOUBLE_MISSES 4
+#define EV6_PCTR_1_ITB_MISSES 5
+#define EV6_PCTR_1_UNALIGNED_TRAPS 6
+#define EV6_PCTR_1_REPLY_TRAPS 7
+
+/* From the Alpha Architecture Reference Manual, 4th edn., 2002 */
+#define EV67_PCTR_MODE_MASK 0x10UL
+#define EV67_PCTR_EVENT_MASK 0x0CUL
+
+#define EV67_PCTR_MODE_PROFILEME (1UL<<4)
+#define EV67_PCTR_MODE_AGGREGATE (0UL<<4)
+
+#define EV67_PCTR_INSTR_CYCLES (0UL<<2)
+#define EV67_PCTR_CYCLES_UNDEF (1UL<<2)
+#define EV67_PCTR_INSTR_BCACHEMISS (2UL<<2)
+#define EV67_PCTR_CYCLES_MBOX (3UL<<2)
+
+#endif
index 5a62fb46ef20b60759db3c7fdb68dad4daf3e525..1ee9b5b629b8fb37f707b678c2eeef5411869497 100644 (file)
@@ -15,6 +15,7 @@ obj-$(CONFIG_SMP)     += smp.o
 obj-$(CONFIG_PCI)      += pci.o pci_iommu.o pci-sysfs.o
 obj-$(CONFIG_SRM_ENV)  += srm_env.o
 obj-$(CONFIG_MODULES)  += module.o
+obj-$(CONFIG_PERF_EVENTS) += perf_event.o
 
 ifdef CONFIG_ALPHA_GENERIC
 
index 7f912ba3d9ad79ee9f333f14dfcd0f3dc7bb59c5..fe912984d9b1fae21657d36e3b35613525986341 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/uaccess.h>
 
 volatile unsigned long irq_err_count;
+DEFINE_PER_CPU(unsigned long, irq_pmi_count);
 
 void ack_bad_irq(unsigned int irq)
 {
@@ -63,9 +64,7 @@ int irq_select_affinity(unsigned int irq)
 int
 show_interrupts(struct seq_file *p, void *v)
 {
-#ifdef CONFIG_SMP
        int j;
-#endif
        int irq = *(loff_t *) v;
        struct irqaction * action;
        unsigned long flags;
@@ -112,6 +111,10 @@ unlock:
                        seq_printf(p, "%10lu ", cpu_data[j].ipi_count);
                seq_putc(p, '\n');
 #endif
+               seq_puts(p, "PMI: ");
+               for_each_online_cpu(j)
+                       seq_printf(p, "%10lu ", per_cpu(irq_pmi_count, j));
+               seq_puts(p, "          Performance Monitoring\n");
                seq_printf(p, "ERR: %10lu\n", irq_err_count);
        }
        return 0;
index cfde865b78e05f9c02c89d174887e38ef12590b2..5f77afb88e898b849f57e5c115f4688282e71c62 100644 (file)
@@ -10,6 +10,7 @@
 
 #include <asm/machvec.h>
 #include <asm/dma.h>
+#include <asm/perf_event.h>
 
 #include "proto.h"
 #include "irq_impl.h"
@@ -111,6 +112,8 @@ init_IRQ(void)
        wrent(entInt, 0);
 
        alpha_mv.init_irq();
+
+       init_hw_perf_events();
 }
 
 /*
index de9d397178085a9b7cb4482d487e2f9379824bbc..88131c6e42e3fe7f4ed84b451ee7247c120ae24b 100644 (file)
@@ -234,11 +234,11 @@ linux_to_osf_statfs(struct kstatfs *linux_stat, struct osf_statfs __user *osf_st
 }
 
 static int
-do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer,
+do_osf_statfs(struct path *path, struct osf_statfs __user *buffer,
              unsigned long bufsiz)
 {
        struct kstatfs linux_stat;
-       int error = vfs_statfs(dentry, &linux_stat);
+       int error = vfs_statfs(path, &linux_stat);
        if (!error)
                error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz);
        return error;   
@@ -252,7 +252,7 @@ SYSCALL_DEFINE3(osf_statfs, char __user *, pathname,
 
        retval = user_path(pathname, &path);
        if (!retval) {
-               retval = do_osf_statfs(path.dentry, buffer, bufsiz);
+               retval = do_osf_statfs(&path buffer, bufsiz);
                path_put(&path);
        }
        return retval;
@@ -267,7 +267,7 @@ SYSCALL_DEFINE3(osf_fstatfs, unsigned long, fd,
        retval = -EBADF;
        file = fget(fd);
        if (file) {
-               retval = do_osf_statfs(file->f_path.dentry, buffer, bufsiz);
+               retval = do_osf_statfs(&file->f_path, buffer, bufsiz);
                fput(file);
        }
        return retval;
diff --git a/arch/alpha/kernel/perf_event.c b/arch/alpha/kernel/perf_event.c
new file mode 100644 (file)
index 0000000..51c39fa
--- /dev/null
@@ -0,0 +1,842 @@
+/*
+ * Hardware performance events for the Alpha.
+ *
+ * We implement HW counts on the EV67 and subsequent CPUs only.
+ *
+ * (C) 2010 Michael J. Cree
+ *
+ * Somewhat based on the Sparc code, and to a lesser extent the PowerPC and
+ * ARM code, which are copyright by their respective authors.
+ */
+
+#include <linux/perf_event.h>
+#include <linux/kprobes.h>
+#include <linux/kernel.h>
+#include <linux/kdebug.h>
+#include <linux/mutex.h>
+
+#include <asm/hwrpb.h>
+#include <asm/atomic.h>
+#include <asm/irq.h>
+#include <asm/irq_regs.h>
+#include <asm/pal.h>
+#include <asm/wrperfmon.h>
+#include <asm/hw_irq.h>
+
+
+/* The maximum number of PMCs on any Alpha CPU whatsoever. */
+#define MAX_HWEVENTS 3
+#define PMC_NO_INDEX -1
+
+/* For tracking PMCs and the hw events they monitor on each CPU. */
+struct cpu_hw_events {
+       int                     enabled;
+       /* Number of events scheduled; also number entries valid in arrays below. */
+       int                     n_events;
+       /* Number events added since last hw_perf_disable(). */
+       int                     n_added;
+       /* Events currently scheduled. */
+       struct perf_event       *event[MAX_HWEVENTS];
+       /* Event type of each scheduled event. */
+       unsigned long           evtype[MAX_HWEVENTS];
+       /* Current index of each scheduled event; if not yet determined
+        * contains PMC_NO_INDEX.
+        */
+       int                     current_idx[MAX_HWEVENTS];
+       /* The active PMCs' config for easy use with wrperfmon(). */
+       unsigned long           config;
+       /* The active counters' indices for easy use with wrperfmon(). */
+       unsigned long           idx_mask;
+};
+DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events);
+
+
+
+/*
+ * A structure to hold the description of the PMCs available on a particular
+ * type of Alpha CPU.
+ */
+struct alpha_pmu_t {
+       /* Mapping of the perf system hw event types to indigenous event types */
+       const int *event_map;
+       /* The number of entries in the event_map */
+       int  max_events;
+       /* The number of PMCs on this Alpha */
+       int  num_pmcs;
+       /*
+        * All PMC counters reside in the IBOX register PCTR.  This is the
+        * LSB of the counter.
+        */
+       int  pmc_count_shift[MAX_HWEVENTS];
+       /*
+        * The mask that isolates the PMC bits when the LSB of the counter
+        * is shifted to bit 0.
+        */
+       unsigned long pmc_count_mask[MAX_HWEVENTS];
+       /* The maximum period the PMC can count. */
+       unsigned long pmc_max_period[MAX_HWEVENTS];
+       /*
+        * The maximum value that may be written to the counter due to
+        * hardware restrictions is pmc_max_period - pmc_left.
+        */
+       long pmc_left[3];
+        /* Subroutine for allocation of PMCs.  Enforces constraints. */
+       int (*check_constraints)(struct perf_event **, unsigned long *, int);
+};
+
+/*
+ * The Alpha CPU PMU description currently in operation.  This is set during
+ * the boot process to the specific CPU of the machine.
+ */
+static const struct alpha_pmu_t *alpha_pmu;
+
+
+#define HW_OP_UNSUPPORTED -1
+
+/*
+ * The hardware description of the EV67, EV68, EV69, EV7 and EV79 PMUs
+ * follow. Since they are identical we refer to them collectively as the
+ * EV67 henceforth.
+ */
+
+/*
+ * EV67 PMC event types
+ *
+ * There is no one-to-one mapping of the possible hw event types to the
+ * actual codes that are used to program the PMCs hence we introduce our
+ * own hw event type identifiers.
+ */
+enum ev67_pmc_event_type {
+       EV67_CYCLES = 1,
+       EV67_INSTRUCTIONS,
+       EV67_BCACHEMISS,
+       EV67_MBOXREPLAY,
+       EV67_LAST_ET
+};
+#define EV67_NUM_EVENT_TYPES (EV67_LAST_ET-EV67_CYCLES)
+
+
+/* Mapping of the hw event types to the perf tool interface */
+static const int ev67_perfmon_event_map[] = {
+       [PERF_COUNT_HW_CPU_CYCLES]       = EV67_CYCLES,
+       [PERF_COUNT_HW_INSTRUCTIONS]     = EV67_INSTRUCTIONS,
+       [PERF_COUNT_HW_CACHE_REFERENCES] = HW_OP_UNSUPPORTED,
+       [PERF_COUNT_HW_CACHE_MISSES]     = EV67_BCACHEMISS,
+};
+
+struct ev67_mapping_t {
+       int config;
+       int idx;
+};
+
+/*
+ * The mapping used for one event only - these must be in same order as enum
+ * ev67_pmc_event_type definition.
+ */
+static const struct ev67_mapping_t ev67_mapping[] = {
+       {EV67_PCTR_INSTR_CYCLES, 1},     /* EV67_CYCLES, */
+       {EV67_PCTR_INSTR_CYCLES, 0},     /* EV67_INSTRUCTIONS */
+       {EV67_PCTR_INSTR_BCACHEMISS, 1}, /* EV67_BCACHEMISS */
+       {EV67_PCTR_CYCLES_MBOX, 1}       /* EV67_MBOXREPLAY */
+};
+
+
+/*
+ * Check that a group of events can be simultaneously scheduled on to the
+ * EV67 PMU.  Also allocate counter indices and config.
+ */
+static int ev67_check_constraints(struct perf_event **event,
+                               unsigned long *evtype, int n_ev)
+{
+       int idx0;
+       unsigned long config;
+
+       idx0 = ev67_mapping[evtype[0]-1].idx;
+       config = ev67_mapping[evtype[0]-1].config;
+       if (n_ev == 1)
+               goto success;
+
+       BUG_ON(n_ev != 2);
+
+       if (evtype[0] == EV67_MBOXREPLAY || evtype[1] == EV67_MBOXREPLAY) {
+               /* MBOX replay traps must be on PMC 1 */
+               idx0 = (evtype[0] == EV67_MBOXREPLAY) ? 1 : 0;
+               /* Only cycles can accompany MBOX replay traps */
+               if (evtype[idx0] == EV67_CYCLES) {
+                       config = EV67_PCTR_CYCLES_MBOX;
+                       goto success;
+               }
+       }
+
+       if (evtype[0] == EV67_BCACHEMISS || evtype[1] == EV67_BCACHEMISS) {
+               /* Bcache misses must be on PMC 1 */
+               idx0 = (evtype[0] == EV67_BCACHEMISS) ? 1 : 0;
+               /* Only instructions can accompany Bcache misses */
+               if (evtype[idx0] == EV67_INSTRUCTIONS) {
+                       config = EV67_PCTR_INSTR_BCACHEMISS;
+                       goto success;
+               }
+       }
+
+       if (evtype[0] == EV67_INSTRUCTIONS || evtype[1] == EV67_INSTRUCTIONS) {
+               /* Instructions must be on PMC 0 */
+               idx0 = (evtype[0] == EV67_INSTRUCTIONS) ? 0 : 1;
+               /* By this point only cycles can accompany instructions */
+               if (evtype[idx0^1] == EV67_CYCLES) {
+                       config = EV67_PCTR_INSTR_CYCLES;
+                       goto success;
+               }
+       }
+
+       /* Otherwise, darn it, there is a conflict.  */
+       return -1;
+
+success:
+       event[0]->hw.idx = idx0;
+       event[0]->hw.config_base = config;
+       if (n_ev == 2) {
+               event[1]->hw.idx = idx0 ^ 1;
+               event[1]->hw.config_base = config;
+       }
+       return 0;
+}
+
+
+static const struct alpha_pmu_t ev67_pmu = {
+       .event_map = ev67_perfmon_event_map,
+       .max_events = ARRAY_SIZE(ev67_perfmon_event_map),
+       .num_pmcs = 2,
+       .pmc_count_shift = {EV67_PCTR_0_COUNT_SHIFT, EV67_PCTR_1_COUNT_SHIFT, 0},
+       .pmc_count_mask = {EV67_PCTR_0_COUNT_MASK,  EV67_PCTR_1_COUNT_MASK,  0},
+       .pmc_max_period = {(1UL<<20) - 1, (1UL<<20) - 1, 0},
+       .pmc_left = {16, 4, 0},
+       .check_constraints = ev67_check_constraints
+};
+
+
+
+/*
+ * Helper routines to ensure that we read/write only the correct PMC bits
+ * when calling the wrperfmon PALcall.
+ */
+static inline void alpha_write_pmc(int idx, unsigned long val)
+{
+       val &= alpha_pmu->pmc_count_mask[idx];
+       val <<= alpha_pmu->pmc_count_shift[idx];
+       val |= (1<<idx);
+       wrperfmon(PERFMON_CMD_WRITE, val);
+}
+
+static inline unsigned long alpha_read_pmc(int idx)
+{
+       unsigned long val;
+
+       val = wrperfmon(PERFMON_CMD_READ, 0);
+       val >>= alpha_pmu->pmc_count_shift[idx];
+       val &= alpha_pmu->pmc_count_mask[idx];
+       return val;
+}
+
+/* Set a new period to sample over */
+static int alpha_perf_event_set_period(struct perf_event *event,
+                               struct hw_perf_event *hwc, int idx)
+{
+       long left = atomic64_read(&hwc->period_left);
+       long period = hwc->sample_period;
+       int ret = 0;
+
+       if (unlikely(left <= -period)) {
+               left = period;
+               atomic64_set(&hwc->period_left, left);
+               hwc->last_period = period;
+               ret = 1;
+       }
+
+       if (unlikely(left <= 0)) {
+               left += period;
+               atomic64_set(&hwc->period_left, left);
+               hwc->last_period = period;
+               ret = 1;
+       }
+
+       /*
+        * Hardware restrictions require that the counters must not be
+        * written with values that are too close to the maximum period.
+        */
+       if (unlikely(left < alpha_pmu->pmc_left[idx]))
+               left = alpha_pmu->pmc_left[idx];
+
+       if (left > (long)alpha_pmu->pmc_max_period[idx])
+               left = alpha_pmu->pmc_max_period[idx];
+
+       atomic64_set(&hwc->prev_count, (unsigned long)(-left));
+
+       alpha_write_pmc(idx, (unsigned long)(-left));
+
+       perf_event_update_userpage(event);
+
+       return ret;
+}
+
+
+/*
+ * Calculates the count (the 'delta') since the last time the PMC was read.
+ *
+ * As the PMCs' full period can easily be exceeded within the perf system
+ * sampling period we cannot use any high order bits as a guard bit in the
+ * PMCs to detect overflow as is done by other architectures.  The code here
+ * calculates the delta on the basis that there is no overflow when ovf is
+ * zero.  The value passed via ovf by the interrupt handler corrects for
+ * overflow.
+ *
+ * This can be racey on rare occasions -- a call to this routine can occur
+ * with an overflowed counter just before the PMI service routine is called.
+ * The check for delta negative hopefully always rectifies this situation.
+ */
+static unsigned long alpha_perf_event_update(struct perf_event *event,
+                                       struct hw_perf_event *hwc, int idx, long ovf)
+{
+       long prev_raw_count, new_raw_count;
+       long delta;
+
+again:
+       prev_raw_count = atomic64_read(&hwc->prev_count);
+       new_raw_count = alpha_read_pmc(idx);
+
+       if (atomic64_cmpxchg(&hwc->prev_count, prev_raw_count,
+                            new_raw_count) != prev_raw_count)
+               goto again;
+
+       delta = (new_raw_count  - (prev_raw_count & alpha_pmu->pmc_count_mask[idx])) + ovf;
+
+       /* It is possible on very rare occasions that the PMC has overflowed
+        * but the interrupt is yet to come.  Detect and fix this situation.
+        */
+       if (unlikely(delta < 0)) {
+               delta += alpha_pmu->pmc_max_period[idx] + 1;
+       }
+
+       atomic64_add(delta, &event->count);
+       atomic64_sub(delta, &hwc->period_left);
+
+       return new_raw_count;
+}
+
+
+/*
+ * Collect all HW events into the array event[].
+ */
+static int collect_events(struct perf_event *group, int max_count,
+                         struct perf_event *event[], unsigned long *evtype,
+                         int *current_idx)
+{
+       struct perf_event *pe;
+       int n = 0;
+
+       if (!is_software_event(group)) {
+               if (n >= max_count)
+                       return -1;
+               event[n] = group;
+               evtype[n] = group->hw.event_base;
+               current_idx[n++] = PMC_NO_INDEX;
+       }
+       list_for_each_entry(pe, &group->sibling_list, group_entry) {
+               if (!is_software_event(pe) && pe->state != PERF_EVENT_STATE_OFF) {
+                       if (n >= max_count)
+                               return -1;
+                       event[n] = pe;
+                       evtype[n] = pe->hw.event_base;
+                       current_idx[n++] = PMC_NO_INDEX;
+               }
+       }
+       return n;
+}
+
+
+
+/*
+ * Check that a group of events can be simultaneously scheduled on to the PMU.
+ */
+static int alpha_check_constraints(struct perf_event **events,
+                                  unsigned long *evtypes, int n_ev)
+{
+
+       /* No HW events is possible from hw_perf_group_sched_in(). */
+       if (n_ev == 0)
+               return 0;
+
+       if (n_ev > alpha_pmu->num_pmcs)
+               return -1;
+
+       return alpha_pmu->check_constraints(events, evtypes, n_ev);
+}
+
+
+/*
+ * If new events have been scheduled then update cpuc with the new
+ * configuration.  This may involve shifting cycle counts from one PMC to
+ * another.
+ */
+static void maybe_change_configuration(struct cpu_hw_events *cpuc)
+{
+       int j;
+
+       if (cpuc->n_added == 0)
+               return;
+
+       /* Find counters that are moving to another PMC and update */
+       for (j = 0; j < cpuc->n_events; j++) {
+               struct perf_event *pe = cpuc->event[j];
+
+               if (cpuc->current_idx[j] != PMC_NO_INDEX &&
+                       cpuc->current_idx[j] != pe->hw.idx) {
+                       alpha_perf_event_update(pe, &pe->hw, cpuc->current_idx[j], 0);
+                       cpuc->current_idx[j] = PMC_NO_INDEX;
+               }
+       }
+
+       /* Assign to counters all unassigned events. */
+       cpuc->idx_mask = 0;
+       for (j = 0; j < cpuc->n_events; j++) {
+               struct perf_event *pe = cpuc->event[j];
+               struct hw_perf_event *hwc = &pe->hw;
+               int idx = hwc->idx;
+
+               if (cpuc->current_idx[j] != PMC_NO_INDEX) {
+                       cpuc->idx_mask |= (1<<cpuc->current_idx[j]);
+                       continue;
+               }
+
+               alpha_perf_event_set_period(pe, hwc, idx);
+               cpuc->current_idx[j] = idx;
+               cpuc->idx_mask |= (1<<cpuc->current_idx[j]);
+       }
+       cpuc->config = cpuc->event[0]->hw.config_base;
+}
+
+
+
+/* Schedule perf HW event on to PMU.
+ *  - this function is called from outside this module via the pmu struct
+ *    returned from perf event initialisation.
+ */
+static int alpha_pmu_enable(struct perf_event *event)
+{
+       struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
+       int n0;
+       int ret;
+       unsigned long flags;
+
+       /*
+        * The Sparc code has the IRQ disable first followed by the perf
+        * disable, however this can lead to an overflowed counter with the
+        * PMI disabled on rare occasions.  The alpha_perf_event_update()
+        * routine should detect this situation by noting a negative delta,
+        * nevertheless we disable the PMCs first to enable a potential
+        * final PMI to occur before we disable interrupts.
+        */
+       perf_disable();
+       local_irq_save(flags);
+
+       /* Default to error to be returned */
+       ret = -EAGAIN;
+
+       /* Insert event on to PMU and if successful modify ret to valid return */
+       n0 = cpuc->n_events;
+       if (n0 < alpha_pmu->num_pmcs) {
+               cpuc->event[n0] = event;
+               cpuc->evtype[n0] = event->hw.event_base;
+               cpuc->current_idx[n0] = PMC_NO_INDEX;
+
+               if (!alpha_check_constraints(cpuc->event, cpuc->evtype, n0+1)) {
+                       cpuc->n_events++;
+                       cpuc->n_added++;
+                       ret = 0;
+               }
+       }
+
+       local_irq_restore(flags);
+       perf_enable();
+
+       return ret;
+}
+
+
+
+/* Disable performance monitoring unit
+ *  - this function is called from outside this module via the pmu struct
+ *    returned from perf event initialisation.
+ */
+static void alpha_pmu_disable(struct perf_event *event)
+{
+       struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
+       struct hw_perf_event *hwc = &event->hw;
+       unsigned long flags;
+       int j;
+
+       perf_disable();
+       local_irq_save(flags);
+
+       for (j = 0; j < cpuc->n_events; j++) {
+               if (event == cpuc->event[j]) {
+                       int idx = cpuc->current_idx[j];
+
+                       /* Shift remaining entries down into the existing
+                        * slot.
+                        */
+                       while (++j < cpuc->n_events) {
+                               cpuc->event[j - 1] = cpuc->event[j];
+                               cpuc->evtype[j - 1] = cpuc->evtype[j];
+                               cpuc->current_idx[j - 1] =
+                                       cpuc->current_idx[j];
+                       }
+
+                       /* Absorb the final count and turn off the event. */
+                       alpha_perf_event_update(event, hwc, idx, 0);
+                       perf_event_update_userpage(event);
+
+                       cpuc->idx_mask &= ~(1UL<<idx);
+                       cpuc->n_events--;
+                       break;
+               }
+       }
+
+       local_irq_restore(flags);
+       perf_enable();
+}
+
+
+static void alpha_pmu_read(struct perf_event *event)
+{
+       struct hw_perf_event *hwc = &event->hw;
+
+       alpha_perf_event_update(event, hwc, hwc->idx, 0);
+}
+
+
+static void alpha_pmu_unthrottle(struct perf_event *event)
+{
+       struct hw_perf_event *hwc = &event->hw;
+       struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
+
+       cpuc->idx_mask |= 1UL<<hwc->idx;
+       wrperfmon(PERFMON_CMD_ENABLE, (1UL<<hwc->idx));
+}
+
+
+/*
+ * Check that CPU performance counters are supported.
+ * - currently support EV67 and later CPUs.
+ * - actually some later revisions of the EV6 have the same PMC model as the
+ *     EV67 but we don't do suffiently deep CPU detection to detect them.
+ *     Bad luck to the very few people who might have one, I guess.
+ */
+static int supported_cpu(void)
+{
+       struct percpu_struct *cpu;
+       unsigned long cputype;
+
+       /* Get cpu type from HW */
+       cpu = (struct percpu_struct *)((char *)hwrpb + hwrpb->processor_offset);
+       cputype = cpu->type & 0xffffffff;
+       /* Include all of EV67, EV68, EV7, EV79 and EV69 as supported. */
+       return (cputype >= EV67_CPU) && (cputype <= EV69_CPU);
+}
+
+
+
+static void hw_perf_event_destroy(struct perf_event *event)
+{
+       /* Nothing to be done! */
+       return;
+}
+
+
+
+static int __hw_perf_event_init(struct perf_event *event)
+{
+       struct perf_event_attr *attr = &event->attr;
+       struct hw_perf_event *hwc = &event->hw;
+       struct perf_event *evts[MAX_HWEVENTS];
+       unsigned long evtypes[MAX_HWEVENTS];
+       int idx_rubbish_bin[MAX_HWEVENTS];
+       int ev;
+       int n;
+
+       /* We only support a limited range of HARDWARE event types with one
+        * only programmable via a RAW event type.