Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
authorLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 11 Mar 2008 16:14:34 +0000 (09:14 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 11 Mar 2008 16:14:34 +0000 (09:14 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband:
  RDMA/iwcm: Don't access a cm_id after dropping reference
  IB/iser: Handle iser_device allocation error gracefully
  IB/iser: Fix list iteration bug
  RDMA/cxgb3: Fix iwch_create_cq() off-by-one error
  RDMA/cxgb3: Return correct max_inline_data when creating a QP
  IB/fmr_pool: Flush all dirty FMRs from ib_fmr_pool_flush()
  Revert "IB/fmr_pool: ib_fmr_pool_flush() should flush all dirty FMRs"
  IB/cm: Flush workqueue when removing device
  MAINTAINERS: update ipath owner

587 files changed:
.gitignore
Documentation/00-INDEX
Documentation/DocBook/kernel-api.tmpl
Documentation/cdrom/ide-cd
Documentation/controllers/memory.txt
Documentation/feature-removal-schedule.txt
Documentation/gpio.txt
Documentation/ide/00-INDEX [new file with mode: 0644]
Documentation/ide/ide.txt [moved from Documentation/ide.txt with 99% similarity]
Documentation/kernel-parameters.txt
Documentation/kprobes.txt
Documentation/lguest/lguest.c
Documentation/pci.txt
Documentation/scheduler/sched-stats.txt
Documentation/scsi/ChangeLog.arcmsr
Documentation/usb/usb-help.txt
Documentation/vm/slub.txt
MAINTAINERS
Makefile
arch/Kconfig
arch/alpha/kernel/pci_iommu.c
arch/arm/Kconfig
arch/arm/mach-pxa/cpu-pxa.c
arch/arm/mach-pxa/pxa3xx.c
arch/arm/mach-pxa/zylonite.c
arch/arm/mm/mmap.c
arch/arm/mm/pgd.c
arch/blackfin/kernel/fixed_code.S
arch/blackfin/mach-bf548/boards/ezkit.c
arch/blackfin/mach-common/entry.S
arch/cris/arch-v10/kernel/time.c
arch/cris/arch-v10/lib/string.c
arch/cris/arch-v10/lib/usercopy.c
arch/cris/arch-v32/lib/string.c
arch/cris/arch-v32/lib/usercopy.c
arch/ia64/Kconfig
arch/ia64/Makefile
arch/ia64/configs/generic_defconfig [moved from arch/ia64/defconfig with 100% similarity]
arch/ia64/hp/common/hwsw_iommu.c
arch/ia64/hp/common/sba_iommu.c
arch/ia64/hp/sim/simeth.c
arch/ia64/hp/sim/simserial.c
arch/ia64/ia32/ia32_signal.c
arch/ia64/ia32/sys_ia32.c
arch/ia64/kernel/crash.c
arch/ia64/kernel/efi.c
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/kprobes.c
arch/ia64/kernel/mca.c
arch/ia64/kernel/module.c
arch/ia64/kernel/msi_ia64.c
arch/ia64/kernel/perfmon.c
arch/ia64/kernel/perfmon_default_smpl.c
arch/ia64/kernel/ptrace.c
arch/ia64/kernel/sal.c
arch/ia64/kernel/setup.c
arch/ia64/kernel/signal.c
arch/ia64/kernel/unaligned.c
arch/ia64/kernel/unwind.c
arch/ia64/mm/fault.c
arch/ia64/mm/init.c
arch/ia64/pci/fixup.c
arch/ia64/pci/pci.c
arch/ia64/sn/kernel/huberror.c
arch/ia64/sn/kernel/io_acpi_init.c
arch/ia64/sn/kernel/io_common.c
arch/ia64/sn/kernel/io_init.c
arch/ia64/sn/kernel/mca.c
arch/ia64/sn/pci/pci_dma.c
arch/ia64/sn/pci/tioca_provider.c
arch/ia64/sn/pci/tioce_provider.c
arch/m68k/kernel/entry.S
arch/m68knommu/defconfig
arch/m68knommu/kernel/syscalltable.S
arch/m68knommu/platform/68328/timers.c
arch/powerpc/Kconfig
arch/powerpc/boot/cuboot-bamboo.c
arch/powerpc/boot/cuboot-ebony.c
arch/powerpc/boot/cuboot-katmai.c
arch/powerpc/boot/cuboot-taishan.c
arch/powerpc/boot/cuboot-warp.c
arch/powerpc/boot/dts/haleakala.dts
arch/powerpc/boot/dts/katmai.dts
arch/powerpc/oprofile/op_model_cell.c
arch/powerpc/platforms/52xx/mpc52xx_common.c
arch/powerpc/platforms/cell/iommu.c
arch/powerpc/platforms/cell/setup.c
arch/powerpc/platforms/cell/spu_base.c
arch/powerpc/platforms/cell/spufs/context.c
arch/powerpc/platforms/cell/spufs/file.c
arch/powerpc/platforms/cell/spufs/sched.c
arch/powerpc/platforms/cell/spufs/sputrace.c
arch/powerpc/platforms/cell/spufs/switch.c
arch/powerpc/platforms/celleb/beat.h
arch/s390/Kconfig
arch/s390/defconfig
arch/s390/kernel/Makefile
arch/s390/kernel/early.c
arch/s390/kernel/ipl.c
arch/s390/kernel/process.c
arch/s390/kernel/smp.c
arch/s390/kernel/time.c
arch/sh/Kconfig
arch/sh/Makefile
arch/sh/boards/hp6xx/hp6xx_apm.c
arch/sh/boards/renesas/sh7710voipgw/Makefile [deleted file]
arch/sh/boards/renesas/sh7710voipgw/setup.c [deleted file]
arch/sh/boards/renesas/x3proto/ilsel.c
arch/sh/boards/superh/microdev/io.c
arch/sh/configs/r7780mp_defconfig
arch/sh/configs/se7780_defconfig
arch/sh/configs/sh7710voipgw_defconfig
arch/sh/kernel/cpu/init.c
arch/sh/kernel/cpu/sh4/sq.c
arch/sh/kernel/cpu/sh5/unwind.c
arch/sh/kernel/io_trapped.c
arch/sh/kernel/sh_ksyms_32.c
arch/sh/kernel/sh_ksyms_64.c
arch/sh/kernel/timers/timer-cmt.c
arch/sh/kernel/timers/timer-mtu2.c
arch/sh/kernel/topology.c
arch/sh/kernel/traps_64.c
arch/sh/lib64/c-checksum.c
arch/sh/lib64/udelay.c
arch/sh/mm/Kconfig
arch/sh/mm/init.c
arch/sh/mm/ioremap_32.c
arch/sh/mm/ioremap_64.c
arch/sh/mm/pg-sh7705.c
arch/sh/mm/tlbflush_64.c
arch/sh/tools/mach-types
arch/sparc/kernel/Makefile
arch/sparc/kernel/cpu.c
arch/sparc/kernel/ebus.c
arch/sparc/kernel/process.c
arch/sparc/kernel/una_asm.S [new file with mode: 0644]
arch/sparc/kernel/unaligned.c
arch/sparc64/Kconfig
arch/sparc64/kernel/cpu.c
arch/sparc64/kernel/process.c
arch/sparc64/solaris/conv.h
arch/sparc64/solaris/timod.c
arch/x86/Kconfig
arch/x86/Kconfig.cpu
arch/x86/boot/vesa.h
arch/x86/boot/video-vesa.c
arch/x86/ia32/ia32_signal.c
arch/x86/kernel/cpu/cpufreq/e_powersaver.c
arch/x86/kernel/i387.c
arch/x86/kernel/init_task.c
arch/x86/kernel/process_32.c
arch/x86/kernel/process_64.c
arch/x86/kernel/ptrace.c
arch/x86/kernel/reboot.c
arch/x86/kernel/signal_32.c
arch/x86/kernel/signal_64.c
arch/x86/kernel/step.c
arch/x86/kernel/tls.c
arch/x86/kernel/vsyscall_64.c
arch/x86/kvm/lapic.c
arch/x86/kvm/mmu.c
arch/x86/kvm/paging_tmpl.h
arch/x86/kvm/svm.c
arch/x86/kvm/vmx.c
arch/x86/kvm/x86.c
arch/x86/lguest/boot.c
arch/x86/mm/ioremap.c
arch/x86/mm/numa_64.c
arch/x86/pci/pcbios.c
arch/x86/vdso/Makefile
arch/x86/xen/enlighten.c
arch/x86/xen/setup.c
block/blk-barrier.c
block/blk-core.c
block/blk-map.c
block/blk-merge.c
block/blk-settings.c
block/blk-tag.c
block/blk.h
block/bsg.c
block/genhd.c
block/scsi_ioctl.c
crypto/Kconfig
crypto/Makefile
crypto/ablkcipher.c
crypto/blkcipher.c
crypto/chainiv.c
crypto/digest.c
crypto/eseqiv.c
crypto/xcbc.c
crypto/xts.c
drivers/acorn/char/defkeymap-l7200.c
drivers/ata/Kconfig
drivers/ata/Makefile
drivers/ata/ahci.c
drivers/ata/libata-acpi.c
drivers/ata/libata-core.c
drivers/ata/libata-eh.c
drivers/ata/libata-scsi.c
drivers/ata/libata-sff.c
drivers/ata/pata_hpt366.c
drivers/ata/pata_hpt37x.c
drivers/ata/pata_pdc2027x.c
drivers/ata/pata_rb500_cf.c [new file with mode: 0644]
drivers/ata/pata_serverworks.c
drivers/ata/sata_svw.c
drivers/base/core.c
drivers/base/platform.c
drivers/base/power/main.c
drivers/base/sys.c
drivers/base/transport_class.c
drivers/block/cciss.c
drivers/block/cciss_scsi.c
drivers/block/pktcdvd.c
drivers/bluetooth/hci_usb.c
drivers/cdrom/cdrom.c
drivers/char/defkeymap.c_shipped
drivers/char/esp.c
drivers/char/isicom.c
drivers/char/nozomi.c
drivers/char/pcmcia/ipwireless/network.c
drivers/char/riscom8.c
drivers/char/specialix.c
drivers/char/vt.c
drivers/char/xilinx_hwicap/buffer_icap.c
drivers/char/xilinx_hwicap/fifo_icap.c
drivers/char/xilinx_hwicap/xilinx_hwicap.c
drivers/char/xilinx_hwicap/xilinx_hwicap.h
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq_stats.c
drivers/dma/Kconfig
drivers/dma/Makefile
drivers/dma/fsldma.c [new file with mode: 0644]
drivers/dma/fsldma.h [new file with mode: 0644]
drivers/dma/ioat_dma.c
drivers/firewire/fw-card.c
drivers/firewire/fw-device.c
drivers/firewire/fw-device.h
drivers/firewire/fw-sbp2.c
drivers/firewire/fw-topology.c
drivers/firewire/fw-transaction.h
drivers/gpio/pca953x.c
drivers/ide/Kconfig
drivers/ide/ide-cd_ioctl.c
drivers/ide/ide-dma.c
drivers/ide/ide.c
drivers/input/misc/Kconfig
drivers/input/serio/i8042.h
drivers/isdn/gigaset/common.c
drivers/isdn/hisax/hisax_fcpcipnp.c
drivers/isdn/i4l/isdn_ttyfax.c
drivers/isdn/isdnloop/isdnloop.c
drivers/lguest/core.c
drivers/lguest/lguest_user.c
drivers/lguest/page_tables.c
drivers/md/bitmap.c
drivers/md/md.c
drivers/md/raid1.c
drivers/md/raid10.c
drivers/memstick/Kconfig
drivers/memstick/core/memstick.c
drivers/memstick/core/mspro_block.c
drivers/memstick/host/Kconfig
drivers/memstick/host/Makefile
drivers/memstick/host/jmb38x_ms.c [new file with mode: 0644]
drivers/memstick/host/tifm_ms.c
drivers/message/fusion/mptbase.c
drivers/message/fusion/mptsas.c
drivers/message/fusion/mptscsih.c
drivers/mfd/sm501.c
drivers/misc/thinkpad_acpi.c
drivers/misc/tifm_7xx1.c
drivers/mtd/ubi/build.c
drivers/mtd/ubi/ubi.h
drivers/mtd/ubi/vmt.c
drivers/mtd/ubi/vtbl.c
drivers/net/fec.c
drivers/net/pppol2tp.c
drivers/net/tun.c
drivers/net/wireless/b43legacy/main.c
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/p54common.c
drivers/net/wireless/p54common.h
drivers/net/wireless/rndis_wlan.c
drivers/parisc/Kconfig
drivers/parisc/ccio-dma.c
drivers/parisc/iommu-helpers.h
drivers/parisc/sba_iommu.c
drivers/pci/bus.c
drivers/pci/hotplug-pci.c
drivers/pci/hotplug/acpiphp_glue.c
drivers/pci/hotplug/cpci_hotplug_pci.c
drivers/pci/hotplug/ibmphp_ebda.c
drivers/pci/hotplug/pciehp_hpc.c
drivers/pci/hotplug/pciehp_pci.c
drivers/pci/hotplug/shpchp_pci.c
drivers/pci/probe.c
drivers/pci/quirks.c
drivers/pci/rom.c
drivers/rapidio/rio-driver.c
drivers/rtc/Kconfig
drivers/rtc/Makefile
drivers/rtc/rtc-s35390a.c [new file with mode: 0644]
drivers/s390/block/dasd_3990_erp.c
drivers/s390/block/dasd_proc.c
drivers/s390/char/defkeymap.c
drivers/s390/char/sclp_vt220.c
drivers/s390/crypto/ap_bus.c
drivers/scsi/aic94xx/aic94xx.h
drivers/scsi/aic94xx/aic94xx_hwi.h
drivers/scsi/aic94xx/aic94xx_init.c
drivers/scsi/aic94xx/aic94xx_task.c
drivers/scsi/aic94xx/aic94xx_tmf.c
drivers/scsi/arcmsr/arcmsr.h
drivers/scsi/gdth.c
drivers/scsi/gdth.h
drivers/scsi/ibmvscsi/ibmvstgt.c
drivers/scsi/libiscsi.c
drivers/scsi/libsas/sas_ata.c
drivers/scsi/libsas/sas_port.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/mvsas.c
drivers/scsi/ps3rom.c
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_mbx.c
drivers/scsi/qla2xxx/qla_version.h
drivers/scsi/qla4xxx/ql4_init.c
drivers/scsi/qla4xxx/ql4_os.c
drivers/scsi/scsi.c
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_tgt_lib.c
drivers/scsi/scsi_transport_iscsi.c
drivers/serial/8250_pnp.c
drivers/serial/m32r_sio.c
drivers/serial/of_serial.c
drivers/spi/mpc52xx_psc_spi.c
drivers/ssb/driver_pcicore.c
drivers/usb/core/Kconfig
drivers/usb/core/quirks.c
drivers/usb/core/usb.c
drivers/usb/gadget/Kconfig
drivers/usb/gadget/printer.c
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/pxa2xx_udc.h
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-q.c
drivers/usb/host/isp116x-hcd.c
drivers/usb/host/isp116x.h
drivers/usb/serial/cypress_m8.c
drivers/usb/serial/cypress_m8.h
drivers/usb/serial/ftdi_sio.c
drivers/usb/serial/ftdi_sio.h
drivers/usb/serial/generic.c
drivers/usb/serial/mos7840.c
drivers/usb/serial/option.c
drivers/usb/storage/protocol.c
drivers/usb/storage/sddr55.c
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/bf54x-lq043fb.c
drivers/video/bfin-t350mcqb-fb.c [new file with mode: 0644]
drivers/video/hitfb.c
drivers/video/mbx/mbxfb.c
drivers/video/pvr2fb.c
drivers/video/sm501fb.c
drivers/video/stifb.c
drivers/video/tridentfb.c
drivers/w1/masters/ds1wm.c
drivers/watchdog/cpu5wdt.c
drivers/watchdog/hpwdt.c
drivers/watchdog/it8712f_wdt.c
drivers/watchdog/machzwd.c
drivers/watchdog/mtx-1_wdt.c
drivers/watchdog/pcwd_usb.c
drivers/watchdog/s3c2410_wdt.c
drivers/watchdog/shwdt.c
fs/binfmt_elf.c
fs/buffer.c
fs/cifs/CHANGES
fs/cifs/README
fs/cifs/cifs_debug.c
fs/cifs/cifs_debug.h
fs/cifs/cifs_dfs_ref.c
fs/cifs/cifs_spnego.c
fs/cifs/cifs_unicode.c
fs/cifs/cifs_unicode.h
fs/cifs/cifsacl.c
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/cifsproto.h
fs/cifs/cifssmb.c
fs/cifs/connect.c
fs/cifs/dir.c
fs/cifs/dns_resolve.h
fs/cifs/fcntl.c
fs/cifs/file.c
fs/cifs/inode.c
fs/cifs/ioctl.c
fs/cifs/md4.c
fs/cifs/md5.c
fs/cifs/misc.c
fs/cifs/netmisc.c
fs/cifs/readdir.c
fs/cifs/sess.c
fs/cifs/smbdes.c
fs/cifs/transport.c
fs/cifs/xattr.c
fs/debugfs/inode.c
fs/ecryptfs/mmap.c
fs/exec.c
fs/ext3/super.c
fs/jbd/transaction.c
fs/mpage.c
fs/nfs/dir.c
fs/nfs/inode.c
fs/nfs/internal.h
fs/nfs/super.c
fs/nfs/write.c
fs/ocfs2/aops.c
fs/ocfs2/cluster/tcp.c
fs/ocfs2/dir.c
fs/ocfs2/dlm/dlmcommon.h
fs/ocfs2/dlm/dlmconvert.c
fs/ocfs2/dlm/dlmdomain.c
fs/ocfs2/dlm/dlmmaster.c
fs/ocfs2/dlm/dlmrecovery.c
fs/ocfs2/dlm/dlmthread.c
fs/ocfs2/dlmglue.c
fs/ocfs2/dlmglue.h
fs/ocfs2/heartbeat.c
fs/ocfs2/heartbeat.h
fs/ocfs2/localalloc.c
fs/ocfs2/resize.c
fs/proc/proc_misc.c
fs/reiserfs/super.c
fs/splice.c
fs/super.c
fs/xfs/xfs_iget.c
fs/xfs/xfs_trans_ail.c
include/asm-arm/arch-pxa/entry-macro.S
include/asm-arm/arch-pxa/pxa-regs.h
include/asm-arm/kexec.h
include/asm-arm/kprobes.h
include/asm-arm/unaligned.h
include/asm-blackfin/mmu_context.h
include/asm-blackfin/unistd.h
include/asm-cris/uaccess.h
include/asm-cris/unistd.h
include/asm-ia64/Kbuild
include/asm-ia64/hw_irq.h
include/asm-ia64/kprobes.h
include/asm-ia64/ptrace.h
include/asm-ia64/sal.h
include/asm-m68k/unistd.h
include/asm-m68knommu/machdep.h
include/asm-m68knommu/unistd.h
include/asm-mn10300/Kbuild
include/asm-powerpc/kprobes.h
include/asm-powerpc/reg.h
include/asm-s390/kprobes.h
include/asm-sh/delay.h
include/asm-sparc/system.h
include/asm-sparc64/kprobes.h
include/asm-sparc64/system.h
include/asm-x86/Kbuild
include/asm-x86/kprobes.h
include/asm-x86/ptrace-abi.h
include/crypto/internal/skcipher.h
include/linux/Kbuild
include/linux/blkdev.h
include/linux/cgroup_subsys.h
include/linux/compiler.h
include/linux/debugfs.h
include/linux/delay.h
include/linux/dmaengine.h
include/linux/firmware.h
include/linux/genhd.h
include/linux/gpio.h [new file with mode: 0644]
include/linux/hardirq.h
include/linux/iommu-helper.h
include/linux/kprobes.h
include/linux/kvm.h
include/linux/kvm_host.h
include/linux/marker.h
include/linux/memcontrol.h
include/linux/memstick.h
include/linux/mm_types.h
include/linux/netpoll.h
include/linux/nfs_fs.h
include/linux/pci.h
include/linux/pci_ids.h
include/linux/raid/bitmap.h
include/linux/raid/md_k.h
include/linux/rcuclassic.h
include/linux/rcupreempt.h
include/linux/sched.h
include/linux/security.h
include/linux/slab_def.h
include/linux/slub_def.h
include/linux/sm501-regs.h
include/linux/sm501.h
include/linux/tifm.h
include/linux/time.h
include/linux/timex.h
include/linux/usb.h
include/linux/usb/Kbuild
include/linux/usb/gadget.h
include/net/inet_sock.h
include/scsi/libsas.h
include/scsi/scsi_transport_iscsi.h
init/Kconfig
init/main.c
ipc/shm.c
kernel/Kconfig.preempt
kernel/audit.c
kernel/auditsc.c
kernel/cgroup.c
kernel/cpuset.c
kernel/exit.c
kernel/kprobes.c
kernel/marker.c
kernel/module.c
kernel/power/process.c
kernel/rcupreempt.c
kernel/res_counter.c
kernel/sched.c
kernel/sched_fair.c
kernel/sched_rt.c
kernel/signal.c
kernel/softirq.c
kernel/softlockup.c
kernel/sysctl.c
kernel/time/ntp.c
kernel/time/tick-sched.c
kernel/time/timekeeping.c
lib/iommu-helper.c
lib/kobject.c
mm/Makefile
mm/allocpercpu.c
mm/filemap.c
mm/hugetlb.c
mm/memcontrol.c
mm/memory.c
mm/mempolicy.c
mm/migrate.c
mm/oom_kill.c
mm/page_alloc.c
mm/rmap.c
mm/shmem.c
mm/slab.c
mm/slub.c
mm/swap.c
mm/truncate.c
mm/vmscan.c
net/bluetooth/l2cap.c
net/core/neighbour.c
net/core/netpoll.c
net/ipv4/Kconfig
net/ipv4/ipconfig.c
net/ipv4/tcp_bic.c
net/ipv4/tcp_input.c
net/ipv6/Kconfig
net/irda/ircomm/ircomm_core.c
net/irda/irlan/irlan_common.c
net/irda/irproc.c
net/iucv/iucv.c
net/mac80211/rc80211_pid_algo.c
net/sctp/proc.c
net/sunrpc/xprtrdma/transport.c
samples/Kconfig
samples/Makefile
samples/kprobes/Makefile [new file with mode: 0644]
samples/kprobes/jprobe_example.c [new file with mode: 0644]
samples/kprobes/kprobe_example.c [new file with mode: 0644]
samples/kprobes/kretprobe_example.c [new file with mode: 0644]
scripts/checkpatch.pl
security/dummy.c
security/security.c
security/selinux/hooks.c
security/selinux/include/security.h
security/smack/smack_lsm.c
sound/usb/usbaudio.c
virt/kvm/ioapic.c
virt/kvm/kvm_main.c

index 8363e48cdcdc67bad8834a08ec8dd57b8cb41635..fdcce40226d7d4273a08cc4ef84bb25755a710a4 100644 (file)
@@ -53,3 +53,5 @@ cscope.*
 
 *.orig
 *.rej
+*~
+\#*#
index 30b327a116eaa8d15af97c3047ab2c07ebc41089..042073f656e53e01daff332e1e9ee500ad99efc0 100644 (file)
@@ -183,8 +183,6 @@ i386/
        - directory with info about Linux on Intel 32 bit architecture.
 ia64/
        - directory with info about Linux on Intel 64 bit architecture.
-ide.txt
-       - important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
 infiniband/
        - directory with documents concerning Linux InfiniBand support.
 initrd.txt
index f31601e8bd89acba6eaef4d27c5bd45eb2928edf..dc0f30c3e5715d6801e482dc51988fe992d7bf82 100644 (file)
@@ -361,12 +361,14 @@ X!Edrivers/pnp/system.c
   <chapter id="blkdev">
      <title>Block Devices</title>
 !Eblock/blk-core.c
+!Iblock/blk-core.c
 !Eblock/blk-map.c
 !Iblock/blk-sysfs.c
 !Eblock/blk-settings.c
 !Eblock/blk-exec.c
 !Eblock/blk-barrier.c
 !Eblock/blk-tag.c
+!Iblock/blk-tag.c
   </chapter>
 
   <chapter id="chrdev">
index 29721bfcde129f98a0f35eb51b72582cf776e70c..91c0dcc6fa5ca92d29124951e83f7e8c8b4e3b32 100644 (file)
@@ -45,7 +45,7 @@ This driver provides the following features:
 ---------------
 
 0. The ide-cd relies on the ide disk driver.  See
-   Documentation/ide.txt for up-to-date information on the ide
+   Documentation/ide/ide.txt for up-to-date information on the ide
    driver.
 
 1. Make sure that the ide and ide-cd drivers are compiled into the
@@ -64,7 +64,7 @@ This driver provides the following features:
 
    Depending on what type of IDE interface you have, you may need to
    specify additional configuration options.  See
-   Documentation/ide.txt.
+   Documentation/ide/ide.txt.
 
 2. You should also ensure that the iso9660 filesystem is either
    compiled into the kernel or available as a loadable module.  You
@@ -84,7 +84,7 @@ This driver provides the following features:
    on the primary IDE interface are called `hda' and `hdb',
    respectively.  The drives on the secondary interface are called
    `hdc' and `hdd'.  (Interfaces at other locations get other letters
-   in the third position; see Documentation/ide.txt.)
+   in the third position; see Documentation/ide/ide.txt.)
 
    If you want your CDROM drive to be found automatically by the
    driver, you should make sure your IDE interface uses either the
@@ -93,7 +93,7 @@ This driver provides the following features:
    be jumpered as `master'.  (If for some reason you cannot configure
    your system in this manner, you can probably still use the driver.
    You may have to pass extra configuration information to the kernel
-   when you boot, however.  See Documentation/ide.txt for more
+   when you boot, however.  See Documentation/ide/ide.txt for more
    information.)
 
 4. Boot the system.  If the drive is recognized, you should see a
@@ -201,7 +201,7 @@ TEST
 This section discusses some common problems encountered when trying to
 use the driver, and some possible solutions.  Note that if you are
 experiencing problems, you should probably also review
-Documentation/ide.txt for current information about the underlying
+Documentation/ide/ide.txt for current information about the underlying
 IDE support code.  Some of these items apply only to earlier versions
 of the driver, but are mentioned here for completeness.
 
@@ -211,7 +211,7 @@ from the driver.
 a. Drive is not detected during booting.
 
    - Review the configuration instructions above and in
-     Documentation/ide.txt, and check how your hardware is
+     Documentation/ide/ide.txt, and check how your hardware is
      configured.
 
    - If your drive is the only device on an IDE interface, it should
@@ -219,7 +219,7 @@ a. Drive is not detected during booting.
 
    - If your IDE interface is not at the standard addresses of 0x170
      or 0x1f0, you'll need to explicitly inform the driver using a
-     lilo option.  See Documentation/ide.txt.  (This feature was
+     lilo option.  See Documentation/ide/ide.txt.  (This feature was
      added around kernel version 1.3.30.)
 
    - If the autoprobing is not finding your drive, you can tell the
@@ -245,7 +245,7 @@ a. Drive is not detected during booting.
      Support for some interfaces needing extra initialization is
      provided in later 1.3.x kernels.  You may need to turn on
      additional kernel configuration options to get them to work;
-     see Documentation/ide.txt.
+     see Documentation/ide/ide.txt.
 
      Even if support is not available for your interface, you may be
      able to get it to work with the following procedure.  First boot
@@ -299,7 +299,7 @@ c. System hangups.
     be worked around by specifying the `serialize' option when
     booting.  Recent kernels should be able to detect the need for
     this automatically in most cases, but the detection is not
-    foolproof.  See Documentation/ide.txt for more information
+    foolproof.  See Documentation/ide/ide.txt for more information
     about the `serialize' option and the CMD640B.
 
   - Note that many MS-DOS CDROM drivers will work with such buggy
index 6015347b41e2676378be5fc029444b35a2ae3664..866b9cd9a9590d6b6b8c3d577038e8d51234082b 100644 (file)
@@ -1,4 +1,8 @@
-Memory Controller
+Memory Resource Controller
+
+NOTE: The Memory Resource Controller has been generically been referred
+to as the memory controller in this document. Do not confuse memory controller
+used here with the memory controller that is used in hardware.
 
 Salient features
 
@@ -152,7 +156,7 @@ The memory controller uses the following hierarchy
 
 a. Enable CONFIG_CGROUPS
 b. Enable CONFIG_RESOURCE_COUNTERS
-c. Enable CONFIG_CGROUP_MEM_CONT
+c. Enable CONFIG_CGROUP_MEM_RES_CTLR
 
 1. Prepare the cgroups
 # mkdir -p /cgroups
@@ -164,7 +168,7 @@ c. Enable CONFIG_CGROUP_MEM_CONT
 
 Since now we're in the 0 cgroup,
 We can alter the memory limit:
-# echo -n 4M > /cgroups/0/memory.limit_in_bytes
+# echo 4M > /cgroups/0/memory.limit_in_bytes
 
 NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo,
 mega or gigabytes.
@@ -185,7 +189,7 @@ number of factors, such as rounding up to page boundaries or the total
 availability of memory on the system.  The user is required to re-read
 this file after a write to guarantee the value committed by the kernel.
 
-# echo -n 1 > memory.limit_in_bytes
+# echo 1 > memory.limit_in_bytes
 # cat memory.limit_in_bytes
 4096
 
@@ -197,7 +201,7 @@ caches, RSS and Active pages/Inactive pages are shown.
 
 The memory.force_empty gives an interface to drop *all* charges by force.
 
-# echo -n 1 > memory.force_empty
+# echo 1 > memory.force_empty
 
 will drop all charges in cgroup. Currently, this is maintained for test.
 
index ba899ff2a8f9b825b13808df694c6fe6c56642e0..c1d1fd0c299b9c1b175532c494e3aefb15dbe60c 100644 (file)
@@ -316,3 +316,15 @@ Why:       Largely unmaintained and almost entirely unused.  File system
        is largely pointless as without a lot of work only the most
        trivial of Solaris binaries can work with the emulation code.
 Who:   David S. Miller <davem@davemloft.net>
+
+---------------------------
+
+What:  init_mm export
+When:  2.6.26
+Why:   Not used in-tree. The current out-of-tree users used it to
+       work around problems in the CPA code which should be resolved
+       by now. One usecase was described to provide verification code
+       of the CPA operation. That's a good idea in general, but such
+       code / infrastructure should be in the kernel and not in some
+       out-of-tree driver.
+Who:   Thomas Gleixner <tglx@linutronix.de>
index 8da724e2a0ff795d450e8b0b7b61118d7bf604a6..54630095aa3c8f841c097e723eef518f660a30a7 100644 (file)
@@ -2,6 +2,9 @@ GPIO Interfaces
 
 This provides an overview of GPIO access conventions on Linux.
 
+These calls use the gpio_* naming prefix.  No other calls should use that
+prefix, or the related __gpio_* prefix.
+
 
 What is a GPIO?
 ===============
@@ -69,11 +72,13 @@ in this document, but drivers acting as clients to the GPIO interface must
 not care how it's implemented.)
 
 That said, if the convention is supported on their platform, drivers should
-use it when possible.  Platforms should declare GENERIC_GPIO support in
-Kconfig (boolean true), which multi-platform drivers can depend on when
-using the include file:
+use it when possible.  Platforms must declare GENERIC_GPIO support in their
+Kconfig (boolean true), and provide an <asm/gpio.h> file.  Drivers that can't
+work without standard GPIO calls should have Kconfig entries which depend
+on GENERIC_GPIO.  The GPIO calls are available, either as "real code" or as
+optimized-away stubs, when drivers use the include file:
 
-       #include <asm/gpio.h>
+       #include <linux/gpio.h>
 
 If you stick to this convention then it'll be easier for other developers to
 see what your code is doing, and help maintain it.
@@ -316,6 +321,9 @@ pulldowns integrated on some platforms.  Not all platforms support them,
 or support them in the same way; and any given board might use external
 pullups (or pulldowns) so that the on-chip ones should not be used.
 (When a circuit needs 5 kOhm, on-chip 100 kOhm resistors won't do.)
+Likewise drive strength (2 mA vs 20 mA) and voltage (1.8V vs 3.3V) is a
+platform-specific issue, as are models like (not) having a one-to-one
+correspondence between configurable pins and GPIOs.
 
 There are other system-specific mechanisms that are not specified here,
 like the aforementioned options for input de-glitching and wire-OR output.
diff --git a/Documentation/ide/00-INDEX b/Documentation/ide/00-INDEX
new file mode 100644 (file)
index 0000000..d6b7788
--- /dev/null
@@ -0,0 +1,12 @@
+00-INDEX
+       - this file
+ChangeLog.ide-cd.1994-2004
+       - ide-cd changelog
+ChangeLog.ide-floppy.1996-2002
+       - ide-floppy changelog
+ChangeLog.ide-tape.1995-2002
+       - ide-tape changelog
+ide-tape.txt
+       - info on the IDE ATAPI streaming tape driver
+ide.txt
+       - important info for users of ATA devices (IDE/EIDE disks and CD-ROMS).
similarity index 99%
rename from Documentation/ide.txt
rename to Documentation/ide/ide.txt
index bcd7cd1278efd285d456fe058d1774b5181d5a7b..e3b3425328b6185f611b2d926893f273720a88ed 100644 (file)
@@ -3,11 +3,11 @@
 
 ==============================================================================
 
-   
+
    The hdparm utility can be used to control various IDE features on a
    running system. It is packaged separately.  Please Look for it on popular
    linux FTP sites.
-   
+
 
 
 ***  IMPORTANT NOTICES:  BUGGY IDE CHIPSETS CAN CORRUPT DATA!!
@@ -51,7 +51,7 @@ Common pitfalls:
 
 ================================================================================
 
-This is the multiple IDE interface driver, as evolved from hd.c.  
+This is the multiple IDE interface driver, as evolved from hd.c.
 
 It supports up to 9 IDE interfaces per default, on one or more IRQs (usually
 14 & 15).  There can be up to two drives per interface, as per the ATA-6 spec.
@@ -215,17 +215,17 @@ Summary of ide driver parameters for kernel command line
 --------------------------------------------------------
 
  "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
+
  "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
 
  "hdx=noprobe"         : drive may be present, but do not probe for it
+
  "hdx=none"            : drive is NOT present, ignore cmos and do not probe
+
  "hdx=nowerr"          : ignore the WRERR_STAT bit on this drive
+
  "hdx=cdrom"           : drive is present, and is a cdrom drive
+
  "hdx=cyl,head,sect"   : disk drive is present, with specified geometry
 
  "hdx=remap"           : remap access of sector 0 to sector 1 (for EZDrive)
@@ -261,7 +261,7 @@ Summary of ide driver parameters for kernel command line
  "idex=base"           : probe for an interface at the addr specified,
                          where "base" is usually 0x1f0 or 0x170
                          and "ctl" is assumed to be "base"+0x206
-                         
+
  "idex=base,ctl"       : specify both base and ctl
 
  "idex=base,ctl,irq"   : specify base, ctl, and irq number
@@ -272,7 +272,7 @@ Summary of ide driver parameters for kernel command line
                          to take effect.
 
  "idex=four"           : four drives on idex and ide(x^1) share same ports
-                       
+
  "idex=reset"          : reset interface after probe
 
  "idex=ata66"          : informs the interface that it has an 80c cable
index 9a5b6658c65e0ee4a6b55df39da68d5836e9889b..533e67febf813a18d6af172ac40fcf7c9e0def88 100644 (file)
@@ -712,7 +712,7 @@ and is between 256 and 4096 characters. It is defined in the file
                        Format: <cyl>,<head>,<sect>
 
        hd?=            [HW] (E)IDE subsystem
-       hd?lun=         See Documentation/ide.txt.
+       hd?lun=         See Documentation/ide/ide.txt.
 
        highmem=nn[KMG] [KNL,BOOT] forces the highmem zone to have an exact
                        size of <nn>. This works even on boxes that have no
@@ -766,14 +766,14 @@ and is between 256 and 4096 characters. It is defined in the file
 
        ide=            [HW] (E)IDE subsystem
                        Format: ide=nodma or ide=doubler or ide=reverse
-                       See Documentation/ide.txt.
+                       See Documentation/ide/ide.txt.
 
        ide?=           [HW] (E)IDE subsystem
                        Format: ide?=noprobe or chipset specific parameters.
-                       See Documentation/ide.txt.
+                       See Documentation/ide/ide.txt.
 
        idebus=         [HW] (E)IDE subsystem - VLB/PCI bus speed
-                       See Documentation/ide.txt.
+                       See Documentation/ide/ide.txt.
 
        idle=           [X86]
                        Format: idle=poll or idle=mwait
index 83f515c2905a806d88276ea587da5d9ef5196c52..be89f393274fbd086a4f14b4e56bb82c0a29c76d 100644 (file)
@@ -192,7 +192,8 @@ code mapping.
 The Kprobes API includes a "register" function and an "unregister"
 function for each type of probe.  Here are terse, mini-man-page
 specifications for these functions and the associated probe handlers
-that you'll write.  See the latter half of this document for examples.
+that you'll write.  See the files in the samples/kprobes/ sub-directory
+for examples.
 
 4.1 register_kprobe
 
@@ -420,249 +421,15 @@ e. Watchpoint probes (which fire on data references).
 
 8. Kprobes Example
 
-Here's a sample kernel module showing the use of kprobes to dump a
-stack trace and selected i386 registers when do_fork() is called.
------ cut here -----
-/*kprobe_example.c*/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-#include <linux/sched.h>
-
-/*For each probe you need to allocate a kprobe structure*/
-static struct kprobe kp;
-
-/*kprobe pre_handler: called just before the probed instruction is executed*/
-int handler_pre(struct kprobe *p, struct pt_regs *regs)
-{
-       printk("pre_handler: p->addr=0x%p, eip=%lx, eflags=0x%lx\n",
-               p->addr, regs->eip, regs->eflags);
-       dump_stack();
-       return 0;
-}
-
-/*kprobe post_handler: called after the probed instruction is executed*/
-void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags)
-{
-       printk("post_handler: p->addr=0x%p, eflags=0x%lx\n",
-               p->addr, regs->eflags);
-}
-
-/* fault_handler: this is called if an exception is generated for any
- * instruction within the pre- or post-handler, or when Kprobes
- * single-steps the probed instruction.
- */
-int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
-{
-       printk("fault_handler: p->addr=0x%p, trap #%dn",
-               p->addr, trapnr);
-       /* Return 0 because we don't handle the fault. */
-       return 0;
-}
-
-static int __init kprobe_init(void)
-{
-       int ret;
-       kp.pre_handler = handler_pre;
-       kp.post_handler = handler_post;
-       kp.fault_handler = handler_fault;
-       kp.symbol_name = "do_fork";
-
-       ret = register_kprobe(&kp);
-       if (ret < 0) {
-               printk("register_kprobe failed, returned %d\n", ret);
-               return ret;
-       }
-       printk("kprobe registered\n");
-       return 0;
-}
-
-static void __exit kprobe_exit(void)
-{
-       unregister_kprobe(&kp);
-       printk("kprobe unregistered\n");
-}
-
-module_init(kprobe_init)
-module_exit(kprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-You can build the kernel module, kprobe-example.ko, using the following
-Makefile:
------ cut here -----
-obj-m := kprobe-example.o
-KDIR := /lib/modules/$(shell uname -r)/build
-PWD := $(shell pwd)
-default:
-       $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
-clean:
-       rm -f *.mod.c *.ko *.o
------ cut here -----
-
-$ make
-$ su -
-...
-# insmod kprobe-example.ko
-
-You will see the trace data in /var/log/messages and on the console
-whenever do_fork() is invoked to create a new process.
+See samples/kprobes/kprobe_example.c
 
 9. Jprobes Example
 
-Here's a sample kernel module showing the use of jprobes to dump
-the arguments of do_fork().
------ cut here -----
-/*jprobe-example.c */
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/fs.h>
-#include <linux/uio.h>
-#include <linux/kprobes.h>
-
-/*
- * Jumper probe for do_fork.
- * Mirror principle enables access to arguments of the probed routine
- * from the probe handler.
- */
-
-/* Proxy routine having the same arguments as actual do_fork() routine */
-long jdo_fork(unsigned long clone_flags, unsigned long stack_start,
-             struct pt_regs *regs, unsigned long stack_size,
-             int __user * parent_tidptr, int __user * child_tidptr)
-{
-       printk("jprobe: clone_flags=0x%lx, stack_size=0x%lx, regs=0x%p\n",
-              clone_flags, stack_size, regs);
-       /* Always end with a call to jprobe_return(). */
-       jprobe_return();
-       /*NOTREACHED*/
-       return 0;
-}
-
-static struct jprobe my_jprobe = {
-       .entry = jdo_fork
-};
-
-static int __init jprobe_init(void)
-{
-       int ret;
-       my_jprobe.kp.symbol_name = "do_fork";
-
-       if ((ret = register_jprobe(&my_jprobe)) <0) {
-               printk("register_jprobe failed, returned %d\n", ret);
-               return -1;
-       }
-       printk("Planted jprobe at %p, handler addr %p\n",
-              my_jprobe.kp.addr, my_jprobe.entry);
-       return 0;
-}
-
-static void __exit jprobe_exit(void)
-{
-       unregister_jprobe(&my_jprobe);
-       printk("jprobe unregistered\n");
-}
-
-module_init(jprobe_init)
-module_exit(jprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-Build and insert the kernel module as shown in the above kprobe
-example.  You will see the trace data in /var/log/messages and on
-the console whenever do_fork() is invoked to create a new process.
-(Some messages may be suppressed if syslogd is configured to
-eliminate duplicate messages.)
+See samples/kprobes/jprobe_example.c
 
 10. Kretprobes Example
 
-Here's a sample kernel module showing the use of return probes to
-report failed calls to sys_open().
------ cut here -----
-/*kretprobe-example.c*/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/kprobes.h>
-#include <linux/ktime.h>
-
-/* per-instance private data */
-struct my_data {
-       ktime_t entry_stamp;
-};
-
-static const char *probed_func = "sys_open";
-
-/* Timestamp function entry. */
-static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
-{
-       struct my_data *data;
-
-       if(!current->mm)
-               return 1; /* skip kernel threads */
-
-       data = (struct my_data *)ri->data;
-       data->entry_stamp = ktime_get();
-       return 0;
-}
-
-/* If the probed function failed, log the return value and duration.
- * Duration may turn out to be zero consistently, depending upon the
- * granularity of time accounting on the platform. */
-static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
-{
-       int retval = regs_return_value(regs);
-       struct my_data *data = (struct my_data *)ri->data;
-       s64 delta;
-       ktime_t now;
-
-       if (retval < 0) {
-               now = ktime_get();
-               delta = ktime_to_ns(ktime_sub(now, data->entry_stamp));
-               printk("%s: return val = %d (duration = %lld ns)\n",
-                      probed_func, retval, delta);
-       }
-       return 0;
-}
-
-static struct kretprobe my_kretprobe = {
-       .handler = return_handler,
-       .entry_handler = entry_handler,
-       .data_size = sizeof(struct my_data),
-       .maxactive = 20, /* probe up to 20 instances concurrently */
-};
-
-static int __init kretprobe_init(void)
-{
-       int ret;
-       my_kretprobe.kp.symbol_name = (char *)probed_func;
-
-       if ((ret = register_kretprobe(&my_kretprobe)) < 0) {
-               printk("register_kretprobe failed, returned %d\n", ret);
-               return -1;
-       }
-       printk("Kretprobe active on %s\n", my_kretprobe.kp.symbol_name);
-       return 0;
-}
-
-static void __exit kretprobe_exit(void)
-{
-       unregister_kretprobe(&my_kretprobe);
-       printk("kretprobe unregistered\n");
-       /* nmissed > 0 suggests that maxactive was set too low. */
-       printk("Missed probing %d instances of %s\n",
-              my_kretprobe.nmissed, probed_func);
-}
-
-module_init(kretprobe_init)
-module_exit(kretprobe_exit)
-MODULE_LICENSE("GPL");
------ cut here -----
-
-Build and insert the kernel module as shown in the above kprobe
-example.  You will see the trace data in /var/log/messages and on the
-console whenever sys_open() returns a negative value.  (Some messages
-may be suppressed if syslogd is configured to eliminate duplicate
-messages.)
+See samples/kprobes/kretprobe_example.c
 
 For additional information on Kprobes, refer to the following URLs:
 http://www-106.ibm.com/developerworks/library/l-kprobes.html?ca=dgr-lnxw42Kprobe
index 0f23d67f958ff5b6ee96a0248fdd2c9b9ab65586..bec5a32e4095d705ee16d6bd9a538b4fdaadfe52 100644 (file)
@@ -486,9 +486,12 @@ static void concat(char *dst, char *args[])
        unsigned int i, len = 0;
 
        for (i = 0; args[i]; i++) {
+               if (i) {
+                       strcat(dst+len, " ");
+                       len++;
+               }
                strcpy(dst+len, args[i]);
-               strcat(dst+len, " ");
-               len += strlen(args[i]) + 1;
+               len += strlen(args[i]);
        }
        /* In case it's empty. */
        dst[len] = '\0';
index 72b20c63959651ce7be7dad2f2e854c983f660e0..d2c2e6e2b224ce4bcb84d3870cddfba85cb3b979 100644 (file)
@@ -123,7 +123,8 @@ initialization with a pointer to a structure describing the driver
 
 
 The ID table is an array of struct pci_device_id entries ending with an
-all-zero entry.  Each entry consists of:
+all-zero entry; use of the macro DEFINE_PCI_DEVICE_TABLE is the preferred
+method of declaring the table.  Each entry consists of:
 
        vendor,device   Vendor and device ID to match (or PCI_ANY_ID)
 
@@ -191,7 +192,8 @@ Tips on when/where to use the above attributes:
 
        o Do not mark the struct pci_driver.
 
-       o The ID table array should be marked __devinitdata.
+       o The ID table array should be marked __devinitconst; this is done
+         automatically if the table is declared with DEFINE_PCI_DEVICE_TABLE().
 
        o The probe() and remove() functions should be marked __devinit
          and __devexit respectively.  All initialization functions
index 442e14d35dea272f6906d65723055b82d0566ef3..01e69404ee5e14bd4bb41cb4d81abb22a13ccc40 100644 (file)
@@ -142,7 +142,7 @@ of idleness (idle, busy, and newly idle):
 
 /proc/<pid>/schedstat
 ----------------
-schedstats also adds a new /proc/<pid/schedstat file to include some of
+schedstats also adds a new /proc/<pid>/schedstat file to include some of
 the same information on a per-process level.  There are three fields in
 this file correlating for that process to:
      1) time spent on the cpu
index de2bcacfa870a6f1e3bc94369fda343db1e8b4a7..038a3e6ecaa43d5c064061734ea7e893675893e9 100644 (file)
 **                                             8.replace pci_alloc_consistent()/pci_free_consistent() with kmalloc()/kfree() in arcmsr_iop_message_xfer()
 **                                             9. fix the release of dma memory for type B in arcmsr_free_ccb_pool()
 **                                             10.fix the arcmsr_polling_hbb_ccbdone()
+** 1.20.00.15  02/27/2008      Erich Chen & Nick Cheng
+**                                             1.arcmsr_iop_message_xfer() is called from atomic context under the
+**                                             queuecommand scsi_host_template handler. James Bottomley pointed out
+**                                             that the current GFP_KERNEL|GFP_DMA flags are wrong: firstly we are in
+**                                             atomic context, secondly this memory is not used for DMA.
+**                                             Also removed some unneeded casts. Thanks to Daniel Drake <dsd@gentoo.org>
 **************************************************************************
index a7408593829feb51c205f35b5647b961a8334a24..4273ca2b86bade2aa6c33b145bfa7035a61602db 100644 (file)
@@ -1,5 +1,5 @@
 usb-help.txt
-2000-July-12
+2008-Mar-7
 
 For USB help other than the readme files that are located in
 Documentation/usb/*, see the following:
@@ -10,9 +10,7 @@ Linux-USB project:  http://www.linux-usb.org
 Linux USB Guide:    http://linux-usb.sourceforge.net
 Linux-USB device overview (working devices and drivers):
                     http://www.qbik.ch/usb/devices/
-    
-The Linux-USB mailing lists are:
-  linux-usb-users@lists.sourceforge.net   for general user help
-  linux-usb-devel@lists.sourceforge.net   for developer discussions
+
+The Linux-USB mailing list is at linux-usb@vger.kernel.org
 
 ###
index dcf8bcf846d6a5486b737c840b4dce7d71ae89e2..7c13f22a0c9ee44aac54dd0c40ea65a828a545d9 100644 (file)
@@ -50,14 +50,14 @@ F.e. in order to boot just with sanity checks and red zoning one would specify:
 
 Trying to find an issue in the dentry cache? Try
 
-       slub_debug=,dentry_cache
+       slub_debug=,dentry
 
 to only enable debugging on the dentry cache.
 
 Red zoning and tracking may realign the slab.  We can just apply sanity checks
 to the dentry cache with
 
-       slub_debug=F,dentry_cache
+       slub_debug=F,dentry
 
 In case you forgot to enable debugging on the kernel command line: It is
 possible to enable debugging manually when the kernel is up. Look at the
index f229e16d67ed857e8d979ce5bef30ef66601fc7e..25f450fe1059602a3d38292964d4c4ca9a0d38c1 100644 (file)
@@ -1138,6 +1138,12 @@ L:       accessrunner-general@lists.sourceforge.net
 W:     http://accessrunner.sourceforge.net/
 S:     Maintained
 
+CONTROL GROUPS (CGROUPS)
+P:     Paul Menage
+M:     menage@google.com
+L:     containers@lists.linux-foundation.org
+S:     Maintained
+
 CORETEMP HARDWARE MONITORING DRIVER
 P:     Rudolf Marek
 M:     r.marek@assembler.cz
@@ -1589,6 +1595,13 @@ L:       linux-fbdev-devel@lists.sourceforge.net (moderated for non-subscribers)
 W:     http://linux-fbdev.sourceforge.net/
 S:     Maintained
 
+FREESCALE DMA DRIVER
+P;     Zhang Wei
+M:     wei.zhang@freescale.com
+L:     linuxppc-embedded@ozlabs.org
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 FREESCALE SOC FS_ENET DRIVER
 P:     Pantelis Antoniou
 M:     pantelis.antoniou@gmail.com
@@ -2626,6 +2639,17 @@ L:       linux-kernel@vger.kernel.org
 W:     http://www.linux-mm.org
 S:     Maintained
 
+MEMORY RESOURCE CONTROLLER
+P:     Balbir Singh
+M:     balbir@linux.vnet.ibm.com
+P:     Pavel Emelyanov
+M:     xemul@openvz.org
+P:     KAMEZAWA Hiroyuki
+M:     kamezawa.hiroyu@jp.fujitsu.com
+L:     linux-mm@kvack.org
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+
 MEI MN10300/AM33 PORT
 P:     David Howells
 M:     dhowells@redhat.com
index a22978413b6558793a9d605abf95cd65dd672699..0eb23e5bfc88cd30d6abec5c01d8f473a72a595a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 25
-EXTRAVERSION = -rc3
+EXTRAVERSION = -rc5
 NAME = Funky Weasel is Jiggy wit it
 
 # *DOCUMENTATION*
index 3d72dc3fc8f52f5d822cc6c256e21fb21e2b4f61..694c9af520bbed3e9a36a6c16aa693f541b192b8 100644 (file)
@@ -27,5 +27,12 @@ config KPROBES
          for kernel debugging, non-intrusive instrumentation and testing.
          If in doubt, say "N".
 
+config KRETPROBES
+       def_bool y
+       depends on KPROBES && HAVE_KRETPROBES
+
 config HAVE_KPROBES
        def_bool n
+
+config HAVE_KRETPROBES
+       def_bool n
index 26d3789dfdd0420bc4e7ce496995138b1decda14..e07a23fc5b74e3d966ac1fc0c070f03fef83ca57 100644 (file)
@@ -31,7 +31,6 @@
 #endif
 
 #define DEBUG_NODIRECT 0
-#define DEBUG_FORCEDAC 0
 
 #define ISA_DMA_MASK           0x00ffffff
 
@@ -126,39 +125,66 @@ iommu_arena_new(struct pci_controller *hose, dma_addr_t base,
        return iommu_arena_new_node(0, hose, base, window_size, align);
 }
 
+static inline int is_span_boundary(unsigned int index, unsigned int nr,
+                                  unsigned long shift,
+                                  unsigned long boundary_size)
+{
+       shift = (shift + index) & (boundary_size - 1);
+       return shift + nr > boundary_size;
+}
+
 /* Must be called with the arena lock held */
 static long
-iommu_arena_find_pages(struct pci_iommu_arena *arena, long n, long mask)
+iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
+                      long n, long mask)
 {
        unsigned long *ptes;
        long i, p, nent;
+       int pass = 0;
+       unsigned long base;
+       unsigned long boundary_size;
+
+       base = arena->dma_base >> PAGE_SHIFT;
+       if (dev) {
+               boundary_size = dma_get_seg_boundary(dev) + 1;
+               BUG_ON(!is_power_of_2(boundary_size));
+               boundary_size >>= PAGE_SHIFT;
+       } else {
+               boundary_size = 1UL << (32 - PAGE_SHIFT);
+       }
 
        /* Search forward for the first mask-aligned sequence of N free ptes */
        ptes = arena->ptes;
        nent = arena->size >> PAGE_SHIFT;
-       p = (arena->next_entry + mask) & ~mask;
+       p = ALIGN(arena->next_entry, mask + 1);
        i = 0;
+
+again:
        while (i < n && p+i < nent) {
+               if (!i && is_span_boundary(p, n, base, boundary_size)) {
+                       p = ALIGN(p + 1, mask + 1);
+                       goto again;
+               }
+
                if (ptes[p+i])
-                       p = (p + i + 1 + mask) & ~mask, i = 0;
+                       p = ALIGN(p + i + 1, mask + 1), i = 0;
                else
                        i = i + 1;
        }
 
        if (i < n) {
-                /* Reached the end.  Flush the TLB and restart the
-                   search from the beginning.  */
-               alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
-
-               p = 0, i = 0;
-               while (i < n && p+i < nent) {
-                       if (ptes[p+i])
-                               p = (p + i + 1 + mask) & ~mask, i = 0;
-                       else
-                               i = i + 1;
-               }
-
-               if (i < n)
+               if (pass < 1) {
+                       /*
+                        * Reached the end.  Flush the TLB and restart
+                        * the search from the beginning.
+                       */
+                       alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
+
+                       pass++;
+                       p = 0;
+                       i = 0;
+                       goto again;
+               } else
                        return -1;
        }
 
@@ -168,7 +194,8 @@ iommu_arena_find_pages(struct pci_iommu_arena *arena, long n, long mask)
 }
 
 static long
-iommu_arena_alloc(struct pci_iommu_arena *arena, long n, unsigned int align)
+iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n,
+                 unsigned int align)
 {
        unsigned long flags;
        unsigned long *ptes;
@@ -179,7 +206,7 @@ iommu_arena_alloc(struct pci_iommu_arena *arena, long n, unsigned int align)
        /* Search for N empty ptes */
        ptes = arena->ptes;
        mask = max(align, arena->align_entry) - 1;
-       p = iommu_arena_find_pages(arena, n, mask);
+       p = iommu_arena_find_pages(dev, arena, n, mask);
        if (p < 0) {
                spin_unlock_irqrestore(&arena->lock, flags);
                return -1;
@@ -229,6 +256,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,
        unsigned long paddr;
        dma_addr_t ret;
        unsigned int align = 0;
+       struct device *dev = pdev ? &pdev->dev : NULL;
 
        paddr = __pa(cpu_addr);
 
@@ -276,7 +304,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,
        /* Force allocation to 64KB boundary for ISA bridges. */
        if (pdev && pdev == isa_bridge)
                align = 8;
-       dma_ofs = iommu_arena_alloc(arena, npages, align);
+       dma_ofs = iommu_arena_alloc(dev, arena, npages, align);
        if (dma_ofs < 0) {
                printk(KERN_WARNING "pci_map_single failed: "
                       "could not allocate dma page tables\n");
@@ -563,7 +591,7 @@ sg_fill(struct device *dev, struct scatterlist *leader, struct scatterlist *end,
 
        paddr &= ~PAGE_MASK;
        npages = calc_npages(paddr + size);
-       dma_ofs = iommu_arena_alloc(arena, npages, 0);
+       dma_ofs = iommu_arena_alloc(dev, arena, npages, 0);
        if (dma_ofs < 0) {
                /* If we attempted a direct map above but failed, die.  */
                if (leader->dma_address == 0)
@@ -830,7 +858,7 @@ iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask)
 
        /* Search for N empty ptes.  */
        ptes = arena->ptes;
-       p = iommu_arena_find_pages(arena, pg_count, align_mask);
+       p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask);
        if (p < 0) {
                spin_unlock_irqrestore(&arena->lock, flags);
                return -1;
index 9619c43783ffd333ad8346aa6e9b85f0de750d7e..955fc53c1c019e1c47acf52251bdb30fa36cceb1 100644 (file)
@@ -12,6 +12,7 @@ config ARM
        select SYS_SUPPORTS_APM_EMULATION
        select HAVE_OPROFILE
        select HAVE_KPROBES if (!XIP_KERNEL)
+       select HAVE_KRETPROBES if (HAVE_KPROBES)
        help
          The ARM series is a line of low-power-consumption RISC chip designs
          licensed by ARM Ltd and targeted at embedded applications and
@@ -939,7 +940,8 @@ config KEXEC
 
 config ATAGS_PROC
        bool "Export atags in procfs"
-       default n
+       depends on KEXEC
+       default y
        help
          Should the atags used to boot the kernel be exported in an "atags"
          file in procfs. Useful with kexec.
index 939a3867f77c8696caa0a62a9b20bfea8f6038ec..4b21479332ae40c073c1f184b1980a502aca4c40 100644 (file)
@@ -43,7 +43,7 @@
 
 #ifdef DEBUG
 static unsigned int freq_debug;
-MODULE_PARM(freq_debug, "i");
+module_param(freq_debug, uint, 0);
 MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0");
 #else
 #define freq_debug  0
index 7cd9ef8deb02f28c9d81ab62cdac9603d4170929..35f25fdaeba3925303ed0dc1dacd4ed9f105c71a 100644 (file)
@@ -129,28 +129,20 @@ static void clk_pxa3xx_cken_enable(struct clk *clk)
 {
        unsigned long mask = 1ul << (clk->cken & 0x1f);
 
-       local_irq_disable();
-
        if (clk->cken < 32)
                CKENA |= mask;
        else
                CKENB |= mask;
-
-       local_irq_enable();
 }
 
 static void clk_pxa3xx_cken_disable(struct clk *clk)
 {
        unsigned long mask = 1ul << (clk->cken & 0x1f);
 
-       local_irq_disable();
-
        if (clk->cken < 32)
                CKENA &= ~mask;
        else
                CKENB &= ~mask;
-
-       local_irq_enable();
 }
 
 static const struct clkops clk_pxa3xx_cken_ops = {
index 7731d50dd86cfe00e2144ded09ca1caa1805d690..afd2cbfca0d91c993d94a8fd6400d73ff5807cf4 100644 (file)
@@ -58,7 +58,7 @@ static struct platform_device smc91x_device = {
        .resource       = smc91x_resources,
 };
 
-#if defined(CONFIG_FB_PXA) || (CONFIG_FB_PXA_MODULES)
+#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
 static void zylonite_backlight_power(int on)
 {
        gpio_set_value(gpio_backlight, on);
index 2728b0e7d2bbd9a165e3f031454b9b5f1f7fc8aa..3f6dc40b835321fd469a23ce8ffa49089377e74b 100644 (file)
@@ -120,6 +120,8 @@ full_search:
  */
 int valid_phys_addr_range(unsigned long addr, size_t size)
 {
+       if (addr < PHYS_OFFSET)
+               return 0;
        if (addr + size > __pa(high_memory))
                return 0;
 
index 500c9610ab3085094ec48d012610b4f557136ec1..e0f19ab91163e589562d7b070f29d673fc9ef33f 100644 (file)
@@ -75,7 +75,7 @@ no_pgd:
 void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd)
 {
        pmd_t *pmd;
-       struct page *pte;
+       pgtable_t pte;
 
        if (!pgd)
                return;
@@ -90,10 +90,8 @@ void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd)
                goto free;
        }
 
-       pte = pmd_page(*pmd);
+       pte = pmd_pgtable(*pmd);
        pmd_clear(pmd);
-       dec_zone_page_state(virt_to_page((unsigned long *)pgd), NR_PAGETABLE);
-       pte_lock_deinit(pte);
        pte_free(mm, pte);
        pmd_free(mm, pmd);
 free:
index 90262691b11a299993108608e0ad63d19feb0a63..5ed47228a39075a284e99801d7c79165f6b7367f 100644 (file)
@@ -101,9 +101,9 @@ ENDPROC (_atomic_ior32)
 
 .align 16
        /*
-        * Atomic ior, 32 bit.
+        * Atomic and, 32 bit.
         * Inputs:      P0: memory address to use
-        *              R0: value to ior
+        *              R0: value to and
         * Outputs:     R0: new contents of the memory address.
         *              R1: previous contents of the memory address.
         */
@@ -112,13 +112,13 @@ ENTRY(_atomic_and32)
        R0 = R1 & R0;
        [P0] = R0;
        rts;
-ENDPROC (_atomic_ior32)
+ENDPROC (_atomic_and32)
 
 .align 16
        /*
-        * Atomic ior, 32 bit.
+        * Atomic xor, 32 bit.
         * Inputs:      P0: memory address to use
-        *              R0: value to ior
+        *              R0: value to xor
         * Outputs:     R0: new contents of the memory address.
         *              R1: previous contents of the memory address.
         */
@@ -127,7 +127,7 @@ ENTRY(_atomic_xor32)
        R0 = R1 ^ R0;
        [P0] = R0;
        rts;
-ENDPROC (_atomic_ior32)
+ENDPROC (_atomic_xor32)
 
 .align 16
        /*
index a0950c1fd80027a0917336be24b35d202dbbdcb4..40846aa034c4a7d6bb659c47b92dc3d19d3590f1 100644 (file)
@@ -323,7 +323,7 @@ static struct platform_device bf5xx_nand_device = {
 };
 #endif
 
-#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN)
+#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE)
 static struct platform_device bf54x_sdh_device = {
        .name = "bfin-sdh",
        .id = 0,
@@ -636,7 +636,7 @@ static struct platform_device *ezkit_devices[] __initdata = {
        &bf5xx_nand_device,
 #endif
 
-#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN)
+#if defined(CONFIG_SDH_BFIN) || defined(CONFIG_SDH_BFIN_MODULE)
        &bf54x_sdh_device,
 #endif
 
index 2cbb7a0bc38efe28ca027876cb9ccd24c32950ed..cee54cebbc6592505e0ff2046a7cc94d2b792c15 100644 (file)
@@ -1369,7 +1369,7 @@ ENTRY(_sys_call_table)
        .long _sys_epoll_pwait
        .long _sys_utimensat
        .long _sys_signalfd
-       .long _sys_ni_syscall
+       .long _sys_timerfd_create
        .long _sys_eventfd      /* 350 */
        .long _sys_pread64
        .long _sys_pwrite64
@@ -1378,6 +1378,9 @@ ENTRY(_sys_call_table)
        .long _sys_get_robust_list      /* 355 */
        .long _sys_fallocate
        .long _sys_semtimedop
+       .long _sys_timerfd_settime
+       .long _sys_timerfd_gettime
+
        .rept NR_syscalls-(.-_sys_call_table)/4
        .long _sys_ni_syscall
        .endr
index 9310a7b476e95cf6353180de4e88bc8ba4f9f592..525483f0ddf89f3ec0fe0d14136710f86bbd9d6c 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/swap.h>
 #include <linux/sched.h>
 #include <linux/init.h>
-#include <linux/vmstat.h>
+#include <linux/mm.h>
 #include <asm/arch/svinto.h>
 #include <asm/types.h>
 #include <asm/signal.h>
index 7161a2bef4fe341e694780106ced3cccac5421c3..c7bd6ebdc93c0b18aa6d2e9efe213f02d01ad98c 100644 (file)
@@ -1,55 +1,59 @@
-/*#************************************************************************#*/
-/*#-------------------------------------------------------------------------*/
-/*#                                                                         */
-/*# FUNCTION NAME: memcpy()                                                 */
-/*#                                                                         */
-/*# PARAMETERS:  void* dst;   Destination address.                          */
-/*#              void* src;   Source address.                               */
-/*#              int   len;   Number of bytes to copy.                      */
-/*#                                                                         */
-/*# RETURNS:     dst.                                                       */
-/*#                                                                         */
-/*# DESCRIPTION: Copies len bytes of memory from src to dst.  No guarantees */
-/*#              about copying of overlapping memory areas. This routine is */
-/*#              very sensitive to compiler changes in register allocation. */
-/*#              Should really be rewritten to avoid this problem.          */
-/*#                                                                         */
-/*#-------------------------------------------------------------------------*/
-/*#                                                                         */
-/*# HISTORY                                                                 */
-/*#                                                                         */
-/*# DATE      NAME            CHANGES                                       */
-/*# ----      ----            -------                                       */
-/*# 941007    Kenny R         Creation                                      */
-/*# 941011    Kenny R         Lots of optimizations and inlining.           */
-/*# 941129    Ulf A           Adapted for use in libc.                      */
-/*# 950216    HP              N==0 forgotten if non-aligned src/dst.        */
-/*#                           Added some optimizations.                     */
-/*# 001025    HP              Make src and dst char *.  Align dst to       */
-/*#                          dword, not just word-if-both-src-and-dst-     */
-/*#                          are-misaligned.                               */
-/*#                                                                         */
-/*#-------------------------------------------------------------------------*/
-
-#include <linux/types.h>
-
-void *memcpy(void *pdst,
-             const void *psrc,
-             size_t pn)
+/* A memcpy for CRIS.
+   Copyright (C) 1994-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* FIXME: This file should really only be used for reference, as the
+   result is somewhat depending on gcc generating what we expect rather
+   than what we describe.  An assembly file should be used instead.  */
+
+#include <stddef.h>
+
+/* Break even between movem and move16 is really at 38.7 * 2, but
+   modulo 44, so up to the next multiple of 44, we use ordinary code.  */
+#define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2)
+
+/* No name ambiguities in this file.  */
+__asm__ (".syntax no_register_prefix");
+
+void *
+memcpy(void *pdst, const void *psrc, size_t pn)
 {
-  /* Ok.  Now we want the parameters put in special registers.
+  /* Now we want the parameters put in special registers.
      Make sure the compiler is able to make something useful of this.
-      As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
+     As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
 
-     If gcc was alright, it really would need no temporaries, and no
-     stack space to save stuff on. */
+     If gcc was allright, it really would need no temporaries, and no
+     stack space to save stuff on.  */
 
   register void *return_dst __asm__ ("r10") = pdst;
-  register char *dst __asm__ ("r13") = pdst;
-  register const char *src __asm__ ("r11") = psrc;
+  register unsigned char *dst __asm__ ("r13") = pdst;
+  register unsigned const char *src __asm__ ("r11") = psrc;
   register int n __asm__ ("r12") = pn;
-  
+
   /* When src is aligned but not dst, this makes a few extra needless
      cycles.  I believe it would take as many to check that the
      re-alignment was unnecessary.  */
@@ -59,167 +63,174 @@ void *memcpy(void *pdst,
       && n >= 3)
   {
     if ((unsigned long) dst & 1)
-    {
-      n--;
-      *(char*)dst = *(char*)src;
-      src++;
-      dst++;
-    }
+      {
+       n--;
+       *dst = *src;
+       src++;
+       dst++;
+      }
 
     if ((unsigned long) dst & 2)
-    {
-      n -= 2;
-      *(short*)dst = *(short*)src;
-      src += 2;
-      dst += 2;
-    }
+      {
+       n -= 2;
+       *(short *) dst = *(short *) src;
+       src += 2;
+       dst += 2;
+      }
   }
 
-  /* Decide which copying method to use. */
-  if (n >= 44*2)                /* Break even between movem and
-                                   move16 is at 38.7*2, but modulo 44. */
-  {
-    /* For large copies we use 'movem' */
-
-  /* It is not optimal to tell the compiler about clobbering any
-     registers; that will move the saving/restoring of those registers
-     to the function prologue/epilogue, and make non-movem sizes
-     suboptimal.
-
-      This method is not foolproof; it assumes that the "asm reg"
-     declarations at the beginning of the function really are used
-     here (beware: they may be moved to temporary registers).
-      This way, we do not have to save/move the registers around into
-     temporaries; we can safely use them straight away.
-
-      If you want to check that the allocation was right; then
-      check the equalities in the first comment.  It should say
-      "r13=r13, r11=r11, r12=r12" */
-    __asm__ volatile ("\n\
-       ;; Check that the following is true (same register names on     \n\
-       ;; both sides of equal sign, as in r8=r8):                      \n\
-       ;; %0=r13, %1=r11, %2=r12                                       \n\
-       ;;                                                              \n\
-       ;; Save the registers we'll use in the movem process            \n\
-       ;; on the stack.                                                \n\
-       subq    11*4,$sp                                                \n\
-       movem   $r10,[$sp]                                              \n\
+  /* Decide which copying method to use.  */
+  if (n >= MEMCPY_BY_BLOCK_THRESHOLD)
+    {
+      /* It is not optimal to tell the compiler about clobbering any
+        registers; that will move the saving/restoring of those registers
+        to the function prologue/epilogue, and make non-movem sizes
+        suboptimal.  */
+      __asm__ volatile
+       ("\
+        ;; GCC does promise correct register allocations, but let's    \n\
+        ;; make sure it keeps its promises.                            \n\
+        .ifnc %0-%1-%2,$r13-$r11-$r12                                  \n\
+        .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\"       \n\
+        .endif                                                         \n\
+                                                                       \n\
+        ;; Save the registers we'll use in the movem process           \n\
+        ;; on the stack.                                               \n\
+        subq   11*4,sp                                                 \n\
+        movem  r10,[sp]                                                \n\
                                                                        \n\
-       ;; Now we've got this:                                          \n\
-       ;; r11 - src                                                    \n\
-       ;; r13 - dst                                                    \n\
-       ;; r12 - n                                                      \n\
+        ;; Now we've got this:                                         \n\
+        ;; r11 - src                                                   \n\
+        ;; r13 - dst                                                   \n\
+        ;; r12 - n                                                     \n\
                                                                        \n\
-       ;; Update n for the first loop                                  \n\
-       subq    44,$r12                                                 \n\
+        ;; Update n for the first loop.                                \n\
+        subq    44,r12                                                 \n\
 0:                                                                     \n\
-       movem   [$r11+],$r10                                            \n\
-       subq    44,$r12                                                 \n\
-       bge     0b                                                      \n\
-       movem   $r10,[$r13+]                                            \n\
+"
+#ifdef __arch_common_v10_v32
+        /* Cater to branch offset difference between v32 and v10.  We
+           assume the branch below has an 8-bit offset.  */
+"       setf\n"
+#endif
+"       movem  [r11+],r10                                              \n\
+        subq   44,r12                                                  \n\
+        bge     0b                                                     \n\
+        movem  r10,[r13+]                                              \n\
                                                                        \n\
-       addq    44,$r12 ;; compensate for last loop underflowing n      \n\
+        ;; Compensate for last loop underflowing n.                    \n\
+        addq   44,r12                                                  \n\
                                                                        \n\
-       ;; Restore registers from stack                                 \n\
-       movem   [$sp+],$r10"
+        ;; Restore registers from stack.                               \n\
+        movem [sp+],r10"
 
-     /* Outputs */ : "=r" (dst), "=r" (src), "=r" (n) 
-     /* Inputs */ : "0" (dst), "1" (src), "2" (n));
-    
-  }
+        /* Outputs.  */
+        : "=r" (dst), "=r" (src), "=r" (n)
 
-  /* Either we directly starts copying, using dword copying
-     in a loop, or we copy as much as possible with 'movem' 
-     and then the last block (<44 bytes) is copied here.
-     This will work since 'movem' will have updated src,dst,n. */
+        /* Inputs.  */
+        : "0" (dst), "1" (src), "2" (n));
+    }
 
-  while ( n >= 16 )
-  {
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    n -= 16;
-  }
+  while (n >= 16)
+    {
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+
+      n -= 16;
+    }
 
-  /* A switch() is definitely the fastest although it takes a LOT of code.
-   * Particularly if you inline code this.
-   */
   switch (n)
-  {
+    {
     case 0:
       break;
+
     case 1:
-      *(char*)dst = *(char*)src;
+      *dst = *src;
       break;
+
     case 2:
-      *(short*)dst = *(short*)src;
+      *(short *) dst = *(short *) src;
       break;
+
     case 3:
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 4:
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src;
       break;
+
     case 5:
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 6:
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 7:
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 8:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
       break;
+
     case 9:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 10:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 11:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 12:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
       break;
+
     case 13:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 14:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 15:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
-  }
+    }
 
-  return return_dst; /* destination pointer. */
-} /* memcpy() */
+  return return_dst;
+}
index b8e6c0430e5b8832b6c9a5314c4f21a371405e57..b0a608da7bd13d5eff6f2e925153dbd7c47eadb0 100644 (file)
@@ -193,7 +193,7 @@ __copy_user (void __user *pdst, const void *psrc, unsigned long pn)
    inaccessible.  */
 
 unsigned long
-__copy_user_zeroing (void __user *pdst, const void *psrc, unsigned long pn)
+__copy_user_zeroing(void *pdst, const void __user *psrc, unsigned long pn)
 {
   /* We want the parameters put in special registers.
      Make sure the compiler is able to make something useful of this.
index 6740b2cebae5169d05a09d69ad5f99851394d8bc..c7bd6ebdc93c0b18aa6d2e9efe213f02d01ad98c 100644 (file)
@@ -1,55 +1,59 @@
-/*#************************************************************************#*/
-/*#-------------------------------------------------------------------------*/
-/*#                                                                         */
-/*# FUNCTION NAME: memcpy()                                                 */
-/*#                                                                         */
-/*# PARAMETERS:  void* dst;   Destination address.                          */
-/*#              void* src;   Source address.                               */
-/*#              int   len;   Number of bytes to copy.                      */
-/*#                                                                         */
-/*# RETURNS:     dst.                                                       */
-/*#                                                                         */
-/*# DESCRIPTION: Copies len bytes of memory from src to dst.  No guarantees */
-/*#              about copying of overlapping memory areas. This routine is */
-/*#              very sensitive to compiler changes in register allocation. */
-/*#              Should really be rewritten to avoid this problem.          */
-/*#                                                                         */
-/*#-------------------------------------------------------------------------*/
-/*#                                                                         */
-/*# HISTORY                                                                 */
-/*#                                                                         */
-/*# DATE      NAME            CHANGES                                       */
-/*# ----      ----            -------                                       */
-/*# 941007    Kenny R         Creation                                      */
-/*# 941011    Kenny R         Lots of optimizations and inlining.           */
-/*# 941129    Ulf A           Adapted for use in libc.                      */
-/*# 950216    HP              N==0 forgotten if non-aligned src/dst.        */
-/*#                           Added some optimizations.                     */
-/*# 001025    HP              Make src and dst char *.  Align dst to       */
-/*#                          dword, not just word-if-both-src-and-dst-     */
-/*#                          are-misaligned.                               */
-/*#                                                                         */
-/*#-------------------------------------------------------------------------*/
-
-#include <linux/types.h>
-
-void *memcpy(void *pdst,
-             const void *psrc,
-             size_t pn)
+/* A memcpy for CRIS.
+   Copyright (C) 1994-2005 Axis Communications.
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+   1. Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+   2. Neither the name of Axis Communications nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+   THIS SOFTWARE IS PROVIDED BY AXIS COMMUNICATIONS AND ITS CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL AXIS
+   COMMUNICATIONS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+   INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+   IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.  */
+
+/* FIXME: This file should really only be used for reference, as the
+   result is somewhat depending on gcc generating what we expect rather
+   than what we describe.  An assembly file should be used instead.  */
+
+#include <stddef.h>
+
+/* Break even between movem and move16 is really at 38.7 * 2, but
+   modulo 44, so up to the next multiple of 44, we use ordinary code.  */
+#define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2)
+
+/* No name ambiguities in this file.  */
+__asm__ (".syntax no_register_prefix");
+
+void *
+memcpy(void *pdst, const void *psrc, size_t pn)
 {
-  /* Ok.  Now we want the parameters put in special registers.
+  /* Now we want the parameters put in special registers.
      Make sure the compiler is able to make something useful of this.
-      As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
+     As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
 
-     If gcc was alright, it really would need no temporaries, and no
-     stack space to save stuff on. */
+     If gcc was allright, it really would need no temporaries, and no
+     stack space to save stuff on.  */
 
   register void *return_dst __asm__ ("r10") = pdst;
-  register char *dst __asm__ ("r13") = pdst;
-  register const char *src __asm__ ("r11") = psrc;
+  register unsigned char *dst __asm__ ("r13") = pdst;
+  register unsigned const char *src __asm__ ("r11") = psrc;
   register int n __asm__ ("r12") = pn;
 
-
   /* When src is aligned but not dst, this makes a few extra needless
      cycles.  I believe it would take as many to check that the
      re-alignment was unnecessary.  */
@@ -59,161 +63,174 @@ void *memcpy(void *pdst,
       && n >= 3)
   {
     if ((unsigned long) dst & 1)
-    {
-      n--;
-      *(char*)dst = *(char*)src;
-      src++;
-      dst++;
-    }
+      {
+       n--;
+       *dst = *src;
+       src++;
+       dst++;
+      }
 
     if ((unsigned long) dst & 2)
-    {
-      n -= 2;
-      *(short*)dst = *(short*)src;
-      src += 2;
-      dst += 2;
-    }
+      {
+       n -= 2;
+       *(short *) dst = *(short *) src;
+       src += 2;
+       dst += 2;
+      }
   }
 
-  /* Decide which copying method to use.  Movem is dirt cheap, so the
-     overheap is low enough to always use the minimum block size as the
-     threshold.  */
-  if (n >= 44)
-  {
-    /* For large copies we use 'movem' */
-
-  /* It is not optimal to tell the compiler about clobbering any
-     registers; that will move the saving/restoring of those registers
-     to the function prologue/epilogue, and make non-movem sizes
-     suboptimal.  */
-    __asm__ volatile ("                                                        \n\
-        ;; Check that the register asm declaration got right.          \n\
-        ;; The GCC manual explicitly says TRT will happen.             \n\
-       .ifnc %0-%1-%2,$r13-$r11-$r12                                   \n\
-       .err                                                            \n\
-       .endif                                                          \n\
-                                                                       \n\
-       ;; Save the registers we'll use in the movem process            \n\
+  /* Decide which copying method to use.  */
+  if (n >= MEMCPY_BY_BLOCK_THRESHOLD)
+    {
+      /* It is not optimal to tell the compiler about clobbering any
+        registers; that will move the saving/restoring of those registers
+        to the function prologue/epilogue, and make non-movem sizes
+        suboptimal.  */
+      __asm__ volatile
+       ("\
+        ;; GCC does promise correct register allocations, but let's    \n\
+        ;; make sure it keeps its promises.                            \n\
+        .ifnc %0-%1-%2,$r13-$r11-$r12                                  \n\
+        .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\"       \n\
+        .endif                                                         \n\
                                                                        \n\
-       ;; on the stack.                                                \n\
-       subq    11*4,$sp                                                \n\
-       movem   $r10,[$sp]                                              \n\
+        ;; Save the registers we'll use in the movem process           \n\
+        ;; on the stack.                                               \n\
+        subq   11*4,sp                                                 \n\
+        movem  r10,[sp]                                                \n\
                                                                        \n\
-        ;; Now we've got this:                                         \n\
-       ;; r11 - src                                                    \n\
-       ;; r13 - dst                                                    \n\
-       ;; r12 - n                                                      \n\
+        ;; Now we've got this:                                         \n\
+        ;; r11 - src                                                   \n\
+        ;; r13 - dst                                                   \n\
+        ;; r12 - n                                                     \n\
                                                                        \n\
-        ;; Update n for the first loop                                 \n\
-        subq    44,$r12                                                        \n\
+        ;; Update n for the first loop.                                \n\
+        subq    44,r12                                                 \n\
 0:                                                                     \n\
-       movem   [$r11+],$r10                                            \n\
-        subq   44,$r12                                                 \n\
-        bge     0b                                                     \n\
-       movem   $r10,[$r13+]                                            \n\
+"
+#ifdef __arch_common_v10_v32
+        /* Cater to branch offset difference between v32 and v10.  We
+           assume the branch below has an 8-bit offset.  */
+"       setf\n"
+#endif
+"       movem  [r11+],r10                                              \n\
+        subq   44,r12                                                  \n\
+        bge     0b                                                     \n\
+        movem  r10,[r13+]                                              \n\
                                                                        \n\
-        addq   44,$r12  ;; compensate for last loop underflowing n     \n\
+        ;; Compensate for last loop underflowing n.                    \n\
+        addq   44,r12                                                  \n\
                                                                        \n\
-       ;; Restore registers from stack                                 \n\
-        movem [$sp+],$r10"
+        ;; Restore registers from stack.                               \n\
+        movem [sp+],r10"
 
-     /* Outputs */ : "=r" (dst), "=r" (src), "=r" (n)
-     /* Inputs */ : "0" (dst), "1" (src), "2" (n));
+        /* Outputs.  */
+        : "=r" (dst), "=r" (src), "=r" (n)
 
-  }
+        /* Inputs.  */
+        : "0" (dst), "1" (src), "2" (n));
+    }
 
-  /* Either we directly starts copying, using dword copying
-     in a loop, or we copy as much as possible with 'movem'
-     and then the last block (<44 bytes) is copied here.
-     This will work since 'movem' will have updated src,dst,n. */
+  while (n >= 16)
+    {
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
 
-  while ( n >= 16 )
-  {
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    *((long*)dst)++ = *((long*)src)++;
-    n -= 16;
-  }
+      n -= 16;
+    }
 
-  /* A switch() is definitely the fastest although it takes a LOT of code.
-   * Particularly if you inline code this.
-   */
   switch (n)
-  {
+    {
     case 0:
       break;
+
     case 1:
-      *(char*)dst = *(char*)src;
+      *dst = *src;
       break;
+
     case 2:
-      *(short*)dst = *(short*)src;
+      *(short *) dst = *(short *) src;
       break;
+
     case 3:
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 4:
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src;
       break;
+
     case 5:
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 6:
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 7:
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 8:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
       break;
+
     case 9:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 10:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 11:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
+
     case 12:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src;
       break;
+
     case 13:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *dst = *src;
       break;
+
     case 14:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *(short*)dst = *(short*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src;
       break;
+
     case 15:
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((long*)dst)++ = *((long*)src)++;
-      *((short*)dst)++ = *((short*)src)++;
-      *(char*)dst = *(char*)src;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(long *) dst = *(long *) src; dst += 4; src += 4;
+      *(short *) dst = *(short *) src; dst += 2; src += 2;
+      *dst = *src;
       break;
-  }
+    }
 
-  return return_dst; /* destination pointer. */
-} /* memcpy() */
+  return return_dst;
+}
index 04d0cf35a2761b531c1350c58ecf36e081961fb7..0b5b70d5f58a45ca2554daf64ccb4625c1ff725f 100644 (file)
@@ -161,7 +161,7 @@ __copy_user (void __user *pdst, const void *psrc, unsigned long pn)
    inaccessible.  */
 
 unsigned long
-__copy_user_zeroing (void __user *pdst, const void *psrc, unsigned long pn)
+__copy_user_zeroing(void *pdst, const void __user *psrc, unsigned long pn)
 {
   /* We want the parameters put in special registers.
      Make sure the compiler is able to make something useful of this.
index dff9edfc7465e9954bc5b16749eaa0068e88671a..8fa3faf5ef1bb0e91c32b54c6c5b7d197c920b79 100644 (file)
@@ -18,6 +18,7 @@ config IA64
        select HAVE_IDE
        select HAVE_OPROFILE
        select HAVE_KPROBES
+       select HAVE_KRETPROBES
        default y
        help
          The Itanium Processor Family is Intel's 64-bit successor to
@@ -155,6 +156,8 @@ config IA64_HP_ZX1_SWIOTLB
 
 config IA64_SGI_SN2
        bool "SGI-SN2"
+       select NUMA
+       select ACPI_NUMA
        help
          Selecting this option will optimize the kernel for use on sn2 based
          systems, but the resulting kernel binary will not run on other
index b916ccfdef843f158f1814cc74d278d389dcec70..f1645c4f70393c5294ecc9148300c8368178d5f5 100644 (file)
@@ -11,6 +11,8 @@
 # Copyright (C) 1998-2004 by David Mosberger-Tang <davidm@hpl.hp.com>
 #
 
+KBUILD_DEFCONFIG := generic_defconfig
+
 NM := $(CROSS_COMPILE)nm -B
 READELF := $(CROSS_COMPILE)readelf
 
index 94e57109fad658d060542aea2ed9f51bd1d230db..8f6bcfe1dadaa0fab0ec16fd2734ddf87d916450 100644 (file)
@@ -71,7 +71,7 @@ hwsw_init (void)
 #ifdef CONFIG_IA64_GENERIC
                /* Better to have normal DMA than panic */
                printk(KERN_WARNING "%s: Failed to initialize software I/O TLB,"
-                      " reverting to hpzx1 platform vector\n", __FUNCTION__);
+                      " reverting to hpzx1 platform vector\n", __func__);
                machvec_init("hpzx1");
 #else
                panic("Unable to initialize software I/O TLB services");
index a94445422cc65d895eb76e4a417897bf067556d9..523eae6d3e49f1177a20c0d72ad8d3d8d4461a14 100644 (file)
@@ -529,7 +529,7 @@ sba_search_bitmap(struct ioc *ioc, unsigned long bits_wanted, int use_hint)
                base_mask = RESMAP_MASK(bits_wanted);
                mask = base_mask << bitshiftcnt;
 
-               DBG_RES("%s() o %ld %p", __FUNCTION__, o, res_ptr);
+               DBG_RES("%s() o %ld %p", __func__, o, res_ptr);
                for(; res_ptr < res_end ; res_ptr++)
                { 
                        DBG_RES("    %p %lx %lx\n", res_ptr, mask, *res_ptr);
@@ -679,7 +679,7 @@ sba_alloc_range(struct ioc *ioc, size_t size)
 #endif
 
        DBG_RES("%s(%x) %d -> %lx hint %x/%x\n",
-               __FUNCTION__, size, pages_needed, pide,
+               __func__, size, pages_needed, pide,
                (uint) ((unsigned long) ioc->res_hint - (unsigned long) ioc->res_map),
                ioc->res_bitshift );
 
@@ -722,8 +722,8 @@ sba_free_range(struct ioc *ioc, dma_addr_t iova, size_t size)
                        m = RESMAP_MASK(bits_not_wanted) << (pide & (BITS_PER_LONG - 1));
                        bits_not_wanted = 0;
 
-                       DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __FUNCTION__, (uint) iova, size,
-                               bits_not_wanted, m, pide, res_ptr, *res_ptr);
+                       DBG_RES("%s( ,%x,%x) %x/%lx %x %p %lx\n", __func__, (uint) iova, size,
+                               bits_not_wanted, m, pide, res_ptr, *res_ptr);
 
                        ASSERT(m != 0);
                        ASSERT(bits_not_wanted);
@@ -940,8 +940,7 @@ sba_map_single(struct device *dev, void *addr, size_t size, int dir)
 
        iovp = (dma_addr_t) pide << iovp_shift;
 
-       DBG_RUN("%s() 0x%p -> 0x%lx\n",
-               __FUNCTION__, addr, (long) iovp | offset);
+       DBG_RUN("%s() 0x%p -> 0x%lx\n", __func__, addr, (long) iovp | offset);
 
        pdir_start = &(ioc->pdir_base[pide]);
 
@@ -1029,8 +1028,7 @@ void sba_unmap_single(struct device *dev, dma_addr_t iova, size_t size, int dir)
 #endif
        offset = iova & ~iovp_mask;
 
-       DBG_RUN("%s() iovp 0x%lx/%x\n",
-               __FUNCTION__, (long) iova, size);
+       DBG_RUN("%s() iovp 0x%lx/%x\n", __func__, (long) iova, size);
 
        iova ^= offset;        /* clear offset bits */
        size += offset;
@@ -1404,7 +1402,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
        struct scatterlist *sg;
 #endif
 
-       DBG_RUN_SG("%s() START %d entries\n", __FUNCTION__, nents);
+       DBG_RUN_SG("%s() START %d entries\n", __func__, nents);
        ioc = GET_IOC(dev);
        ASSERT(ioc);
 
@@ -1468,7 +1466,7 @@ int sba_map_sg(struct device *dev, struct scatterlist *sglist, int nents, int di
 #endif
 
        ASSERT(coalesced == filled);
-       DBG_RUN_SG("%s() DONE %d mappings\n", __FUNCTION__, filled);
+       DBG_RUN_SG("%s() DONE %d mappings\n", __func__, filled);
 
        return filled;
 }
@@ -1491,7 +1489,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
 #endif
 
        DBG_RUN_SG("%s() START %d entries,  %p,%x\n",
-               __FUNCTION__, nents, sba_sg_address(sglist), sglist->length);
+                  __func__, nents, sba_sg_address(sglist), sglist->length);
 
 #ifdef ASSERT_PDIR_SANITY
        ioc = GET_IOC(dev);
@@ -1509,7 +1507,7 @@ void sba_unmap_sg (struct device *dev, struct scatterlist *sglist, int nents, in
                nents--;
        }
 
-       DBG_RUN_SG("%s() DONE (nents %d)\n", __FUNCTION__,  nents);
+       DBG_RUN_SG("%s() DONE (nents %d)\n", __func__,  nents);
 
 #ifdef ASSERT_PDIR_SANITY
        spin_lock_irqsave(&ioc->res_lock, flags);
@@ -1546,7 +1544,7 @@ ioc_iova_init(struct ioc *ioc)
        ioc->iov_size = ~ioc->imask + 1;
 
        DBG_INIT("%s() hpa %p IOV base 0x%lx mask 0x%lx (%dMB)\n",
-               __FUNCTION__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
+               __func__, ioc->ioc_hpa, ioc->ibase, ioc->imask,
                ioc->iov_size >> 20);
 
        switch (iovp_size) {
@@ -1569,7 +1567,7 @@ ioc_iova_init(struct ioc *ioc)
 
        memset(ioc->pdir_base, 0, ioc->pdir_size);
 
-       DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __FUNCTION__,
+       DBG_INIT("%s() IOV page size %ldK pdir %p size %x\n", __func__,
                iovp_size >> 10, ioc->pdir_base, ioc->pdir_size);
 
        ASSERT(ALIGN((unsigned long) ioc->pdir_base, 4*1024) == (unsigned long) ioc->pdir_base);
@@ -1612,7 +1610,7 @@ ioc_iova_init(struct ioc *ioc)
 
                prefetch_spill_page = virt_to_phys(addr);
 
-               DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __FUNCTION__, prefetch_spill_page);
+               DBG_INIT("%s() prefetch spill addr: 0x%lx\n", __func__, prefetch_spill_page);
        }
        /*
        ** Set all the PDIR entries valid w/ the spill page as the target
@@ -1641,7 +1639,7 @@ ioc_resource_init(struct ioc *ioc)
        /* resource map size dictated by pdir_size */
        ioc->res_size = ioc->pdir_size / PDIR_ENTRY_SIZE; /* entries */
        ioc->res_size >>= 3;  /* convert bit count to byte count */
-       DBG_INIT("%s() res_size 0x%x\n", __FUNCTION__, ioc->res_size);
+       DBG_INIT("%s() res_size 0x%x\n", __func__, ioc->res_size);
 
        ioc->res_map = (char *) __get_free_pages(GFP_KERNEL,
                                                 get_order(ioc->res_size));
@@ -1664,7 +1662,7 @@ ioc_resource_init(struct ioc *ioc)
                                                              | prefetch_spill_page);
 #endif
 
-       DBG_INIT("%s() res_map %x %p\n", __FUNCTION__,
+       DBG_INIT("%s() res_map %x %p\n", __func__,
                 ioc->res_size, (void *) ioc->res_map);
 }
 
@@ -1767,7 +1765,7 @@ ioc_init(u64 hpa, void *handle)
        iovp_size = (1 << iovp_shift);
        iovp_mask = ~(iovp_size - 1);
 
-       DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __FUNCTION__,
+       DBG_INIT("%s: PAGE_SIZE %ldK, iovp_size %ldK\n", __func__,
                PAGE_SIZE >> 10, iovp_size >> 10);
 
        if (!ioc->name) {
@@ -2137,7 +2135,7 @@ sba_page_override(char *str)
                        break;
                default:
                        printk("%s: unknown/unsupported iommu page size %ld\n",
-                              __FUNCTION__, page_size);
+                              __func__, page_size);
        }
 
        return 1;
index 9898febf609a34b8073f288295d1f24446931621..969fe9f443c4f69883949e6a3b64d74cb46da8ad 100644 (file)
@@ -222,7 +222,7 @@ simeth_probe1(void)
        }
 
        if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
-               panic("%s: out of interrupt vectors!\n", __FUNCTION__);
+               panic("%s: out of interrupt vectors!\n", __func__);
        dev->irq = rc;
 
        /*
index ef252df50e1e7a32097d881957e83b307cb167a2..eb0c32a85fd737c3154a016a609cd99b13216266 100644 (file)
@@ -1000,7 +1000,7 @@ simrs_init (void)
                if (!state->irq) {
                        if ((rc = assign_irq_vector(AUTO_ASSIGN)) < 0)
                                panic("%s: out of interrupt vectors!\n",
-                                     __FUNCTION__);
+                                     __func__);
                        state->irq = rc;
                        ia64_ssc_connect_irq(KEYBOARD_INTR, state->irq);
                }
index 85e82f32e480c4707de98d4fcdb73e801f2ebc95..256a7faeda0787fc7ba6df9f48d0899dc0add99a 100644 (file)
@@ -766,8 +766,19 @@ get_sigframe (struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
 
        /* This is the X/Open sanctioned signal stack switching.  */
        if (ka->sa.sa_flags & SA_ONSTACK) {
-               if (!on_sig_stack(esp))
+               int onstack = sas_ss_flags(esp);
+
+               if (onstack == 0)
                        esp = current->sas_ss_sp + current->sas_ss_size;
+               else if (onstack == SS_ONSTACK) {
+                       /*
+                        * If we are on the alternate signal stack and would
+                        * overflow it, don't. Return an always-bogus address
+                        * instead so we will die with SIGSEGV.
+                        */
+                       if (!likely(on_sig_stack(esp - frame_size)))
+                               return (void __user *) -1L;
+               }
        }
        /* Legacy stack switching not supported */
 
index d025a22eb225f6bf455ec5a76b47434dc09a0977..b1bf51fe97b47cc66b32cd889431c5ae9af1b3b3 100644 (file)
 #include <linux/shm.h>
 #include <linux/slab.h>
 #include <linux/uio.h>
-#include <linux/nfs_fs.h>
+#include <linux/socket.h>
 #include <linux/quota.h>
-#include <linux/sunrpc/svc.h>
-#include <linux/nfsd/nfsd.h>
-#include <linux/nfsd/cache.h>
-#include <linux/nfsd/xdr.h>
-#include <linux/nfsd/syscall.h>
 #include <linux/poll.h>
 #include <linux/eventpoll.h>
 #include <linux/personality.h>
index f1cf2df97a2d3f2602e2da6432f3e348567fe5f7..fbe742ad2fdeb2e26b3598abf00ae580ccae1aff 100644 (file)
@@ -155,7 +155,7 @@ kdump_init_notifier(struct notifier_block *self, unsigned long val, void *data)
                if (val == DIE_INIT_MONARCH_LEAVE)
                        ia64_mca_printk(KERN_NOTICE
                                        "%s: kdump not configured\n",
-                                       __FUNCTION__);
+                                       __func__);
                return NOTIFY_DONE;
        }
 
index 919070a9aed7184c87ea43d83855963bb170d40e..728d7247a1a69688da32f12386d8fcb2165a1439 100644 (file)
@@ -379,8 +379,8 @@ efi_get_pal_addr (void)
                 * a dedicated ITR for the PAL code.
                 */
                if ((vaddr & mask) == (KERNEL_START & mask)) {
-                       printk(KERN_INFO "%s: no need to install ITR for "
-                              "PAL code\n", __FUNCTION__);
+                       printk(KERN_INFO "%s: no need to install ITR for PAL code\n",
+                              __func__);
                        continue;
                }
 
@@ -399,7 +399,7 @@ efi_get_pal_addr (void)
                return __va(md->phys_addr);
        }
        printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n",
-              __FUNCTION__);
+              __func__);
        return NULL;
 }
 
@@ -543,12 +543,30 @@ efi_init (void)
                for (i = 0, p = efi_map_start; p < efi_map_end;
                     ++i, p += efi_desc_size)
                {
+                       const char *unit;
+                       unsigned long size;
+
                        md = p;
-                       printk("mem%02u: type=%u, attr=0x%lx, "
-                              "range=[0x%016lx-0x%016lx) (%luMB)\n",
+                       size = md->num_pages << EFI_PAGE_SHIFT;
+
+                       if ((size >> 40) > 0) {
+                               size >>= 40;
+                               unit = "TB";
+                       } else if ((size >> 30) > 0) {
+                               size >>= 30;
+                               unit = "GB";
+                       } else if ((size >> 20) > 0) {
+                               size >>= 20;
+                               unit = "MB";
+                       } else {
+                               size >>= 10;
+                               unit = "KB";
+                       }
+
+                       printk("mem%02d: type=%2u, attr=0x%016lx, "
+                              "range=[0x%016lx-0x%016lx) (%4lu%s)\n",
                               i, md->type, md->attribute, md->phys_addr,
-                              md->phys_addr + efi_md_size(md),
-                              md->num_pages >> (20 - EFI_PAGE_SHIFT));
+                              md->phys_addr + efi_md_size(md), size, unit);
                }
        }
 #endif
index 398e2fd1cd2519ef2d6a2186308cd992073b0ec5..082c31dcfd998d83448d52559161805ca240be49 100644 (file)
@@ -345,7 +345,7 @@ iosapic_set_affinity (unsigned int irq, cpumask_t mask)
        if (cpus_empty(mask))
                return;
 
-       if (reassign_irq_vector(irq, first_cpu(mask)))
+       if (irq_prepare_move(irq, first_cpu(mask)))
                return;
 
        dest = cpu_physical_id(first_cpu(mask));
@@ -397,6 +397,7 @@ iosapic_end_level_irq (unsigned int irq)
        struct iosapic_rte_info *rte;
        int do_unmask_irq = 0;
 
+       irq_complete_move(irq);
        if (unlikely(irq_desc[irq].status & IRQ_MOVE_PENDING)) {
                do_unmask_irq = 1;
                mask_irq(irq);
@@ -450,6 +451,7 @@ iosapic_ack_edge_irq (unsigned int irq)
 {
        irq_desc_t *idesc = irq_desc + irq;
 
+       irq_complete_move(irq);
        move_native_irq(irq);
        /*
         * Once we have recorded IRQ_PENDING already, we can mask the
@@ -532,7 +534,7 @@ iosapic_reassign_vector (int irq)
        if (iosapic_intr_info[irq].count) {
                new_irq = create_irq();
                if (new_irq < 0)
-                       panic("%s: out of interrupt vectors!\n", __FUNCTION__);
+                       panic("%s: out of interrupt vectors!\n", __func__);
                printk(KERN_INFO "Reassigning vector %d to %d\n",
                       irq_to_vector(irq), irq_to_vector(new_irq));
                memcpy(&iosapic_intr_info[new_irq], &iosapic_intr_info[irq],
@@ -597,7 +599,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
        index = find_iosapic(gsi);
        if (index < 0) {
                printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
-                      __FUNCTION__, gsi);
+                      __func__, gsi);
                return -ENODEV;
        }
 
@@ -606,7 +608,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
                rte = iosapic_alloc_rte();
                if (!rte) {
                        printk(KERN_WARNING "%s: cannot allocate memory\n",
-                              __FUNCTION__);
+                              __func__);
                        return -ENOMEM;
                }
 
@@ -623,7 +625,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
                    (info->trigger != trigger || info->polarity != polarity)){
                        printk (KERN_WARNING
                                "%s: cannot override the interrupt\n",
-                               __FUNCTION__);
+                               __func__);
                        return -EINVAL;
                }
                rte->refcnt++;
@@ -645,7 +647,7 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
                if (idesc->chip != &no_irq_type)
                        printk(KERN_WARNING
                               "%s: changing vector %d from %s to %s\n",
-                              __FUNCTION__, irq_to_vector(irq),
+                              __func__, irq_to_vector(irq),
                               idesc->chip->name, irq_type->name);
                idesc->chip = irq_type;
        }
@@ -918,7 +920,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
              case ACPI_INTERRUPT_INIT:
                irq = create_irq();
                if (irq < 0)
-                       panic("%s: out of interrupt vectors!\n", __FUNCTION__);
+                       panic("%s: out of interrupt vectors!\n", __func__);
                vector = irq_to_vector(irq);
                delivery = IOSAPIC_INIT;
                break;
@@ -929,7 +931,7 @@ iosapic_register_platform_intr (u32 int_type, unsigned int gsi,
                mask = 1;
                break;
              default:
-               printk(KERN_ERR "%s: invalid int type 0x%x\n", __FUNCTION__,
+               printk(KERN_ERR "%s: invalid int type 0x%x\n", __func__,
                       int_type);
                return -1;
        }
@@ -994,7 +996,7 @@ iosapic_system_init (int system_pcat_compat)
                 */
                printk(KERN_INFO
                       "%s: Disabling PC-AT compatible 8259 interrupts\n",
-                      __FUNCTION__);
+                      __func__);
                outb(0xff, 0xA1);
                outb(0xff, 0x21);
        }
@@ -1009,7 +1011,7 @@ iosapic_alloc (void)
                if (!iosapic_lists[index].addr)
                        return index;
 
-       printk(KERN_WARNING "%s: failed to allocate iosapic\n", __FUNCTION__);
+       printk(KERN_WARNING "%s: failed to allocate iosapic\n", __func__);
        return -1;
 }
 
@@ -1107,14 +1109,14 @@ iosapic_remove (unsigned int gsi_base)
        index = find_iosapic(gsi_base);
        if (index < 0) {
                printk(KERN_WARNING "%s: No IOSAPIC for GSI base %u\n",
-                      __FUNCTION__, gsi_base);
+                      __func__, gsi_base);
                goto out;
        }
 
        if (iosapic_lists[index].rtes_inuse) {
                err = -EBUSY;
                printk(KERN_WARNING "%s: IOSAPIC for GSI base %u is busy\n",
-                      __FUNCTION__, gsi_base);
+                      __func__, gsi_base);
                goto out;
        }
 
@@ -1135,7 +1137,7 @@ map_iosapic_to_node(unsigned int gsi_base, int node)
        index = find_iosapic(gsi_base);
        if (index < 0) {
                printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n",
-                      __FUNCTION__, gsi_base);
+                      __func__, gsi_base);
                return;
        }
        iosapic_lists[index].node = node;
index 0b52f19ed04615b8f637e2ee496fa8c488b5546c..d8be23fbe6bc7bbf0668a01f55fe3dd7813a6f29 100644 (file)
@@ -260,6 +260,8 @@ void __setup_vector_irq(int cpu)
 }
 
 #if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG))
+#define IA64_IRQ_MOVE_VECTOR   IA64_DEF_FIRST_DEVICE_VECTOR
+
 static enum vector_domain_type {
        VECTOR_DOMAIN_NONE,
        VECTOR_DOMAIN_PERCPU
@@ -272,6 +274,101 @@ static cpumask_t vector_allocation_domain(int cpu)
        return CPU_MASK_ALL;
 }
 
+static int __irq_prepare_move(int irq, int cpu)
+{
+       struct irq_cfg *cfg = &irq_cfg[irq];
+       int vector;
+       cpumask_t domain;
+
+       if (cfg->move_in_progress || cfg->move_cleanup_count)
+               return -EBUSY;
+       if (cfg->vector == IRQ_VECTOR_UNASSIGNED || !cpu_online(cpu))
+               return -EINVAL;
+       if (cpu_isset(cpu, cfg->domain))
+               return 0;
+       domain = vector_allocation_domain(cpu);
+       vector = find_unassigned_vector(domain);
+       if (vector < 0)
+               return -ENOSPC;
+       cfg->move_in_progress = 1;
+       cfg->old_domain = cfg->domain;
+       cfg->vector = IRQ_VECTOR_UNASSIGNED;
+       cfg->domain = CPU_MASK_NONE;
+       BUG_ON(__bind_irq_vector(irq, vector, domain));
+       return 0;
+}
+
+int irq_prepare_move(int irq, int cpu)
+{
+       unsigned long flags;
+       int ret;
+
+       spin_lock_irqsave(&vector_lock, flags);
+       ret = __irq_prepare_move(irq, cpu);
+       spin_unlock_irqrestore(&vector_lock, flags);
+       return ret;
+}
+
+void irq_complete_move(unsigned irq)
+{
+       struct irq_cfg *cfg = &irq_cfg[irq];
+       cpumask_t cleanup_mask;
+       int i;
+
+       if (likely(!cfg->move_in_progress))
+               return;
+
+       if (unlikely(cpu_isset(smp_processor_id(), cfg->old_domain)))
+               return;
+
+       cpus_and(cleanup_mask, cfg->old_domain, cpu_online_map);
+       cfg->move_cleanup_count = cpus_weight(cleanup_mask);
+       for_each_cpu_mask(i, cleanup_mask)
+               platform_send_ipi(i, IA64_IRQ_MOVE_VECTOR, IA64_IPI_DM_INT, 0);
+       cfg->move_in_progress = 0;
+}
+
+static irqreturn_t smp_irq_move_cleanup_interrupt(int irq, void *dev_id)
+{
+       int me = smp_processor_id();
+       ia64_vector vector;
+       unsigned long flags;
+
+       for (vector = IA64_FIRST_DEVICE_VECTOR;
+            vector < IA64_LAST_DEVICE_VECTOR; vector++) {
+               int irq;
+               struct irq_desc *desc;
+               struct irq_cfg *cfg;
+               irq = __get_cpu_var(vector_irq)[vector];
+               if (irq < 0)
+                       continue;
+
+               desc = irq_desc + irq;
+               cfg = irq_cfg + irq;
+               spin_lock(&desc->lock);
+               if (!cfg->move_cleanup_count)
+                       goto unlock;
+
+               if (!cpu_isset(me, cfg->old_domain))
+                       goto unlock;
+
+               spin_lock_irqsave(&vector_lock, flags);
+               __get_cpu_var(vector_irq)[vector] = -1;
+               cpu_clear(me, vector_table[vector]);
+               spin_unlock_irqrestore(&vector_lock, flags);
+               cfg->move_cleanup_count--;
+       unlock:
+               spin_unlock(&desc->lock);
+       }
+       return IRQ_HANDLED;
+}
+
+static struct irqaction irq_move_irqaction = {
+       .handler =      smp_irq_move_cleanup_interrupt,
+       .flags =        IRQF_DISABLED,
+       .name =         "irq_move"
+};
+
 static int __init parse_vector_domain(char *arg)
 {
        if (!arg)
@@ -303,36 +400,6 @@ void destroy_and_reserve_irq(unsigned int irq)
        spin_unlock_irqrestore(&vector_lock, flags);
 }
 
-static int __reassign_irq_vector(int irq, int cpu)
-{
-       struct irq_cfg *cfg = &irq_cfg[irq];
-       int vector;
-       cpumask_t domain;
-
-       if (cfg->vector == IRQ_VECTOR_UNASSIGNED || !cpu_online(cpu))
-               return -EINVAL;
-       if (cpu_isset(cpu, cfg->domain))
-               return 0;
-       domain = vector_allocation_domain(cpu);
-       vector = find_unassigned_vector(domain);
-       if (vector < 0)
-               return -ENOSPC;
-       __clear_irq_vector(irq);
-       BUG_ON(__bind_irq_vector(irq, vector, domain));
-       return 0;
-}
-
-int reassign_irq_vector(int irq, int cpu)
-{
-       unsigned long flags;
-       int ret;
-
-       spin_lock_irqsave(&vector_lock, flags);
-       ret = __reassign_irq_vector(irq, cpu);
-       spin_unlock_irqrestore(&vector_lock, flags);
-       return ret;
-}
-
 /*
  * Dynamic irq allocate and deallocation for MSI
  */
@@ -440,7 +507,7 @@ ia64_handle_irq (ia64_vector vector, struct pt_regs *regs)
                        if (unlikely(irq < 0)) {
                                printk(KERN_ERR "%s: Unexpected interrupt "
                                       "vector %d on CPU %d is not mapped "
-                                      "to any IRQ!\n", __FUNCTION__, vector,
+                                      "to any IRQ!\n", __func__, vector,
                                       smp_processor_id());
                        } else
                                generic_handle_irq(irq);
@@ -505,7 +572,7 @@ void ia64_process_pending_intr(void)
                        if (unlikely(irq < 0)) {
                                printk(KERN_ERR "%s: Unexpected interrupt "
                                       "vector %d on CPU %d not being mapped "
-                                      "to any IRQ!!\n", __FUNCTION__, vector,
+                                      "to any IRQ!!\n", __func__, vector,
                                       smp_processor_id());
                        } else {
                                vectors_in_migration[irq]=0;
@@ -578,6 +645,13 @@ init_IRQ (void)
        register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
        register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
        register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction);
+#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)
+       if (vector_domain_type != VECTOR_DOMAIN_NONE) {
+               BUG_ON(IA64_FIRST_DEVICE_VECTOR != IA64_IRQ_MOVE_VECTOR);
+               IA64_FIRST_DEVICE_VECTOR++;
+               register_percpu_irq(IA64_IRQ_MOVE_VECTOR, &irq_move_irqaction);
+       }
+#endif
 #endif
 #ifdef CONFIG_PERFMON
        pfm_init_percpu();
@@ -592,11 +666,7 @@ ia64_send_ipi (int cpu, int vector, int delivery_mode, int redirect)
        unsigned long ipi_data;
        unsigned long phys_cpu_id;
 
-#ifdef CONFIG_SMP
        phys_cpu_id = cpu_physical_id(cpu);
-#else
-       phys_cpu_id = (ia64_getreg(_IA64_REG_CR_LID) >> 16) & 0xffff;
-#endif
 
        /*
         * cpu number is in 8bit ID and 8bit EID
index b618487cdc858b836cee4adb044579bb5cb716f4..8d9a446a0d178e47a8ffad9a47711ee564680da3 100644 (file)
@@ -838,7 +838,7 @@ out:
        return 1;
 }
 
-int __kprobes kprobes_fault_handler(struct pt_regs *regs, int trapnr)
+int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)
 {
        struct kprobe *cur = kprobe_running();
        struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
@@ -1001,6 +1001,11 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
        return 1;
 }
 
+/* ia64 does not need this */
+void __kprobes jprobe_return(void)
+{
+}
+
 int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
 {
        struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
index 6e17aed5313521be82a8bf9f381f1b1a09307ea5..6c18221dba366776264d3f0251e14cd51a47d9dc 100644 (file)
@@ -413,8 +413,8 @@ ia64_log_get(int sal_info_type, u8 **buffer, int irq_safe)
                IA64_LOG_INDEX_INC(sal_info_type);
                IA64_LOG_UNLOCK(sal_info_type);
                if (irq_safe) {
-                       IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. "
-                                      "Record length = %ld\n", __FUNCTION__, sal_info_type, total_len);
+                       IA64_MCA_DEBUG("%s: SAL error record type %d retrieved. Record length = %ld\n",
+                                      __func__, sal_info_type, total_len);
                }
                *buffer = (u8 *) log_buffer;
                return total_len;
@@ -518,7 +518,7 @@ ia64_mca_cpe_int_handler (int cpe_irq, void *arg)
        static DEFINE_SPINLOCK(cpe_history_lock);
 
        IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
-                      __FUNCTION__, cpe_irq, smp_processor_id());
+                      __func__, cpe_irq, smp_processor_id());
 
        /* SAL spec states this should run w/ interrupts enabled */
        local_irq_enable();
@@ -594,7 +594,7 @@ ia64_mca_register_cpev (int cpev)
        }
 
        IA64_MCA_DEBUG("%s: corrected platform error "
-                      "vector %#x registered\n", __FUNCTION__, cpev);
+                      "vector %#x registered\n", __func__, cpev);
 }
 #endif /* CONFIG_ACPI */
 
@@ -621,12 +621,11 @@ ia64_mca_cmc_vector_setup (void)
        cmcv.cmcv_vector        = IA64_CMC_VECTOR;
        ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
 
-       IA64_MCA_DEBUG("%s: CPU %d corrected "
-                      "machine check vector %#x registered.\n",
-                      __FUNCTION__, smp_processor_id(), IA64_CMC_VECTOR);
+       IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x registered.\n",
+                      __func__, smp_processor_id(), IA64_CMC_VECTOR);
 
        IA64_MCA_DEBUG("%s: CPU %d CMCV = %#016lx\n",
-                      __FUNCTION__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV));
+                      __func__, smp_processor_id(), ia64_getreg(_IA64_REG_CR_CMCV));
 }
 
 /*
@@ -651,9 +650,8 @@ ia64_mca_cmc_vector_disable (void *dummy)
        cmcv.cmcv_mask = 1; /* Mask/disable interrupt */
        ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
 
-       IA64_MCA_DEBUG("%s: CPU %d corrected "
-                      "machine check vector %#x disabled.\n",
-                      __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
+       IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x disabled.\n",
+                      __func__, smp_processor_id(), cmcv.cmcv_vector);
 }
 
 /*
@@ -678,9 +676,8 @@ ia64_mca_cmc_vector_enable (void *dummy)
        cmcv.cmcv_mask = 0; /* Unmask/enable interrupt */
        ia64_setreg(_IA64_REG_CR_CMCV, cmcv.cmcv_regval);
 
-       IA64_MCA_DEBUG("%s: CPU %d corrected "
-                      "machine check vector %#x enabled.\n",
-                      __FUNCTION__, smp_processor_id(), cmcv.cmcv_vector);
+       IA64_MCA_DEBUG("%s: CPU %d corrected machine check vector %#x enabled.\n",
+                      __func__, smp_processor_id(), cmcv.cmcv_vector);
 }
 
 /*
@@ -767,7 +764,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
        local_irq_save(flags);
        if (notify_die(DIE_MCA_RENDZVOUS_ENTER, "MCA", get_irq_regs(),
                       (long)&nd, 0, 0) == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
        ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_DONE;
        /* Register with the SAL monarch that the slave has
@@ -777,7 +774,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
 
        if (notify_die(DIE_MCA_RENDZVOUS_PROCESS, "MCA", get_irq_regs(),
                       (long)&nd, 0, 0) == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
        /* Wait for the monarch cpu to exit. */
        while (monarch_cpu != -1)
@@ -785,7 +782,7 @@ ia64_mca_rendez_int_handler(int rendez_irq, void *arg)
 
        if (notify_die(DIE_MCA_RENDZVOUS_LEAVE, "MCA", get_irq_regs(),
                       (long)&nd, 0, 0) == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
        ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
        /* Enable all interrupts */
@@ -1230,7 +1227,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
 
        if (notify_die(DIE_MCA_MONARCH_ENTER, "MCA", regs, (long)&nd, 0, 0)
                        == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
        ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_CONCURRENT_MCA;
        if (sos->monarch) {
@@ -1246,7 +1243,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
                ia64_mca_wakeup_all();
                if (notify_die(DIE_MCA_MONARCH_PROCESS, "MCA", regs, (long)&nd, 0, 0)
                                == NOTIFY_STOP)
-                       ia64_mca_spin(__FUNCTION__);
+                       ia64_mca_spin(__func__);
        } else {
                while (cpu_isset(cpu, mca_cpu))
                        cpu_relax();    /* spin until monarch wakes us */
@@ -1276,7 +1273,7 @@ ia64_mca_handler(struct pt_regs *regs, struct switch_stack *sw,
        }
        if (notify_die(DIE_MCA_MONARCH_LEAVE, "MCA", regs, (long)&nd, 0, recover)
                        == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
 
        if (atomic_dec_return(&mca_count) > 0) {
@@ -1328,7 +1325,7 @@ ia64_mca_cmc_int_handler(int cmc_irq, void *arg)
        static DEFINE_SPINLOCK(cmc_history_lock);
 
        IA64_MCA_DEBUG("%s: received interrupt vector = %#x on CPU %d\n",
-                      __FUNCTION__, cmc_irq, smp_processor_id());
+                      __func__, cmc_irq, smp_processor_id());
 
        /* SAL spec states this should run w/ interrupts enabled */
        local_irq_enable();
@@ -1614,7 +1611,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
         */
        if (!sos->monarch && atomic_add_return(1, &slaves) == num_online_cpus()) {
                mprintk(KERN_WARNING "%s: Promoting cpu %d to monarch.\n",
-                      __FUNCTION__, cpu);
+                       __func__, cpu);
                atomic_dec(&slaves);
                sos->monarch = 1;
        }
@@ -1626,7 +1623,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
         */
        if (sos->monarch && atomic_add_return(1, &monarchs) > 1) {
                mprintk(KERN_WARNING "%s: Demoting cpu %d to slave.\n",
-                              __FUNCTION__, cpu);
+                              __func__, cpu);
                atomic_dec(&monarchs);
                sos->monarch = 0;
        }
@@ -1637,15 +1634,15 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
                       cpu_relax();     /* spin until monarch enters */
                if (notify_die(DIE_INIT_SLAVE_ENTER, "INIT", regs, (long)&nd, 0, 0)
                                == NOTIFY_STOP)
-                       ia64_mca_spin(__FUNCTION__);
+                       ia64_mca_spin(__func__);
                if (notify_die(DIE_INIT_SLAVE_PROCESS, "INIT", regs, (long)&nd, 0, 0)
                                == NOTIFY_STOP)
-                       ia64_mca_spin(__FUNCTION__);
+                       ia64_mca_spin(__func__);
                while (monarch_cpu != -1)
                       cpu_relax();     /* spin until monarch leaves */
                if (notify_die(DIE_INIT_SLAVE_LEAVE, "INIT", regs, (long)&nd, 0, 0)
                                == NOTIFY_STOP)
-                       ia64_mca_spin(__FUNCTION__);
+                       ia64_mca_spin(__func__);
                mprintk("Slave on cpu %d returning to normal service.\n", cpu);
                set_curr_task(cpu, previous_current);
                ia64_mc_info.imi_rendez_checkin[cpu] = IA64_MCA_RENDEZ_CHECKIN_NOTDONE;
@@ -1656,7 +1653,7 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
        monarch_cpu = cpu;
        if (notify_die(DIE_INIT_MONARCH_ENTER, "INIT", regs, (long)&nd, 0, 0)
                        == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
 
        /*
         * Wait for a bit.  On some machines (e.g., HP's zx2000 and zx6000, INIT can be
@@ -1673,10 +1670,10 @@ ia64_init_handler(struct pt_regs *regs, struct switch_stack *sw,
         */
        if (notify_die(DIE_INIT_MONARCH_PROCESS, "INIT", regs, (long)&nd, 0, 0)
                        == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
        if (notify_die(DIE_INIT_MONARCH_LEAVE, "INIT", regs, (long)&nd, 0, 0)
                        == NOTIFY_STOP)
-               ia64_mca_spin(__FUNCTION__);
+               ia64_mca_spin(__func__);
        mprintk("\nINIT dump complete.  Monarch on cpu %d returning to normal service.\n", cpu);
        atomic_dec(&monarchs);
        set_curr_task(cpu, previous_current);
@@ -1884,7 +1881,7 @@ ia64_mca_init(void)
                .priority = 0/* we need to notified last */
        };
 
-       IA64_MCA_DEBUG("%s: begin\n", __FUNCTION__);
+       IA64_MCA_DEBUG("%s: begin\n", __func__);
 
        /* Clear the Rendez checkin flag for all cpus */
        for(i = 0 ; i < NR_CPUS; i++)
@@ -1928,7 +1925,7 @@ ia64_mca_init(void)
                return;
        }
 
-       IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __FUNCTION__);
+       IA64_MCA_DEBUG("%s: registered MCA rendezvous spinloop and wakeup mech.\n", __func__);
 
        ia64_mc_info.imi_mca_handler        = ia64_tpa(mca_hldlr_ptr->fp);
        /*
@@ -1949,7 +1946,7 @@ ia64_mca_init(void)
                return;
        }
 
-       IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __FUNCTION__,
+       IA64_MCA_DEBUG("%s: registered OS MCA handler with SAL at 0x%lx, gp = 0x%lx\n", __func__,
                       ia64_mc_info.imi_mca_handler, ia64_tpa(mca_hldlr_ptr->gp));
 
        /*
@@ -1961,7 +1958,7 @@ ia64_mca_init(void)
        ia64_mc_info.imi_slave_init_handler             = ia64_tpa(init_hldlr_ptr_slave->fp);
        ia64_mc_info.imi_slave_init_handler_size        = 0;
 
-       IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __FUNCTION__,
+       IA64_MCA_DEBUG("%s: OS INIT handler at %lx\n", __func__,
                       ia64_mc_info.imi_monarch_init_handler);
 
        /* Register the os init handler with SAL */
@@ -1982,7 +1979,7 @@ ia64_mca_init(void)
                return;
        }
 
-       IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __FUNCTION__);
+       IA64_MCA_DEBUG("%s: registered OS INIT handler with SAL\n", __func__);
 
        /*
         *  Configure the CMCI/P vector and handler. Interrupts for CMC are
@@ -2042,7 +2039,7 @@ ia64_mca_late_init(void)
        cmc_polling_enabled = 0;
        schedule_work(&cmc_enable_work);
 
-       IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __FUNCTION__);
+       IA64_MCA_DEBUG("%s: CMCI/P setup and enabled.\n", __func__);
 
 #ifdef CONFIG_ACPI
        /* Setup the CPEI/P vector and handler */
@@ -2065,17 +2062,17 @@ ia64_mca_late_init(void)
                                ia64_cpe_irq = irq;
                                ia64_mca_register_cpev(cpe_vector);
                                IA64_MCA_DEBUG("%s: CPEI/P setup and enabled.\n",
-                                       __FUNCTION__);
+                                       __func__);
                                return 0;
                        }
                        printk(KERN_ERR "%s: Failed to find irq for CPE "
                                        "interrupt handler, vector %d\n",
-                                       __FUNCTION__, cpe_vector);
+                                       __func__, cpe_vector);
                }
                /* If platform doesn't support CPEI, get the timer going. */
                if (cpe_poll_enabled) {
                        ia64_mca_cpe_poll(0UL);
-                       IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __FUNCTION__);
+                       IA64_MCA_DEBUG("%s: CPEP setup and enabled.\n", __func__);
                }
        }
 #endif
index e58f4367cf11db4ad4cca80fed0785f7283d5b15..e83e2ea3b3e0787ea673ae7451ae2855196f1c38 100644 (file)
@@ -493,7 +493,7 @@ module_frob_arch_sections (Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, char *secstrings,
        mod->arch.opd->sh_addralign = 8;
        mod->arch.opd->sh_size = fdescs * sizeof(struct fdesc);
        DEBUGP("%s: core.plt=%lx, init.plt=%lx, got=%lx, fdesc=%lx\n",
-              __FUNCTION__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
+              __func__, mod->arch.core_plt->sh_size, mod->arch.init_plt->sh_size,
               mod->arch.got->sh_size, mod->arch.opd->sh_size);
        return 0;
 }
@@ -585,7 +585,7 @@ get_plt (struct module *mod, const struct insn *insn, uint64_t value, int *okp)
 #if ARCH_MODULE_DEBUG
        if (plt_target(plt) != target_ip) {
                printk("%s: mistargeted PLT: wanted %lx, got %lx\n",
-                      __FUNCTION__, target_ip, plt_target(plt));
+                      __func__, target_ip, plt_target(plt));
                *okp = 0;
                return 0;
        }
@@ -703,7 +703,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
                if (r_type == R_IA64_PCREL21BI) {
                        if (!is_internal(mod, val)) {
                                printk(KERN_ERR "%s: %s reloc against non-local symbol (%lx)\n",
-                                      __FUNCTION__, reloc_name[r_type], val);
+                                      __func__, reloc_name[r_type], val);
                                return -ENOEXEC;
                        }
                        format = RF_INSN21B;
@@ -737,7 +737,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
                      case R_IA64_LDXMOV:
                        if (gp_addressable(mod, val)) {
                                /* turn "ld8" into "mov": */
-                               DEBUGP("%s: patching ld8 at %p to mov\n", __FUNCTION__, location);
+                               DEBUGP("%s: patching ld8 at %p to mov\n", __func__, location);
                                ia64_patch((u64) location, 0x1fff80fe000UL, 0x10000000000UL);
                        }
                        return 0;
@@ -771,7 +771,7 @@ do_reloc (struct module *mod, uint8_t r_type, Elf64_Sym *sym, uint64_t addend,
        if (!ok)
                return -ENOEXEC;
 
-       DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __FUNCTION__, location, val,
+       DEBUGP("%s: [%p]<-%016lx = %s(%lx)\n", __func__, location, val,
               reloc_name[r_type] ? reloc_name[r_type] : "?", sym->st_value + addend);
 
        switch (format) {
@@ -807,7 +807,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
        Elf64_Shdr *target_sec;
        int ret;
 
-       DEBUGP("%s: applying section %u (%u relocs) to %u\n", __FUNCTION__,
+       DEBUGP("%s: applying section %u (%u relocs) to %u\n", __func__,
               relsec, n, sechdrs[relsec].sh_info);
 
        target_sec = sechdrs + sechdrs[relsec].sh_info;
@@ -835,7 +835,7 @@ apply_relocate_add (Elf64_Shdr *sechdrs, const char *strtab, unsigned int symind
                        gp = mod->core_size / 2;
                gp = (uint64_t) mod->module_core + ((gp + 7) & -8);
                mod->arch.gp = gp;
-               DEBUGP("%s: placing gp at 0x%lx\n", __FUNCTION__, gp);
+               DEBUGP("%s: placing gp at 0x%lx\n", __func__, gp);
        }
 
        for (i = 0; i < n; i++) {
@@ -903,7 +903,7 @@ register_unwind_table (struct module *mod)
                init = start + num_core;
        }
 
-       DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __FUNCTION__,
+       DEBUGP("%s: name=%s, gp=%lx, num_init=%lu, num_core=%lu\n", __func__,
               mod->name, mod->arch.gp, num_init, num_core);
 
        /*
@@ -912,13 +912,13 @@ register_unwind_table (struct module *mod)
        if (num_core > 0) {
                mod->arch.core_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
                                                                core, core + num_core);
-               DEBUGP("%s:  core: handle=%p [%p-%p)\n", __FUNCTION__,
+               DEBUGP("%s:  core: handle=%p [%p-%p)\n", __func__,
                       mod->arch.core_unw_table, core, core + num_core);
        }
        if (num_init > 0) {
                mod->arch.init_unw_table = unw_add_unwind_table(mod->name, 0, mod->arch.gp,
                                                                init, init + num_init);
-               DEBUGP("%s:  init: handle=%p [%p-%p)\n", __FUNCTION__,
+               DEBUGP("%s:  init: handle=%p [%p-%p)\n", __func__,
                       mod->arch.init_unw_table, init, init + num_init);
        }
 }
@@ -926,7 +926,7 @@ register_unwind_table (struct module *mod)
 int
 module_finalize (const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod)
 {
-       DEBUGP("%s: init: entry=%p\n", __FUNCTION__, mod->init);
+       DEBUGP("%s: init: entry=%p\n", __func__, mod->init);
        if (mod->arch.unwind)
                register_unwind_table(mod);
        return 0;
index e86d0295979465a56c257298028d5fc9798fb249..60c6ef67ebb215267c79eae647984893d0684f66 100644 (file)
@@ -57,7 +57,7 @@ static void ia64_set_msi_irq_affinity(unsigned int irq, cpumask_t cpu_mask)
        if (!cpu_online(cpu))
                return;
 
-       if (reassign_irq_vector(irq, cpu))
+       if (irq_prepare_move(irq, cpu))
                return;
 
        read_msi_msg(irq, &msg);
@@ -119,6 +119,7 @@ void ia64_teardown_msi_irq(unsigned int irq)
 
 static void ia64_ack_msi_irq(unsigned int irq)
 {
+       irq_complete_move(irq);
        move_native_irq(irq);
        ia64_eoi();
 }
index f6b99719f10f0b4c1ef4893e3e8999f0d4ca75df..a2aabfdc80d9ecaf4a8d1f4853956ca765e73f64 100644 (file)
 #ifdef PFM_DEBUGGING
 #define DPRINT(a) \
        do { \
-               if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
+               if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
        } while (0)
 
 #define DPRINT_ovfl(a) \
        do { \
-               if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __FUNCTION__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
+               if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d [%d] ", __func__, __LINE__, smp_processor_id(), task_pid_nr(current)); printk a; } \
        } while (0)
 #endif
 
index a7af1cb419f921490991a2d29c3a6e6bc69d6012..5f637bbfcccdd6f5a09bdfe6a9266859f5cc4e63 100644 (file)
@@ -24,12 +24,12 @@ MODULE_LICENSE("GPL");
 #ifdef DEFAULT_DEBUG
 #define DPRINT(a) \
        do { \
-               if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \
+               if (unlikely(pfm_sysctl.debug >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \
        } while (0)
 
 #define DPRINT_ovfl(a) \
        do { \
-               if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __FUNCTION__, __LINE__, smp_processor_id()); printk a; } \
+               if (unlikely(pfm_sysctl.debug > 0 && pfm_sysctl.debug_ovfl >0)) { printk("%s.%d: CPU%d ", __func__, __LINE__, smp_processor_id()); printk a; } \
        } while (0)
 
 #else
index 331d6768b5d50f7257cb6c389929fdfb989800c9..ab784ec4319dbd2eea568a5a6cbc566e829eb358 100644 (file)
@@ -697,52 +697,6 @@ thread_matches (struct task_struct *thread, unsigned long addr)
        return 1;       /* looks like we've got a winner */
 }
 
-/*
- * GDB apparently wants to be able to read the register-backing store
- * of any thread when attached to a given process.  If we are peeking
- * or poking an address that happens to reside in the kernel-backing
- * store of another thread, we need to attach to that thread, because
- * otherwise we end up accessing stale data.
- *
- * task_list_lock must be read-locked before calling this routine!
- */
-static struct task_struct *
-find_thread_for_addr (struct task_struct *child, unsigned long addr)
-{
-       struct task_struct *p;
-       struct mm_struct *mm;
-       struct list_head *this, *next;
-       int mm_users;
-
-       if (!(mm = get_task_mm(child)))
-               return child;
-
-       /* -1 because of our get_task_mm(): */
-       mm_users = atomic_read(&mm->mm_users) - 1;
-       if (mm_users <= 1)
-               goto out;               /* not multi-threaded */
-
-       /*
-        * Traverse the current process' children list.  Every task that
-        * one attaches to becomes a child.  And it is only attached children
-        * of the debugger that are of interest (ptrace_check_attach checks
-        * for this).
-        */
-       list_for_each_safe(this, next, &current->children) {
-               p = list_entry(this, struct task_struct, sibling);
-               if (p->tgid != child->tgid)
-                       continue;
-               if (thread_matches(p, addr)) {
-                       child = p;
-                       goto out;
-               }
-       }
-
-  out:
-       mmput(mm);
-       return child;
-}
-
 /*
  * Write f32-f127 back to task->thread.fph if it has been modified.
  */
@@ -826,14 +780,14 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs  *pt,
                if ((long)((unsigned long)child + IA64_STK_OFFSET - sp)
                    < IA64_PT_REGS_SIZE) {
                        dprintk("ptrace.%s: ran off the top of the kernel "
-                               "stack\n", __FUNCTION__);
+                               "stack\n", __func__);
                        return;
                }
                if (unw_get_pr (&prev_info, &pr) < 0) {
                        unw_get_rp(&prev_info, &ip);
                        dprintk("ptrace.%s: failed to read "
                                "predicate register (ip=0x%lx)\n",
-                               __FUNCTION__, ip);
+                               __func__, ip);
                        return;
                }
                if (unw_is_intr_frame(&info)
@@ -908,7 +862,7 @@ static int
 access_uarea (struct task_struct *child, unsigned long addr,
              unsigned long *data, int write_access)
 {
-       unsigned long *ptr, regnum, urbs_end, rnat_addr, cfm;
+       unsigned long *ptr, regnum, urbs_end, cfm;
        struct switch_stack *sw;
        struct pt_regs *pt;
 #      define pt_reg_addr(pt, reg)     ((void *)                           \
@@ -1011,14 +965,9 @@ access_uarea (struct task_struct *child, unsigned long addr,
                         * the kernel was entered.
                         *
                         * Furthermore, when changing the contents of
-                        * PT_AR_BSP (or PT_CFM) we MUST copy any
-                        * users-level stacked registers that are
-                        * stored on the kernel stack back to
-                        * user-space because otherwise, we might end
-                        * up clobbering kernel stacked registers.
-                        * Also, if this happens while the task is
-                        * blocked in a system call, which convert the
-                        * state such that the non-system-call exit
+                        * PT_AR_BSP (or PT_CFM) while the task is
+                        * blocked in a system call, convert the state
+                        * so that the non-system-call exit
                         * path is used.  This ensures that the proper
                         * state will be picked up when resuming
                         * execution.  However, it *also* means that
@@ -1035,10 +984,6 @@ access_uarea (struct task_struct *child, unsigned long addr,
                        urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
                        if (write_access) {
                                if (*data != urbs_end) {
-                                       if (ia64_sync_user_rbs(child, sw,
-                                                              pt->ar_bspstore,
-                                                              urbs_end) < 0)
-                                               return -1;
                                        if (in_syscall(pt))
                                                convert_to_non_syscall(child,
                                                                       pt,
@@ -1058,10 +1003,6 @@ access_uarea (struct task_struct *child, unsigned long addr,
                        urbs_end = ia64_get_user_rbs_end(child, pt, &cfm);
                        if (write_access) {
                                if (((cfm ^ *data) & PFM_MASK) != 0) {
-                                       if (ia64_sync_user_rbs(child, sw,
-                                                              pt->ar_bspstore,
-                                                              urbs_end) < 0)
-                                               return -1;
                                        if (in_syscall(pt))
                                                convert_to_non_syscall(child,
                                                                       pt,
@@ -1093,16 +1034,8 @@ access_uarea (struct task_struct *child, unsigned long addr,
                        return 0;
 
                      case PT_AR_RNAT:
-                       urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
-                       rnat_addr = (long) ia64_rse_rnat_addr((long *)
-                                                             urbs_end);
-                       if (write_access)
-                               return ia64_poke(child, sw, urbs_end,
-                                                rnat_addr, *data);
-                       else
-                               return ia64_peek(child, sw, urbs_end,
-                                                rnat_addr, data);
-
+                       ptr = pt_reg_addr(pt, ar_rnat);
+                       break;
                      case PT_R1:
                        ptr = pt_reg_addr(pt, r1);
                        break;
@@ -1521,215 +1454,97 @@ ptrace_setregs (struct task_struct *child, struct pt_all_user_regs __user *ppr)
        return ret;
 }
 
-/*
- * Called by kernel/ptrace.c when detaching..
- *
- * Make sure the single step bit is not set.
- */
 void
-ptrace_disable (struct task_struct *child)
+user_enable_single_step (struct task_struct *child)
 {
        struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
 
-       /* make sure the single step/taken-branch trap bits are not set: */
-       clear_tsk_thread_flag(child, TIF_SINGLESTEP);
-       child_psr->ss = 0;
-       child_psr->tb = 0;
+       set_tsk_thread_flag(child, TIF_SINGLESTEP);
+       child_psr->ss = 1;
 }
 
-asmlinkage long
-sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data)
+void
+user_enable_block_step (struct task_struct *child)
 {
-       struct pt_regs *pt;
-       unsigned long urbs_end, peek_or_poke;
-       struct task_struct *child;
-       struct switch_stack *sw;
-       long ret;
-       struct unw_frame_info info;
+       struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
 
-       lock_kernel();
-       ret = -EPERM;
-       if (request == PTRACE_TRACEME) {
-               ret = ptrace_traceme();
-               goto out;
-       }
+       set_tsk_thread_flag(child, TIF_SINGLESTEP);
+       child_psr->tb = 1;
+}
 
-       peek_or_poke = (request == PTRACE_PEEKTEXT
-                       || request == PTRACE_PEEKDATA
-                       || request == PTRACE_POKETEXT
-                       || request == PTRACE_POKEDATA);
-       ret = -ESRCH;
-       read_lock(&tasklist_lock);
-       {
-               child = find_task_by_pid(pid);
-               if (child) {
-                       if (peek_or_poke)
-                               child = find_thread_for_addr(child, addr);
-                       get_task_struct(child);
-               }
-       }
-       read_unlock(&tasklist_lock);
-       if (!child)
-               goto out;
-       ret = -EPERM;
-       if (pid == 1)           /* no messing around with init! */
-               goto out_tsk;
-
-       if (request == PTRACE_ATTACH) {
-               ret = ptrace_attach(child);
-               if (!ret)
-                       arch_ptrace_attach(child);
-               goto out_tsk;
-       }
+void
+user_disable_single_step (struct task_struct *child)
+{
+       struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child));
 
-       ret = ptrace_check_attach(child, request == PTRACE_KILL);
-       if (ret < 0)
-               goto out_tsk;
+       /* make sure the single step/taken-branch trap bits are not set: */
+       clear_tsk_thread_flag(child, TIF_SINGLESTEP);
+       child_psr->ss = 0;
+       child_psr->tb = 0;
+}
 
-       pt = task_pt_regs(child);
-       sw = (struct switch_stack *) (child->thread.ksp + 16);
+/*
+ * Called by kernel/ptrace.c when detaching..
+ *
+ * Make sure the single step bit is not set.
+ */
+void
+ptrace_disable (struct task_struct *child)
+{
+       user_disable_single_step(child);
+}
 
+long
+arch_ptrace (struct task_struct *child, long request, long addr, long data)
+{
        switch (request) {
-             case PTRACE_PEEKTEXT:
-             case PTRACE_PEEKDATA:
+       case PTRACE_PEEKTEXT:
+       case PTRACE_PEEKDATA:
                /* read word at location addr */
-               urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
-               ret = ia64_peek(child, sw, urbs_end, addr, &data);
-               if (ret == 0) {
-                       ret = data;
-                       /* ensure "ret" is not mistaken as an error code: */
-                       force_successful_syscall_return();
-               }
-               goto out_tsk;
-
-             case PTRACE_POKETEXT:
-             case PTRACE_POKEDATA:
-               /* write the word at location addr */
-               urbs_end = ia64_get_user_rbs_end(child, pt, NULL);
-               ret = ia64_poke(child, sw, urbs_end, addr, data);
-
-               /* Make sure user RBS has the latest data */
-               unw_init_from_blocked_task(&info, child);
-               do_sync_rbs(&info, ia64_sync_user_rbs);
+               if (access_process_vm(child, addr, &data, sizeof(data), 0)
+                   != sizeof(data))
+                       return -EIO;
+               /* ensure return value is not mistaken for error code */
+               force_successful_syscall_return();
+               return data;
 
-               goto out_tsk;
+       /* PTRACE_POKETEXT and PTRACE_POKEDATA is handled
+        * by the generic ptrace_request().
+        */
 
-             case PTRACE_PEEKUSR:
+       case PTRACE_PEEKUSR:
                /* read the word at addr in the USER area */
-               if (access_uarea(child, addr, &data, 0) < 0) {
-                       ret = -EIO;
-                       goto out_tsk;
-               }
-               ret = data;
-               /* ensure "ret" is not mistaken as an error code */
+               if (access_uarea(child, addr, &data, 0) < 0)
+                       return -EIO;
+               /* ensure return value is not mistaken for error code */
                force_successful_syscall_return();
-               goto out_tsk;
+               return data;
 
-             case PTRACE_POKEUSR:
+       case PTRACE_POKEUSR:
                /* write the word at addr in the USER area */
-               if (access_uarea(child, addr, &data, 1) < 0) {
-                       ret = -EIO;
-                       goto out_tsk;
-               }
-               ret = 0;
-               goto out_tsk;
+               if (access_uarea(child, addr, &data, 1) < 0)
+                       return -EIO;
+               return 0;
 
-             case PTRACE_OLD_GETSIGINFO:
+       case PTRACE_OLD_GETSIGINFO:
                /* for backwards-compatibility */
-               ret = ptrace_request(child, PTRACE_GETSIGINFO, addr, data);
-               goto out_tsk;
+               return ptrace_request(child, PTRACE_GETSIGINFO, addr, data);
 
-             case PTRACE_OLD_SETSIGINFO:
+       case PTRACE_OLD_SETSIGINFO:
                /* for backwards-compatibility */
-               ret = ptrace_request(child, PTRACE_SETSIGINFO, addr, data);
-               goto out_tsk;
-
-             case PTRACE_SYSCALL:
-               /* continue and stop at next (return from) syscall */
-             case PTRACE_CONT:
-               /* restart after signal. */
-               ret = -EIO;
-               if (!valid_signal(data))
-                       goto out_tsk;
-               if (request == PTRACE_SYSCALL)
-                       set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               else
-                       clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               child->exit_code = data;
+               return ptrace_request(child, PTRACE_SETSIGINFO, addr, data);
 
-               /*
-                * Make sure the single step/taken-branch trap bits
-                * are not set:
-                */
-               clear_tsk_thread_flag(child, TIF_SINGLESTEP);
-               ia64_psr(pt)->ss = 0;
-               ia64_psr(pt)->tb = 0;
+       case PTRACE_GETREGS:
+               return ptrace_getregs(child,
+                                     (struct pt_all_user_regs __user *) data);
 
-               wake_up_process(child);
-               ret = 0;
-               goto out_tsk;
+       case PTRACE_SETREGS:
+               return ptrace_setregs(child,
+                                     (struct pt_all_user_regs __user *) data);
 
-             case PTRACE_KILL:
-               /*
-                * Make the child exit.  Best I can do is send it a
-                * sigkill.  Perhaps it should be put in the status
-                * that it wants to exit.
-                */
-               if (child->exit_state == EXIT_ZOMBIE)
-                       /* already dead */
-                       goto out_tsk;
-               child->exit_code = SIGKILL;
-
-               ptrace_disable(child);
-               wake_up_process(child);
-               ret = 0;
-               goto out_tsk;
-
-             case PTRACE_SINGLESTEP:
-               /* let child execute for one instruction */
-             case PTRACE_SINGLEBLOCK:
-               ret = -EIO;
-               if (!valid_signal(data))
-                       goto out_tsk;
-
-               clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
-               set_tsk_thread_flag(child, TIF_SINGLESTEP);
-               if (request == PTRACE_SINGLESTEP) {
-                       ia64_psr(pt)->ss = 1;
-               } else {
-                       ia64_psr(pt)->tb = 1;
-               }
-               child->exit_code = data;
-
-               /* give it a chance to run. */
-               wake_up_process(child);
-               ret = 0;
-               goto out_tsk;
-
-             case PTRACE_DETACH:
-               /* detach a process that was attached. */
-               ret = ptrace_detach(child, data);
-               goto out_tsk;
-
-             case PTRACE_GETREGS:
-               ret = ptrace_getregs(child,
-                     &nbs