mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
bitkeeper revision 1.411 (3f592cf2ZW4sVWHIw4rRCGs-4LMYUw)
Update to linux 2.4.22
This commit is contained in:
1 parent
6cfc86805a
commit
514adcf9f1
89 files changed
+1401
-344
No files matched your search
@@ -508,91 +508,91 @@
|
||||
3eb3c87fmKYTC5GCh_rydFakZp9ayw xen/tools/figlet/README
|
||||
3eb3c87fdQKQ5OBGbM-KjZfi9Us4ng xen/tools/figlet/figlet.c
|
||||
3eb3c87fS7DNbg0i6yhFs28UIqAK5g xen/tools/figlet/xen.flf
|
||||
3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.21-sparse/Documentation/Configure.help
|
||||
3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.21-sparse/Makefile
|
||||
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.21-sparse/arch/xeno/Makefile
|
||||
3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.21-sparse/arch/xeno/boot/Makefile
|
||||
3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.21-sparse/arch/xeno/config.in
|
||||
3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.21-sparse/arch/xeno/defconfig
|
||||
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/Makefile
|
||||
3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/balloon.c
|
||||
3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.21-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
|
||||
3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.21-sparse/arch/xeno/drivers/block/Makefile
|
||||
3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.c
|
||||
3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_block.h
|
||||
3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_ide.c
|
||||
3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_scsi.c
|
||||
3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment.c
|
||||
3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.21-sparse/arch/xeno/drivers/block/xl_segment_proc.c
|
||||
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.21-sparse/arch/xeno/drivers/console/Makefile
|
||||
3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.21-sparse/arch/xeno/drivers/console/console.c
|
||||
3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/Makefile
|
||||
3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/dom0_core.c
|
||||
3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.21-sparse/arch/xeno/drivers/dom0/vfr.c
|
||||
3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.21-sparse/arch/xeno/drivers/network/Makefile
|
||||
3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.21-sparse/arch/xeno/drivers/network/network.c
|
||||
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.21-sparse/arch/xeno/kernel/Makefile
|
||||
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.21-sparse/arch/xeno/kernel/entry.S
|
||||
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.21-sparse/arch/xeno/kernel/head.S
|
||||
3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.21-sparse/arch/xeno/kernel/hypervisor.c
|
||||
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.21-sparse/arch/xeno/kernel/i386_ksyms.c
|
||||
3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.21-sparse/arch/xeno/kernel/ioport.c
|
||||
3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.21-sparse/arch/xeno/kernel/irq.c
|
||||
3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.21-sparse/arch/xeno/kernel/ldt.c
|
||||
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.21-sparse/arch/xeno/kernel/process.c
|
||||
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.21-sparse/arch/xeno/kernel/setup.c
|
||||
3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.21-sparse/arch/xeno/kernel/signal.c
|
||||
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.21-sparse/arch/xeno/kernel/time.c
|
||||
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.21-sparse/arch/xeno/kernel/traps.c
|
||||
3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.21-sparse/arch/xeno/lib/Makefile
|
||||
3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.21-sparse/arch/xeno/lib/delay.c
|
||||
3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.21-sparse/arch/xeno/mm/Makefile
|
||||
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.21-sparse/arch/xeno/mm/fault.c
|
||||
3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.21-sparse/arch/xeno/mm/hypervisor.c
|
||||
3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.21-sparse/arch/xeno/mm/init.c
|
||||
3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.21-sparse/arch/xeno/mm/ioremap.c
|
||||
3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.21-sparse/arch/xeno/vmlinux.lds
|
||||
3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.21-sparse/drivers/block/genhd.c
|
||||
3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.21-sparse/drivers/block/ll_rw_blk.c
|
||||
3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.21-sparse/drivers/char/mem.c
|
||||
3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.21-sparse/drivers/char/tty_io.c
|
||||
3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.21-sparse/fs/exec.c
|
||||
3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.21-sparse/fs/partitions/Config.in
|
||||
3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.21-sparse/fs/partitions/Makefile
|
||||
3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.21-sparse/fs/partitions/check.c
|
||||
3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.21-sparse/fs/partitions/xeno.c
|
||||
3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.21-sparse/fs/partitions/xeno.h
|
||||
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.21-sparse/include/asm-xeno/bugs.h
|
||||
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.21-sparse/include/asm-xeno/desc.h
|
||||
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.21-sparse/include/asm-xeno/fixmap.h
|
||||
3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.21-sparse/include/asm-xeno/highmem.h
|
||||
3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.21-sparse/include/asm-xeno/hw_irq.h
|
||||
3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.21-sparse/include/asm-xeno/hypervisor.h
|
||||
3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.21-sparse/include/asm-xeno/irq.h
|
||||
3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.21-sparse/include/asm-xeno/keyboard.h
|
||||
3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.21-sparse/include/asm-xeno/mmu_context.h
|
||||
3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.21-sparse/include/asm-xeno/multicall.h
|
||||
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.21-sparse/include/asm-xeno/page.h
|
||||
3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.21-sparse/include/asm-xeno/pgalloc.h
|
||||
3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.21-sparse/include/asm-xeno/pgtable-2level.h
|
||||
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.21-sparse/include/asm-xeno/pgtable.h
|
||||
3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.21-sparse/include/asm-xeno/proc_cmd.h
|
||||
3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.21-sparse/include/asm-xeno/processor.h
|
||||
3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.21-sparse/include/asm-xeno/ptrace.h
|
||||
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.21-sparse/include/asm-xeno/segment.h
|
||||
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.21-sparse/include/asm-xeno/smp.h
|
||||
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.21-sparse/include/asm-xeno/system.h
|
||||
3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.21-sparse/include/asm-xeno/vga.h
|
||||
3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.21-sparse/include/linux/blk.h
|
||||
3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.21-sparse/include/linux/major.h
|
||||
3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.21-sparse/include/linux/sunrpc/debug.h
|
||||
3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.21-sparse/init/do_mounts.c
|
||||
3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.21-sparse/kernel/panic.c
|
||||
3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.21-sparse/kernel/printk.c
|
||||
3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.21-sparse/lndir-rel
|
||||
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.21-sparse/mkbuildtree
|
||||
3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.21-sparse/mm/memory.c
|
||||
3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.21-sparse/mm/mprotect.c
|
||||
3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.21-sparse/mm/mremap.c
|
||||
3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.21-sparse/mm/swapfile.c
|
||||
3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.21-sparse/mm/vmalloc.c
|
||||
3f05a939TA3SLPY7ZiScMotLjg9owQ xenolinux-2.4.22-sparse/Documentation/Configure.help
|
||||
3e5a4e6589G-U42lFKs43plskXoFxQ xenolinux-2.4.22-sparse/Makefile
|
||||
3e5a4e65IEPjnWPZ5w3TxS5scV8Ewg xenolinux-2.4.22-sparse/arch/xeno/Makefile
|
||||
3e5a4e65n-KhsEAs-A4ULiStBp-r6w xenolinux-2.4.22-sparse/arch/xeno/boot/Makefile
|
||||
3e5a4e65OV_j_DBtjzt5vej771AJsA xenolinux-2.4.22-sparse/arch/xeno/config.in
|
||||
3e5a4e65TNEycLeXqPSXQJQm_xGecA xenolinux-2.4.22-sparse/arch/xeno/defconfig
|
||||
3e6377f5xwPfYZkPHPrDbEq1PRN7uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/Makefile
|
||||
3e6377f8Me8IqtvEhb70XFgOvqQH7A xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/balloon.c
|
||||
3e6377fbMjXWAQd0XN0FWv4fDEo6fg xenolinux-2.4.22-sparse/arch/xeno/drivers/balloon/dom_mem_ops.h
|
||||
3e5a4e65iHEuC5sjFhj42XALYbLVRw xenolinux-2.4.22-sparse/arch/xeno/drivers/block/Makefile
|
||||
3e5a4e65pP5spJErBW69pJxSSdK9RA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
|
||||
3e67f822FOPwqHiaRKbrskgWgoNL5g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.h
|
||||
3e677190SjkzJIvFifRVeYpIZOCtYA xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_ide.c
|
||||
3e677193nOKKTLJzcAu4SYdbZaia8g xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_scsi.c
|
||||
3e676eb5RXnHzSHgA1BvM0B1aIm4qg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment.c
|
||||
3e5d129aDldt6geU2-2SzBae34sQzg xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_segment_proc.c
|
||||
3e5a4e65G3e2s0ghPMgiJ-gBTUJ0uQ xenolinux-2.4.22-sparse/arch/xeno/drivers/console/Makefile
|
||||
3e5a4e651TH-SXHoufurnWjgl5bfOA xenolinux-2.4.22-sparse/arch/xeno/drivers/console/console.c
|
||||
3e5a4e656nfFISThfbyXQOA6HN6YHw xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/Makefile
|
||||
3e5a4e65BXtftInNHUC2PjDfPhdZZA xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/dom0_core.c
|
||||
3e5a4e65gfn_ltB8ujHMVFApnTTNRQ xenolinux-2.4.22-sparse/arch/xeno/drivers/dom0/vfr.c
|
||||
3e5a4e65gZBRBB6RsSVg1c9iahigAw xenolinux-2.4.22-sparse/arch/xeno/drivers/network/Makefile
|
||||
3e5a4e65ZxKrbFetVB84JhrTyZ1YuQ xenolinux-2.4.22-sparse/arch/xeno/drivers/network/network.c
|
||||
3e5a4e65lWzkiPXsZdzPt2RNnJGG1g xenolinux-2.4.22-sparse/arch/xeno/kernel/Makefile
|
||||
3e5a4e65_hqfuxtGG8IUy6wRM86Ecg xenolinux-2.4.22-sparse/arch/xeno/kernel/entry.S
|
||||
3e5a4e65Hy_1iUvMTPsNqGNXd9uFpg xenolinux-2.4.22-sparse/arch/xeno/kernel/head.S
|
||||
3e5a4e65ibVQmwlOn0j3sVH_j_6hAg xenolinux-2.4.22-sparse/arch/xeno/kernel/hypervisor.c
|
||||
3e5a4e65RMGcuA-HCn3-wNx3fFQwdg xenolinux-2.4.22-sparse/arch/xeno/kernel/i386_ksyms.c
|
||||
3e5a4e65MEvZhlr070sK5JsfAQlv7Q xenolinux-2.4.22-sparse/arch/xeno/kernel/ioport.c
|
||||
3e5a4e653U6cELGv528IxOLHvCq8iA xenolinux-2.4.22-sparse/arch/xeno/kernel/irq.c
|
||||
3e5a4e65muT6SU3ck47IP87Q7Ti5hA xenolinux-2.4.22-sparse/arch/xeno/kernel/ldt.c
|
||||
3e5a4e65IGt3WwQDNiL4h-gYWgNTWQ xenolinux-2.4.22-sparse/arch/xeno/kernel/process.c
|
||||
3e5a4e66tR-qJMLj3MppcKqmvuI2XQ xenolinux-2.4.22-sparse/arch/xeno/kernel/setup.c
|
||||
3e5a4e66fWSTagLGU2P8BGFGRjhDiw xenolinux-2.4.22-sparse/arch/xeno/kernel/signal.c
|
||||
3e5a4e66N__lUXNwzQ-eADRzK9LXuQ xenolinux-2.4.22-sparse/arch/xeno/kernel/time.c
|
||||
3e5a4e66aHCbQ_F5QZ8VeyikLmuRZQ xenolinux-2.4.22-sparse/arch/xeno/kernel/traps.c
|
||||
3e5a4e66-9_NczrVMbuQkoSLyXckIw xenolinux-2.4.22-sparse/arch/xeno/lib/Makefile
|
||||
3e5a4e6637ZDk0BvFEC-aFQs599-ng xenolinux-2.4.22-sparse/arch/xeno/lib/delay.c
|
||||
3e5a4e66croVgpcJyJuF2ycQw0HuJw xenolinux-2.4.22-sparse/arch/xeno/mm/Makefile
|
||||
3e5a4e66l8Q5Tv-6B3lQIRmaVbFPzg xenolinux-2.4.22-sparse/arch/xeno/mm/fault.c
|
||||
3e5a4e668SE9rixq4ahho9rNhLUUFQ xenolinux-2.4.22-sparse/arch/xeno/mm/hypervisor.c
|
||||
3e5a4e661gLzzff25pJooKIIWe7IWg xenolinux-2.4.22-sparse/arch/xeno/mm/init.c
|
||||
3f0bed43UUdQichXAiVNrjV-y2Kzcg xenolinux-2.4.22-sparse/arch/xeno/mm/ioremap.c
|
||||
3e5a4e66qRlSTcjafidMB6ulECADvg xenolinux-2.4.22-sparse/arch/xeno/vmlinux.lds
|
||||
3ea53c6em6uzVHSiGqrbbAVofyRY_g xenolinux-2.4.22-sparse/drivers/block/genhd.c
|
||||
3e5a4e66mrtlmV75L1tjKDg8RaM5gA xenolinux-2.4.22-sparse/drivers/block/ll_rw_blk.c
|
||||
3f108aeaLcGDgQdFAANLTUEid0a05w xenolinux-2.4.22-sparse/drivers/char/mem.c
|
||||
3e5a4e66rw65CxyolW9PKz4GG42RcA xenolinux-2.4.22-sparse/drivers/char/tty_io.c
|
||||
3e5a4e669uzIE54VwucPYtGwXLAbzA xenolinux-2.4.22-sparse/fs/exec.c
|
||||
3f05a939l8s0eQb_fpMvYiI06cTGlA xenolinux-2.4.22-sparse/fs/partitions/Config.in
|
||||
3f05a939W65febbeWrBtuQgsQDK2Bg xenolinux-2.4.22-sparse/fs/partitions/Makefile
|
||||
3f05a939phguW4R5PelNQZ8o_EcYZA xenolinux-2.4.22-sparse/fs/partitions/check.c
|
||||
3f05a939ZSKN7gX2sfTLzPcYJvPkcQ xenolinux-2.4.22-sparse/fs/partitions/xeno.c
|
||||
3f05a939_I9vPADPgyVBwUDUxtoeOQ xenolinux-2.4.22-sparse/fs/partitions/xeno.h
|
||||
3e5a4e66wbeCpsJgVf_U8Jde-CNcsA xenolinux-2.4.22-sparse/include/asm-xeno/bugs.h
|
||||
3e5a4e66HdSkvIV6SJ1evG_xmTmXHA xenolinux-2.4.22-sparse/include/asm-xeno/desc.h
|
||||
3e5a4e66SYp_UpAVcF8Lc1wa3Qtgzw xenolinux-2.4.22-sparse/include/asm-xeno/fixmap.h
|
||||
3e5a4e67w_DWgjIJ17Tlossu1LGujQ xenolinux-2.4.22-sparse/include/asm-xeno/highmem.h
|
||||
3e5a4e67YtcyDLQsShhCfQwPSELfvA xenolinux-2.4.22-sparse/include/asm-xeno/hw_irq.h
|
||||
3e5a4e677VBavzM1UZIEcH1B-RlXMA xenolinux-2.4.22-sparse/include/asm-xeno/hypervisor.h
|
||||
3e5a4e673p7PEOyHFm3nHkYX6HQYBg xenolinux-2.4.22-sparse/include/asm-xeno/irq.h
|
||||
3ead095db_LRUXnxaqs0dA1DWhPoQQ xenolinux-2.4.22-sparse/include/asm-xeno/keyboard.h
|
||||
3e5a4e678ddsQOpbSiRdy1GRcDc9WA xenolinux-2.4.22-sparse/include/asm-xeno/mmu_context.h
|
||||
3e7270deQqtGPSnFxcW4AvJZuTUWfg xenolinux-2.4.22-sparse/include/asm-xeno/multicall.h
|
||||
3e5a4e67mnQfh-R8KcQCaVo2Oho6yg xenolinux-2.4.22-sparse/include/asm-xeno/page.h
|
||||
3e5a4e67uTYU5oEnIDjxuaez8njjqg xenolinux-2.4.22-sparse/include/asm-xeno/pgalloc.h
|
||||
3e5a4e67X7JyupgdYkgDX19Huj2sAw xenolinux-2.4.22-sparse/include/asm-xeno/pgtable-2level.h
|
||||
3e5a4e67gr4NLGtQ5CvSLimMYZlkOA xenolinux-2.4.22-sparse/include/asm-xeno/pgtable.h
|
||||
3f108af1qNv8DVSGPv4zpqIU1txCkg xenolinux-2.4.22-sparse/include/asm-xeno/proc_cmd.h
|
||||
3e5a4e676uK4xErTBDH6XJREn9LSyg xenolinux-2.4.22-sparse/include/asm-xeno/processor.h
|
||||
3e5a4e67AJPjW-zL7p-xWuA6IVeH1g xenolinux-2.4.22-sparse/include/asm-xeno/ptrace.h
|
||||
3e5a4e68uJz-xI0IBVMD7xRLQKJDFg xenolinux-2.4.22-sparse/include/asm-xeno/segment.h
|
||||
3e5a4e68Nfdh6QcOKUTGCaYkf2LmYA xenolinux-2.4.22-sparse/include/asm-xeno/smp.h
|
||||
3e5a4e68mTr0zcp9SXDbnd-XLrrfxw xenolinux-2.4.22-sparse/include/asm-xeno/system.h
|
||||
3f1056a9L_kqHcFheV00KbKBzv9j5w xenolinux-2.4.22-sparse/include/asm-xeno/vga.h
|
||||
3f056927gMHl7mWB89rb73JahbhQIA xenolinux-2.4.22-sparse/include/linux/blk.h
|
||||
3e5a4e68WLX3B8owTvktP3HHOtznPQ xenolinux-2.4.22-sparse/include/linux/major.h
|
||||
3e5a4e686V0nioX2ZpFf056sgvdiQw xenolinux-2.4.22-sparse/include/linux/sunrpc/debug.h
|
||||
3e5a4e68W_hpMlM3u_-QOKMp3gzcwQ xenolinux-2.4.22-sparse/init/do_mounts.c
|
||||
3e5a4e68TJJavrunYwTAnLRSBxSYqQ xenolinux-2.4.22-sparse/kernel/panic.c
|
||||
3f1056a9LXNTgSzITNh1mb-MIKV1Ng xenolinux-2.4.22-sparse/kernel/printk.c
|
||||
3eba8f878XjouY21EkQBXwYBsPsipQ xenolinux-2.4.22-sparse/lndir-rel
|
||||
3e6e7c1efbQe93xCvOpOVCnXTMmQ5w xenolinux-2.4.22-sparse/mkbuildtree
|
||||
3e5a4e68GxCIaFH4sy01v1wjapetaA xenolinux-2.4.22-sparse/mm/memory.c
|
||||
3f108af5VxPkLv13tXpXgoRKALQtXQ xenolinux-2.4.22-sparse/mm/mprotect.c
|
||||
3e5a4e681xMPdF9xCMwpyfuYMySU5g xenolinux-2.4.22-sparse/mm/mremap.c
|
||||
3e5a4e683HKVU-sxtagrDasRB8eBVw xenolinux-2.4.22-sparse/mm/swapfile.c
|
||||
3f108af81Thhb242EmKjGCYkjx-GJA xenolinux-2.4.22-sparse/mm/vmalloc.c
|
||||
+980
-142
File diff suppressed because it is too large.
Load diff
@@ -1,6 +1,6 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 21
|
||||
SUBLEVEL = 22
|
||||
EXTRAVERSION = -xeno
|
||||
|
||||
KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||
@@ -45,10 +45,13 @@ DEPMOD = /sbin/depmod
|
||||
MODFLAGS = -DMODULE
|
||||
CFLAGS_KERNEL =
|
||||
PERL = perl
|
||||
AWK = awk
|
||||
RPM := $(shell if [ -x "/usr/bin/rpmbuild" ]; then echo rpmbuild; \
|
||||
else echo rpm; fi)
|
||||
|
||||
export VERSION PATCHLEVEL SUBLEVEL EXTRAVERSION KERNELRELEASE ARCH \
|
||||
CONFIG_SHELL TOPDIR HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
|
||||
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL
|
||||
CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES GENKSYMS MODFLAGS PERL AWK
|
||||
|
||||
all: do-it-all
|
||||
|
||||
@@ -130,14 +133,14 @@ CORE_FILES =kernel/kernel.o mm/mm.o fs/fs.o ipc/ipc.o
|
||||
NETWORKS =net/network.o
|
||||
|
||||
LIBS =$(TOPDIR)/lib/lib.a
|
||||
SUBDIRS =kernel drivers mm fs net ipc lib
|
||||
SUBDIRS =kernel drivers mm fs net ipc lib crypto
|
||||
|
||||
DRIVERS-n :=
|
||||
DRIVERS-y :=
|
||||
DRIVERS-m :=
|
||||
DRIVERS- :=
|
||||
|
||||
DRIVERS-$(CONFIG_ACPI) += drivers/acpi/acpi.o
|
||||
DRIVERS-$(CONFIG_ACPI_BOOT) += drivers/acpi/acpi.o
|
||||
DRIVERS-$(CONFIG_PARPORT) += drivers/parport/driver.o
|
||||
DRIVERS-y += drivers/char/char.o \
|
||||
drivers/block/block.o \
|
||||
@@ -195,6 +198,7 @@ DRIVERS-$(CONFIG_GSC) += drivers/gsc/gscbus.o
|
||||
DRIVERS-$(CONFIG_BLUEZ) += drivers/bluetooth/bluetooth.o
|
||||
DRIVERS-$(CONFIG_HOTPLUG_PCI) += drivers/hotplug/vmlinux-obj.o
|
||||
DRIVERS-$(CONFIG_ISDN_BOOL) += drivers/isdn/vmlinux-obj.o
|
||||
DRIVERS-$(CONFIG_CRYPTO) += crypto/crypto.o
|
||||
|
||||
DRIVERS := $(DRIVERS-y)
|
||||
|
||||
@@ -231,6 +235,7 @@ CLEAN_DIRS = \
|
||||
# files removed with 'make mrproper'
|
||||
MRPROPER_FILES = \
|
||||
include/linux/autoconf.h include/linux/version.h \
|
||||
lib/crc32table.h lib/gen_crc32table \
|
||||
drivers/net/hamradio/soundmodem/sm_tbl_{afsk1200,afsk2666,fsk9600}.h \
|
||||
drivers/net/hamradio/soundmodem/sm_tbl_{hapn4800,psk4800}.h \
|
||||
drivers/net/hamradio/soundmodem/sm_tbl_{afsk2400_7,afsk2400_8}.h \
|
||||
@@ -575,5 +580,5 @@ rpm: clean spec
|
||||
rm $(KERNELPATH) ; \
|
||||
cd $(TOPDIR) ; \
|
||||
. scripts/mkversion > .version ; \
|
||||
rpm -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
|
||||
$(RPM) -ta $(TOPDIR)/../$(KERNELPATH).tar.gz ; \
|
||||
rm $(TOPDIR)/../$(KERNELPATH).tar.gz
|
||||
File renamed without changes.
File renamed without changes.
+3
@@ -165,6 +165,9 @@ if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
|
||||
bool ' Compile the kernel with frame pointers' CONFIG_FRAME_POINTER
|
||||
fi
|
||||
|
||||
source drivers/acpi/Config.in
|
||||
|
||||
endmenu
|
||||
|
||||
source crypto/Config.in
|
||||
source lib/Config.in
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+2
@@ -32,6 +32,7 @@
|
||||
#include <linux/seq_file.h>
|
||||
#include <asm/processor.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/mtrr.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/system.h>
|
||||
@@ -57,6 +58,7 @@ char ignore_irq13; /* set if exception 16 works */
|
||||
struct cpuinfo_x86 boot_cpu_data = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
|
||||
|
||||
unsigned long mmu_cr4_features;
|
||||
//EXPORT_SYMBOL(mmu_cr4_features);
|
||||
|
||||
unsigned char * vgacon_mmap;
|
||||
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+164
-66
@@ -176,11 +176,12 @@ void blk_cleanup_queue(request_queue_t * q)
|
||||
{
|
||||
int count = q->nr_requests;
|
||||
|
||||
count -= __blk_cleanup_queue(&q->rq[READ]);
|
||||
count -= __blk_cleanup_queue(&q->rq[WRITE]);
|
||||
count -= __blk_cleanup_queue(&q->rq);
|
||||
|
||||
if (count)
|
||||
printk("blk_cleanup_queue: leaked requests (%d)\n", count);
|
||||
if (atomic_read(&q->nr_sectors))
|
||||
printk("blk_cleanup_queue: leaked sectors (%d)\n", atomic_read(&q->nr_sectors));
|
||||
|
||||
memset(q, 0, sizeof(*q));
|
||||
}
|
||||
@@ -214,6 +215,24 @@ void blk_queue_headactive(request_queue_t * q, int active)
|
||||
q->head_active = active;
|
||||
}
|
||||
|
||||
/**
|
||||
* blk_queue_throttle_sectors - indicates you will call sector throttling funcs
|
||||
* @q: The queue which this applies to.
|
||||
* @active: A flag indication if you want sector throttling on
|
||||
*
|
||||
* Description:
|
||||
* The sector throttling code allows us to put a limit on the number of
|
||||
* sectors pending io to the disk at a given time, sending @active nonzero
|
||||
* indicates you will call blk_started_sectors and blk_finished_sectors in
|
||||
* addition to calling blk_started_io and blk_finished_io in order to
|
||||
* keep track of the number of sectors in flight.
|
||||
**/
|
||||
|
||||
void blk_queue_throttle_sectors(request_queue_t * q, int active)
|
||||
{
|
||||
q->can_throttle = active;
|
||||
}
|
||||
|
||||
/**
|
||||
* blk_queue_make_request - define an alternate make_request function for a device
|
||||
* @q: the request queue for the device to be affected
|
||||
@@ -389,7 +408,7 @@ void generic_unplug_device(void *data)
|
||||
*
|
||||
* Returns the (new) number of requests which the queue has available.
|
||||
*/
|
||||
int blk_grow_request_list(request_queue_t *q, int nr_requests)
|
||||
int blk_grow_request_list(request_queue_t *q, int nr_requests, int max_queue_sectors)
|
||||
{
|
||||
unsigned long flags;
|
||||
/* Several broken drivers assume that this function doesn't sleep,
|
||||
@@ -399,21 +418,34 @@ int blk_grow_request_list(request_queue_t *q, int nr_requests)
|
||||
spin_lock_irqsave(&io_request_lock, flags);
|
||||
while (q->nr_requests < nr_requests) {
|
||||
struct request *rq;
|
||||
int rw;
|
||||
|
||||
rq = kmem_cache_alloc(request_cachep, SLAB_ATOMIC);
|
||||
if (rq == NULL)
|
||||
break;
|
||||
memset(rq, 0, sizeof(*rq));
|
||||
rq->rq_status = RQ_INACTIVE;
|
||||
rw = q->nr_requests & 1;
|
||||
list_add(&rq->queue, &q->rq[rw].free);
|
||||
q->rq[rw].count++;
|
||||
list_add(&rq->queue, &q->rq.free);
|
||||
q->rq.count++;
|
||||
|
||||
q->nr_requests++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wakeup waiters after both one quarter of the
|
||||
* max-in-fligh queue and one quarter of the requests
|
||||
* are available again.
|
||||
*/
|
||||
|
||||
q->batch_requests = q->nr_requests / 4;
|
||||
if (q->batch_requests > 32)
|
||||
q->batch_requests = 32;
|
||||
q->batch_sectors = max_queue_sectors / 4;
|
||||
|
||||
q->max_queue_sectors = max_queue_sectors;
|
||||
|
||||
BUG_ON(!q->batch_sectors);
|
||||
atomic_set(&q->nr_sectors, 0);
|
||||
|
||||
spin_unlock_irqrestore(&io_request_lock, flags);
|
||||
return q->nr_requests;
|
||||
}
|
||||
@@ -422,23 +454,28 @@ static void blk_init_free_list(request_queue_t *q)
|
||||
{
|
||||
struct sysinfo si;
|
||||
int megs; /* Total memory, in megabytes */
|
||||
int nr_requests;
|
||||
|
||||
INIT_LIST_HEAD(&q->rq[READ].free);
|
||||
INIT_LIST_HEAD(&q->rq[WRITE].free);
|
||||
q->rq[READ].count = 0;
|
||||
q->rq[WRITE].count = 0;
|
||||
int nr_requests, max_queue_sectors = MAX_QUEUE_SECTORS;
|
||||
|
||||
INIT_LIST_HEAD(&q->rq.free);
|
||||
q->rq.count = 0;
|
||||
q->rq.pending[READ] = q->rq.pending[WRITE] = 0;
|
||||
q->nr_requests = 0;
|
||||
|
||||
si_meminfo(&si);
|
||||
megs = si.totalram >> (20 - PAGE_SHIFT);
|
||||
nr_requests = 128;
|
||||
if (megs < 32)
|
||||
nr_requests /= 2;
|
||||
blk_grow_request_list(q, nr_requests);
|
||||
nr_requests = MAX_NR_REQUESTS;
|
||||
if (megs < 30) {
|
||||
nr_requests /= 2;
|
||||
max_queue_sectors /= 2;
|
||||
}
|
||||
/* notice early if anybody screwed the defaults */
|
||||
BUG_ON(!nr_requests);
|
||||
BUG_ON(!max_queue_sectors);
|
||||
|
||||
blk_grow_request_list(q, nr_requests, max_queue_sectors);
|
||||
|
||||
init_waitqueue_head(&q->wait_for_requests);
|
||||
|
||||
init_waitqueue_head(&q->wait_for_requests[0]);
|
||||
init_waitqueue_head(&q->wait_for_requests[1]);
|
||||
spin_lock_init(&q->queue_lock);
|
||||
}
|
||||
|
||||
@@ -491,6 +528,8 @@ void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
|
||||
q->plug_tq.routine = &generic_unplug_device;
|
||||
q->plug_tq.data = q;
|
||||
q->plugged = 0;
|
||||
q->can_throttle = 0;
|
||||
|
||||
/*
|
||||
* These booleans describe the queue properties. We set the
|
||||
* default (and most common) values here. Other drivers can
|
||||
@@ -511,12 +550,29 @@ void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
|
||||
static struct request *get_request(request_queue_t *q, int rw)
|
||||
{
|
||||
struct request *rq = NULL;
|
||||
struct request_list *rl = q->rq + rw;
|
||||
struct request_list *rl = &q->rq;
|
||||
|
||||
if (blk_oversized_queue(q)) {
|
||||
int rlim = q->nr_requests >> 5;
|
||||
|
||||
if (rlim < 4)
|
||||
rlim = 4;
|
||||
|
||||
/*
|
||||
* if its a write, or we have more than a handful of reads
|
||||
* pending, bail out
|
||||
*/
|
||||
if ((rw == WRITE) || (rw == READ && rl->pending[READ] > rlim))
|
||||
return NULL;
|
||||
if (blk_oversized_queue_reads(q))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!list_empty(&rl->free)) {
|
||||
rq = blkdev_free_rq(&rl->free);
|
||||
list_del(&rq->queue);
|
||||
rl->count--;
|
||||
rl->pending[rw]++;
|
||||
rq->rq_status = RQ_ACTIVE;
|
||||
rq->cmd = rw;
|
||||
rq->special = NULL;
|
||||
@@ -527,29 +583,19 @@ static struct request *get_request(request_queue_t *q, int rw)
|
||||
}
|
||||
|
||||
/*
|
||||
* Here's the request allocation design:
|
||||
* Here's the request allocation design, low latency version:
|
||||
*
|
||||
* 1: Blocking on request exhaustion is a key part of I/O throttling.
|
||||
*
|
||||
* 2: We want to be `fair' to all requesters. We must avoid starvation, and
|
||||
* attempt to ensure that all requesters sleep for a similar duration. Hence
|
||||
* no stealing requests when there are other processes waiting.
|
||||
*
|
||||
* 3: We also wish to support `batching' of requests. So when a process is
|
||||
* woken, we want to allow it to allocate a decent number of requests
|
||||
* before it blocks again, so they can be nicely merged (this only really
|
||||
* matters if the process happens to be adding requests near the head of
|
||||
* the queue).
|
||||
*
|
||||
* 4: We want to avoid scheduling storms. This isn't really important, because
|
||||
* the system will be I/O bound anyway. But it's easy.
|
||||
*
|
||||
* There is tension between requirements 2 and 3. Once a task has woken,
|
||||
* we don't want to allow it to sleep as soon as it takes its second request.
|
||||
* But we don't want currently-running tasks to steal all the requests
|
||||
* from the sleepers. We handle this with wakeup hysteresis around
|
||||
* 0 .. batch_requests and with the assumption that request taking is much,
|
||||
* much faster than request freeing.
|
||||
*
|
||||
* There used to be more here, attempting to allow a process to send in a
|
||||
* number of requests once it has woken up. But, there's no way to
|
||||
* tell if a process has just been woken up, or if it is a new process
|
||||
* coming in to steal requests from the waiters. So, we give up and force
|
||||
* everyone to wait fairly.
|
||||
*
|
||||
* So here's what we do:
|
||||
*
|
||||
@@ -561,28 +607,23 @@ static struct request *get_request(request_queue_t *q, int rw)
|
||||
*
|
||||
* When a process wants a new request:
|
||||
*
|
||||
* b) If free_requests == 0, the requester sleeps in FIFO manner.
|
||||
*
|
||||
* b) If 0 < free_requests < batch_requests and there are waiters,
|
||||
* we still take a request non-blockingly. This provides batching.
|
||||
*
|
||||
* c) If free_requests >= batch_requests, the caller is immediately
|
||||
* granted a new request.
|
||||
* b) If free_requests == 0, the requester sleeps in FIFO manner, and
|
||||
* the queue full condition is set. The full condition is not
|
||||
* cleared until there are no longer any waiters. Once the full
|
||||
* condition is set, all new io must wait, hopefully for a very
|
||||
* short period of time.
|
||||
*
|
||||
* When a request is released:
|
||||
*
|
||||
* d) If free_requests < batch_requests, do nothing.
|
||||
* c) If free_requests < batch_requests, do nothing.
|
||||
*
|
||||
* f) If free_requests >= batch_requests, wake up a single waiter.
|
||||
*
|
||||
* The net effect is that when a process is woken at the batch_requests level,
|
||||
* it will be able to take approximately (batch_requests) requests before
|
||||
* blocking again (at the tail of the queue).
|
||||
*
|
||||
* This all assumes that the rate of taking requests is much, much higher
|
||||
* than the rate of releasing them. Which is very true.
|
||||
* d) If free_requests >= batch_requests, wake up a single waiter.
|
||||
*
|
||||
* -akpm, Feb 2002.
|
||||
* As each waiter gets a request, he wakes another waiter. We do this
|
||||
* to prevent a race where an unplug might get run before a request makes
|
||||
* it's way onto the queue. The result is a cascade of wakeups, so delaying
|
||||
* the initial wakeup until we've got batch_requests available helps avoid
|
||||
* wakeups where there aren't any requests available yet.
|
||||
*/
|
||||
|
||||
static struct request *__get_request_wait(request_queue_t *q, int rw)
|
||||
@@ -590,21 +631,37 @@ static struct request *__get_request_wait(request_queue_t *q, int rw)
|
||||
register struct request *rq;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
|
||||
add_wait_queue(&q->wait_for_requests[rw], &wait);
|
||||
add_wait_queue_exclusive(&q->wait_for_requests, &wait);
|
||||
|
||||
do {
|
||||
set_current_state(TASK_UNINTERRUPTIBLE);
|
||||
generic_unplug_device(q);
|
||||
if (q->rq[rw].count == 0)
|
||||
schedule();
|
||||
spin_lock_irq(&io_request_lock);
|
||||
if (blk_oversized_queue(q) || q->rq.count == 0) {
|
||||
__generic_unplug_device(q);
|
||||
spin_unlock_irq(&io_request_lock);
|
||||
schedule();
|
||||
spin_lock_irq(&io_request_lock);
|
||||
}
|
||||
rq = get_request(q, rw);
|
||||
spin_unlock_irq(&io_request_lock);
|
||||
} while (rq == NULL);
|
||||
remove_wait_queue(&q->wait_for_requests[rw], &wait);
|
||||
remove_wait_queue(&q->wait_for_requests, &wait);
|
||||
current->state = TASK_RUNNING;
|
||||
|
||||
return rq;
|
||||
}
|
||||
|
||||
static void get_request_wait_wakeup(request_queue_t *q, int rw)
|
||||
{
|
||||
/*
|
||||
* avoid losing an unplug if a second __get_request_wait did the
|
||||
* generic_unplug_device while our __get_request_wait was running
|
||||
* w/o the queue_lock held and w/ our request out of the queue.
|
||||
*/
|
||||
if (waitqueue_active(&q->wait_for_requests))
|
||||
wake_up(&q->wait_for_requests);
|
||||
}
|
||||
|
||||
/* RO fail safe mechanism */
|
||||
|
||||
static long ro_bits[MAX_BLKDEV][8];
|
||||
@@ -820,7 +877,6 @@ static inline void add_request(request_queue_t * q, struct request * req,
|
||||
void blkdev_release_request(struct request *req)
|
||||
{
|
||||
request_queue_t *q = req->q;
|
||||
int rw = req->cmd;
|
||||
|
||||
req->rq_status = RQ_INACTIVE;
|
||||
req->q = NULL;
|
||||
@@ -830,9 +886,29 @@ void blkdev_release_request(struct request *req)
|
||||
* assume it has free buffers and check waiters
|
||||
*/
|
||||
if (q) {
|
||||
list_add(&req->queue, &q->rq[rw].free);
|
||||
if (++q->rq[rw].count >= q->batch_requests)
|
||||
wake_up(&q->wait_for_requests[rw]);
|
||||
struct request_list *rl = &q->rq;
|
||||
int oversized_batch = 0;
|
||||
|
||||
if (q->can_throttle)
|
||||
oversized_batch = blk_oversized_queue_batch(q);
|
||||
rl->count++;
|
||||
/*
|
||||
* paranoia check
|
||||
*/
|
||||
if (req->cmd == READ || req->cmd == WRITE)
|
||||
rl->pending[req->cmd]--;
|
||||
if (rl->pending[READ] > q->nr_requests)
|
||||
printk("blk: reads: %u\n", rl->pending[READ]);
|
||||
if (rl->pending[WRITE] > q->nr_requests)
|
||||
printk("blk: writes: %u\n", rl->pending[WRITE]);
|
||||
if (rl->pending[READ] + rl->pending[WRITE] > q->nr_requests)
|
||||
printk("blk: r/w: %u + %u > %u\n", rl->pending[READ], rl->pending[WRITE], q->nr_requests);
|
||||
list_add(&req->queue, &rl->free);
|
||||
if (rl->count >= q->batch_requests && !oversized_batch) {
|
||||
smp_mb();
|
||||
if (waitqueue_active(&q->wait_for_requests))
|
||||
wake_up(&q->wait_for_requests);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -903,16 +979,18 @@ static inline void attempt_front_merge(request_queue_t * q,
|
||||
static int __make_request(request_queue_t * q, int rw,
|
||||
struct buffer_head * bh)
|
||||
{
|
||||
unsigned int sector, count;
|
||||
unsigned int sector, count, sync;
|
||||
int max_segments = MAX_SEGMENTS;
|
||||
struct request * req, *freereq = NULL;
|
||||
int rw_ahead, max_sectors, el_ret;
|
||||
struct list_head *head, *insert_here;
|
||||
int latency;
|
||||
elevator_t *elevator = &q->elevator;
|
||||
int should_wake = 0;
|
||||
|
||||
count = bh->b_size >> 9;
|
||||
sector = bh->b_rsector;
|
||||
sync = test_and_clear_bit(BH_Sync, &bh->b_state);
|
||||
|
||||
rw_ahead = 0; /* normal case; gets changed below for READA */
|
||||
switch (rw) {
|
||||
@@ -950,7 +1028,6 @@ static int __make_request(request_queue_t * q, int rw,
|
||||
*/
|
||||
max_sectors = get_max_sectors(bh->b_rdev);
|
||||
|
||||
again:
|
||||
req = NULL;
|
||||
head = &q->queue_head;
|
||||
/*
|
||||
@@ -959,7 +1036,9 @@ again:
|
||||
*/
|
||||
spin_lock_irq(&io_request_lock);
|
||||
|
||||
again:
|
||||
insert_here = head->prev;
|
||||
|
||||
if (list_empty(head)) {
|
||||
q->plug_device_fn(q, bh->b_rdev); /* is atomic */
|
||||
goto get_rq;
|
||||
@@ -978,6 +1057,7 @@ again:
|
||||
req->bhtail = bh;
|
||||
req->nr_sectors = req->hard_nr_sectors += count;
|
||||
blk_started_io(count);
|
||||
blk_started_sectors(req, count);
|
||||
drive_stat_acct(req->rq_dev, req->cmd, count, 0);
|
||||
req_new_io(req, 1, count);
|
||||
attempt_back_merge(q, req, max_sectors, max_segments);
|
||||
@@ -1000,6 +1080,7 @@ again:
|
||||
req->sector = req->hard_sector = sector;
|
||||
req->nr_sectors = req->hard_nr_sectors += count;
|
||||
blk_started_io(count);
|
||||
blk_started_sectors(req, count);
|
||||
drive_stat_acct(req->rq_dev, req->cmd, count, 0);
|
||||
req_new_io(req, 1, count);
|
||||
attempt_front_merge(q, head, req, max_sectors, max_segments);
|
||||
@@ -1032,7 +1113,7 @@ get_rq:
|
||||
* See description above __get_request_wait()
|
||||
*/
|
||||
if (rw_ahead) {
|
||||
if (q->rq[rw].count < q->batch_requests) {
|
||||
if (q->rq.count < q->batch_requests || blk_oversized_queue_batch(q)) {
|
||||
spin_unlock_irq(&io_request_lock);
|
||||
goto end_io;
|
||||
}
|
||||
@@ -1044,6 +1125,9 @@ get_rq:
|
||||
if (req == NULL) {
|
||||
spin_unlock_irq(&io_request_lock);
|
||||
freereq = __get_request_wait(q, rw);
|
||||
head = &q->queue_head;
|
||||
spin_lock_irq(&io_request_lock);
|
||||
should_wake = 1;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
@@ -1066,10 +1150,15 @@ get_rq:
|
||||
req->start_time = jiffies;
|
||||
req_new_io(req, 0, count);
|
||||
blk_started_io(count);
|
||||
blk_started_sectors(req, count);
|
||||
add_request(q, req, insert_here);
|
||||
out:
|
||||
if (freereq)
|
||||
blkdev_release_request(freereq);
|
||||
if (should_wake)
|
||||
get_request_wait_wakeup(q, rw);
|
||||
if (sync)
|
||||
__generic_unplug_device(q);
|
||||
spin_unlock_irq(&io_request_lock);
|
||||
return 0;
|
||||
end_io:
|
||||
@@ -1198,8 +1287,15 @@ void submit_bh(int rw, struct buffer_head * bh)
|
||||
bh->b_rdev = bh->b_dev;
|
||||
bh->b_rsector = bh->b_blocknr * count;
|
||||
|
||||
get_bh(bh);
|
||||
generic_make_request(rw, bh);
|
||||
|
||||
/* fix race condition with wait_on_buffer() */
|
||||
smp_mb(); /* spin_unlock may have inclusive semantics */
|
||||
if (waitqueue_active(&bh->b_wait))
|
||||
wake_up(&bh->b_wait);
|
||||
|
||||
put_bh(bh);
|
||||
switch (rw) {
|
||||
case WRITE:
|
||||
kstat.pgpgout += count;
|
||||
@@ -1352,6 +1448,7 @@ int end_that_request_first (struct request *req, int uptodate, char *name)
|
||||
if ((bh = req->bh) != NULL) {
|
||||
nsect = bh->b_size >> 9;
|
||||
blk_finished_io(nsect);
|
||||
blk_finished_sectors(req, nsect);
|
||||
req->bh = bh->b_reqnext;
|
||||
bh->b_reqnext = NULL;
|
||||
bh->b_end_io(bh, uptodate);
|
||||
@@ -1518,6 +1615,7 @@ EXPORT_SYMBOL(blk_init_queue);
|
||||
EXPORT_SYMBOL(blk_get_queue);
|
||||
EXPORT_SYMBOL(blk_cleanup_queue);
|
||||
EXPORT_SYMBOL(blk_queue_headactive);
|
||||
EXPORT_SYMBOL(blk_queue_throttle_sectors);
|
||||
EXPORT_SYMBOL(blk_queue_make_request);
|
||||
EXPORT_SYMBOL(generic_make_request);
|
||||
EXPORT_SYMBOL(blkdev_release_request);
|
||||
File renamed without changes.
+16
-5
@@ -146,6 +146,7 @@ extern long vme_scc_console_init(void);
|
||||
extern int serial167_init(void);
|
||||
extern long serial167_console_init(void);
|
||||
extern void console_8xx_init(void);
|
||||
extern void au1x00_serial_console_init(void);
|
||||
extern int rs_8xx_init(void);
|
||||
extern void mac_scc_console_init(void);
|
||||
extern void hwc_console_init(void);
|
||||
@@ -158,10 +159,14 @@ extern void rs285_console_init(void);
|
||||
extern void sa1100_rs_console_init(void);
|
||||
extern void sgi_serial_console_init(void);
|
||||
extern void sci_console_init(void);
|
||||
extern void dec_serial_console_init(void);
|
||||
extern void tx3912_console_init(void);
|
||||
extern void tx3912_rs_init(void);
|
||||
extern void txx927_console_init(void);
|
||||
extern void txx9_rs_init(void);
|
||||
extern void txx9_serial_console_init(void);
|
||||
extern void sb1250_serial_console_init(void);
|
||||
extern void arc_console_init(void);
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(a,b) ((a) < (b) ? (a) : (b))
|
||||
@@ -2246,8 +2251,8 @@ void __init console_init(void)
|
||||
con_init();
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_AU1000_SERIAL_CONSOLE
|
||||
au1000_serial_console_init();
|
||||
#ifdef CONFIG_AU1X00_SERIAL_CONSOLE
|
||||
au1x00_serial_console_init();
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_CONSOLE
|
||||
#if (defined(CONFIG_8xx) || defined(CONFIG_8260))
|
||||
@@ -2264,9 +2269,6 @@ void __init console_init(void)
|
||||
#elif defined(CONFIG_SERIAL)
|
||||
serial_console_init();
|
||||
#endif /* CONFIG_8xx */
|
||||
#ifdef CONFIG_SGI_SERIAL
|
||||
sgi_serial_console_init();
|
||||
#endif
|
||||
#if defined(CONFIG_MVME162_SCC) || defined(CONFIG_BVME6000_SCC) || defined(CONFIG_MVME147_SCC)
|
||||
vme_scc_console_init();
|
||||
#endif
|
||||
@@ -2277,6 +2279,9 @@ void __init console_init(void)
|
||||
sci_console_init();
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_DEC_CONSOLE
|
||||
dec_serial_console_init();
|
||||
#endif
|
||||
#ifdef CONFIG_TN3270_CONSOLE
|
||||
tub3270_con_init();
|
||||
#endif
|
||||
@@ -2307,9 +2312,15 @@ void __init console_init(void)
|
||||
#ifdef CONFIG_TXX927_SERIAL_CONSOLE
|
||||
txx927_console_init();
|
||||
#endif
|
||||
#ifdef CONFIG_SERIAL_TXX9_CONSOLE
|
||||
txx9_serial_console_init();
|
||||
#endif
|
||||
#ifdef CONFIG_SIBYTE_SB1250_DUART_CONSOLE
|
||||
sb1250_serial_console_init();
|
||||
#endif
|
||||
#ifdef CONFIG_IP22_SERIAL
|
||||
sgi_serial_console_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct tty_driver dev_tty_driver, dev_syscons_driver;
|
||||
@@ -286,6 +286,8 @@ void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long a
|
||||
pgd_t * pgd;
|
||||
pmd_t * pmd;
|
||||
pte_t * pte;
|
||||
struct vm_area_struct *vma;
|
||||
pgprot_t prot = PAGE_COPY;
|
||||
|
||||
if (page_count(page) != 1)
|
||||
printk(KERN_ERR "mem_map disagrees with %p at %08lx\n", page, address);
|
||||
@@ -303,7 +305,11 @@ void put_dirty_page(struct task_struct * tsk, struct page *page, unsigned long a
|
||||
lru_cache_add(page);
|
||||
flush_dcache_page(page);
|
||||
flush_page_to_ram(page);
|
||||
set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, PAGE_COPY))));
|
||||
/* lookup is cheap because there is only a single entry in the list */
|
||||
vma = find_vma(tsk->mm, address);
|
||||
if (vma)
|
||||
prot = vma->vm_page_prot;
|
||||
set_pte(pte, pte_mkdirty(pte_mkwrite(mk_pte(page, prot))));
|
||||
XENO_flush_page_update_queue();
|
||||
tsk->mm->rss++;
|
||||
spin_unlock(&tsk->mm->page_table_lock);
|
||||
@@ -339,8 +345,8 @@ int setup_arg_pages(struct linux_binprm *bprm)
|
||||
mpnt->vm_mm = current->mm;
|
||||
mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
|
||||
mpnt->vm_end = STACK_TOP;
|
||||
mpnt->vm_page_prot = PAGE_COPY;
|
||||
mpnt->vm_flags = VM_STACK_FLAGS;
|
||||
mpnt->vm_page_prot = protection_map[VM_STACK_FLAGS & 0x7];
|
||||
mpnt->vm_ops = NULL;
|
||||
mpnt->vm_pgoff = 0;
|
||||
mpnt->vm_file = NULL;
|
||||
@@ -558,6 +564,7 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
char * name;
|
||||
int i, ch, retval;
|
||||
struct signal_struct * oldsig;
|
||||
struct files_struct * files;
|
||||
|
||||
/*
|
||||
* Make sure we have a private signal table
|
||||
@@ -566,6 +573,17 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
retval = make_private_signals();
|
||||
if (retval) goto flush_failed;
|
||||
|
||||
/*
|
||||
* Make sure we have private file handles. Ask the
|
||||
* fork helper to do the work for us and the exit
|
||||
* helper to do the cleanup of the old one.
|
||||
*/
|
||||
|
||||
files = current->files; /* refcounted so safe to hold */
|
||||
retval = unshare_files();
|
||||
if(retval)
|
||||
goto flush_failed;
|
||||
|
||||
/*
|
||||
* Release all of the old mmap stuff
|
||||
*/
|
||||
@@ -573,6 +591,8 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
if (retval) goto mmap_failed;
|
||||
|
||||
/* This is the point of no return */
|
||||
steal_locks(files);
|
||||
put_files_struct(files);
|
||||
release_old_signals(oldsig);
|
||||
|
||||
current->sas_ss_sp = current->sas_ss_size = 0;
|
||||
@@ -610,6 +630,8 @@ int flush_old_exec(struct linux_binprm * bprm)
|
||||
return 0;
|
||||
|
||||
mmap_failed:
|
||||
put_files_struct(current->files);
|
||||
current->files = files;
|
||||
flush_failed:
|
||||
spin_lock_irq(¤t->sigmask_lock);
|
||||
if (current->sig != oldsig) {
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -56,7 +56,7 @@ enum fixed_addresses {
|
||||
FIX_BTMAP_END,
|
||||
FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
|
||||
/* our bt_ioremap is permenant unlike other architectures */
|
||||
|
||||
|
||||
__end_of_permanent_fixed_addresses,
|
||||
__end_of_fixed_addresses = __end_of_permanent_fixed_addresses
|
||||
};
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-1
@@ -253,7 +253,7 @@ struct tlb_state
|
||||
{
|
||||
struct mm_struct *active_mm;
|
||||
int state;
|
||||
};
|
||||
} ____cacheline_aligned;
|
||||
extern struct tlb_state cpu_tlbstate[NR_CPUS];
|
||||
|
||||
#endif /* CONFIG_SMP */
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
-12
@@ -81,17 +81,6 @@ extern struct cpuinfo_x86 cpu_data[];
|
||||
#define current_cpu_data boot_cpu_data
|
||||
#endif
|
||||
|
||||
#define cpu_has_pge (test_bit(X86_FEATURE_PGE, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_pse (test_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_pae (test_bit(X86_FEATURE_PAE, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_tsc (test_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_de (test_bit(X86_FEATURE_DE, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_vme (test_bit(X86_FEATURE_VME, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_fxsr (test_bit(X86_FEATURE_FXSR, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_xmm (test_bit(X86_FEATURE_XMM, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_fpu (test_bit(X86_FEATURE_FPU, boot_cpu_data.x86_capability))
|
||||
#define cpu_has_apic (test_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability))
|
||||
|
||||
extern char ignore_irq13;
|
||||
|
||||
extern void identify_cpu(struct cpuinfo_x86 *);
|
||||
@@ -454,7 +443,7 @@ struct microcode {
|
||||
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
|
||||
static inline void rep_nop(void)
|
||||
{
|
||||
__asm__ __volatile__("rep;nop");
|
||||
__asm__ __volatile__("rep;nop" ::: "memory");
|
||||
}
|
||||
|
||||
#define cpu_relax() rep_nop()
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+1
@@ -401,5 +401,6 @@ extern int is_sony_vaio_laptop;
|
||||
|
||||
#define BROKEN_ACPI_Sx 0x0001
|
||||
#define BROKEN_INIT_AFTER_S1 0x0002
|
||||
#define BROKEN_PNP_BIOS 0x0004
|
||||
|
||||
#endif
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
+18
-2
@@ -15,6 +15,7 @@
|
||||
#include <linux/minix_fs.h>
|
||||
#include <linux/ext2_fs.h>
|
||||
#include <linux/romfs_fs.h>
|
||||
#include <linux/cramfs_fs.h>
|
||||
|
||||
#define BUILD_CRAMDISK
|
||||
|
||||
@@ -87,7 +88,7 @@ static struct dev_name_struct {
|
||||
const char *name;
|
||||
const int num;
|
||||
} root_dev_names[] __initdata = {
|
||||
{ "nfs", 0x00ff },
|
||||
{ "nfs", MKDEV(NFS_MAJOR, NFS_MINOR) },
|
||||
{ "hda", 0x0300 },
|
||||
{ "hdb", 0x0340 },
|
||||
{ "loop", 0x0700 },
|
||||
@@ -484,6 +485,7 @@ static int __init crd_load(int in_fd, int out_fd);
|
||||
* minix
|
||||
* ext2
|
||||
* romfs
|
||||
* cramfs
|
||||
* gzip
|
||||
*/
|
||||
static int __init
|
||||
@@ -493,6 +495,7 @@ identify_ramdisk_image(int fd, int start_block)
|
||||
struct minix_super_block *minixsb;
|
||||
struct ext2_super_block *ext2sb;
|
||||
struct romfs_super_block *romfsb;
|
||||
struct cramfs_super *cramfsb;
|
||||
int nblocks = -1;
|
||||
unsigned char *buf;
|
||||
|
||||
@@ -503,6 +506,7 @@ identify_ramdisk_image(int fd, int start_block)
|
||||
minixsb = (struct minix_super_block *) buf;
|
||||
ext2sb = (struct ext2_super_block *) buf;
|
||||
romfsb = (struct romfs_super_block *) buf;
|
||||
cramfsb = (struct cramfs_super *) buf;
|
||||
memset(buf, 0xe5, size);
|
||||
|
||||
/*
|
||||
@@ -532,6 +536,14 @@ identify_ramdisk_image(int fd, int start_block)
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (cramfsb->magic == CRAMFS_MAGIC) {
|
||||
printk(KERN_NOTICE
|
||||
"RAMDISK: cramfs filesystem found at block %d\n",
|
||||
start_block);
|
||||
nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read block 1 to test for minix and ext2 superblock
|
||||
*/
|
||||
@@ -757,7 +769,8 @@ static void __init devfs_make_root(char *name)
|
||||
static void __init mount_root(void)
|
||||
{
|
||||
#ifdef CONFIG_ROOT_NFS
|
||||
if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
|
||||
if (MAJOR(ROOT_DEV) == NFS_MAJOR
|
||||
&& MINOR(ROOT_DEV) == NFS_MINOR) {
|
||||
if (mount_nfs_root()) {
|
||||
sys_chdir("/root");
|
||||
ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;
|
||||
@@ -919,6 +932,8 @@ out:
|
||||
mount_devfs_fs ();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_RAM
|
||||
|
||||
#if defined(BUILD_CRAMDISK) && defined(CONFIG_BLK_DEV_RAM)
|
||||
|
||||
/*
|
||||
@@ -1065,3 +1080,4 @@ static int __init crd_load(int in_fd, int out_fd)
|
||||
}
|
||||
|
||||
#endif /* BUILD_CRAMDISK && CONFIG_BLK_DEV_RAM */
|
||||
#endif /* CONFIG_BLK_DEV_RAM */
|
||||
File renamed without changes.
@@ -560,7 +560,14 @@ void console_unblank(void)
|
||||
{
|
||||
struct console *c;
|
||||
|
||||
acquire_console_sem();
|
||||
/*
|
||||
* Try to get the console semaphore. If someone else owns it
|
||||
* we have to return without unblanking because console_unblank
|
||||
* may be called in interrupt context.
|
||||
*/
|
||||
if (down_trylock(&console_sem) != 0)
|
||||
return;
|
||||
console_may_schedule = 0;
|
||||
for (c = console_drivers; c != NULL; c = c->next)
|
||||
if ((c->flags & CON_ENABLED) && c->unblank)
|
||||
c->unblank();
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -179,11 +179,13 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
|
||||
}
|
||||
|
||||
if (!move_page_tables(current->mm, new_addr, addr, old_len)) {
|
||||
unsigned long vm_locked = vma->vm_flags & VM_LOCKED;
|
||||
|
||||
if (allocated_vma) {
|
||||
*new_vma = *vma;
|
||||
new_vma->vm_start = new_addr;
|
||||
new_vma->vm_end = new_addr+new_len;
|
||||
new_vma->vm_pgoff += (addr - vma->vm_start) >> PAGE_SHIFT;
|
||||
new_vma->vm_pgoff += (addr-vma->vm_start) >> PAGE_SHIFT;
|
||||
new_vma->vm_raend = 0;
|
||||
if (new_vma->vm_file)
|
||||
get_file(new_vma->vm_file);
|
||||
@@ -191,12 +193,15 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
|
||||
new_vma->vm_ops->open(new_vma);
|
||||
insert_vm_struct(current->mm, new_vma);
|
||||
}
|
||||
|
||||
do_munmap(current->mm, addr, old_len);
|
||||
|
||||
current->mm->total_vm += new_len >> PAGE_SHIFT;
|
||||
if (new_vma->vm_flags & VM_LOCKED) {
|
||||
if (vm_locked) {
|
||||
current->mm->locked_vm += new_len >> PAGE_SHIFT;
|
||||
make_pages_present(new_vma->vm_start,
|
||||
new_vma->vm_end);
|
||||
if (new_len > old_len)
|
||||
make_pages_present(new_addr + old_len,
|
||||
new_addr + new_len);
|
||||
}
|
||||
return new_addr;
|
||||
}
|
||||
@@ -522,6 +522,7 @@ static int try_to_unuse(unsigned int type)
|
||||
int i = 0;
|
||||
int retval = 0;
|
||||
int reset_overflow = 0;
|
||||
int shmem;
|
||||
|
||||
/*
|
||||
* When searching mms for an entry, a good strategy is to
|
||||
@@ -600,11 +601,12 @@ static int try_to_unuse(unsigned int type)
|
||||
* Whenever we reach init_mm, there's no address space
|
||||
* to search, but use it as a reminder to search shmem.
|
||||
*/
|
||||
shmem = 0;
|
||||
swcount = *swap_map;
|
||||
if (swcount > 1) {
|
||||
flush_page_to_ram(page);
|
||||
if (start_mm == &init_mm)
|
||||
shmem_unuse(entry, page);
|
||||
shmem = shmem_unuse(entry, page);
|
||||
else
|
||||
unuse_process(start_mm, entry, page);
|
||||
}
|
||||
@@ -621,7 +623,9 @@ static int try_to_unuse(unsigned int type)
|
||||
swcount = *swap_map;
|
||||
if (mm == &init_mm) {
|
||||
set_start_mm = 1;
|
||||
shmem_unuse(entry, page);
|
||||
spin_unlock(&mmlist_lock);
|
||||
shmem = shmem_unuse(entry, page);
|
||||
spin_lock(&mmlist_lock);
|
||||
} else
|
||||
unuse_process(mm, entry, page);
|
||||
if (set_start_mm && *swap_map < swcount) {
|
||||
@@ -670,14 +674,23 @@ static int try_to_unuse(unsigned int type)
|
||||
* read from disk into another page. Splitting into two
|
||||
* pages would be incorrect if swap supported "shared
|
||||
* private" pages, but they are handled by tmpfs files.
|
||||
* Note shmem_unuse already deleted its from swap cache.
|
||||
*
|
||||
* Note shmem_unuse already deleted swappage from cache,
|
||||
* unless corresponding filepage found already in cache:
|
||||
* in which case it left swappage in cache, lowered its
|
||||
* swap count to pass quickly through the loops above,
|
||||
* and now we must reincrement count to try again later.
|
||||
*/
|
||||
if ((*swap_map > 1) && PageDirty(page) && PageSwapCache(page)) {
|
||||
rw_swap_page(WRITE, page);
|
||||
lock_page(page);
|
||||
}
|
||||
if (PageSwapCache(page))
|
||||
delete_from_swap_cache(page);
|
||||
if (PageSwapCache(page)) {
|
||||
if (shmem)
|
||||
swap_duplicate(entry);
|
||||
else
|
||||
delete_from_swap_cache(page);
|
||||
}
|
||||
|
||||
/*
|
||||
* So we could skip searching mms once swap count went
|
||||
@@ -93,7 +93,8 @@ void vmfree_area_pages(unsigned long address, unsigned long size)
|
||||
}
|
||||
|
||||
static inline int alloc_area_pte (pte_t * pte, unsigned long address,
|
||||
unsigned long size, int gfp_mask, pgprot_t prot)
|
||||
unsigned long size, int gfp_mask,
|
||||
pgprot_t prot, struct page ***pages)
|
||||
{
|
||||
unsigned long end;
|
||||
|
||||
@@ -103,9 +104,20 @@ static inline int alloc_area_pte (pte_t * pte, unsigned long address,
|
||||
end = PMD_SIZE;
|
||||
do {
|
||||
struct page * page;
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
page = alloc_page(gfp_mask);
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
|
||||
if (!pages) {
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
page = alloc_page(gfp_mask);
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
} else {
|
||||
page = (**pages);
|
||||
(*pages)++;
|
||||
|
||||
/* Add a reference to the page so we can free later */
|
||||
if (page)
|
||||
atomic_inc(&page->count);
|
||||
|
||||
}
|
||||
if (!pte_none(*pte))
|
||||
printk(KERN_ERR "alloc_area_pte: page already exists\n");
|
||||
if (!page)
|
||||
@@ -117,7 +129,9 @@ static inline int alloc_area_pte (pte_t * pte, unsigned long address,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned long size, int gfp_mask, pgprot_t prot)
|
||||
static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address,
|
||||
unsigned long size, int gfp_mask,
|
||||
pgprot_t prot, struct page ***pages)
|
||||
{
|
||||
unsigned long end;
|
||||
|
||||
@@ -129,7 +143,8 @@ static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned lo
|
||||
pte_t * pte = pte_alloc(&init_mm, pmd, address);
|
||||
if (!pte)
|
||||
return -ENOMEM;
|
||||
if (alloc_area_pte(pte, address, end - address, gfp_mask, prot))
|
||||
if (alloc_area_pte(pte, address, end - address,
|
||||
gfp_mask, prot, pages))
|
||||
return -ENOMEM;
|
||||
address = (address + PMD_SIZE) & PMD_MASK;
|
||||
pmd++;
|
||||
@@ -137,8 +152,11 @@ static inline int alloc_area_pmd(pmd_t * pmd, unsigned long address, unsigned lo
|
||||
return 0;
|
||||
}
|
||||
|
||||
inline int vmalloc_area_pages (unsigned long address, unsigned long size,
|
||||
int gfp_mask, pgprot_t prot)
|
||||
static inline int __vmalloc_area_pages (unsigned long address,
|
||||
unsigned long size,
|
||||
int gfp_mask,
|
||||
pgprot_t prot,
|
||||
struct page ***pages)
|
||||
{
|
||||
pgd_t * dir;
|
||||
unsigned long end = address + size;
|
||||
@@ -155,7 +173,7 @@ inline int vmalloc_area_pages (unsigned long address, unsigned long size,
|
||||
break;
|
||||
|
||||
ret = -ENOMEM;
|
||||
if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot))
|
||||
if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot, pages))
|
||||
break;
|
||||
|
||||
address = (address + PGDIR_SIZE) & PGDIR_MASK;
|
||||
@@ -168,6 +186,12 @@ inline int vmalloc_area_pages (unsigned long address, unsigned long size,
|
||||
return ret;
|
||||
}
|
||||
|
||||
int vmalloc_area_pages(unsigned long address, unsigned long size,
|
||||
int gfp_mask, pgprot_t prot)
|
||||
{
|
||||
return __vmalloc_area_pages(address, size, gfp_mask, prot, NULL);
|
||||
}
|
||||
|
||||
struct vm_struct * get_vm_area(unsigned long size, unsigned long flags)
|
||||
{
|
||||
unsigned long addr, next;
|
||||
@@ -251,7 +275,30 @@ void * __vmalloc (unsigned long size, int gfp_mask, pgprot_t prot)
|
||||
if (!area)
|
||||
return NULL;
|
||||
addr = area->addr;
|
||||
if (vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask, prot)) {
|
||||
if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, gfp_mask,
|
||||
prot, NULL)) {
|
||||
vfree(addr);
|
||||
return NULL;
|
||||
}
|
||||
return addr;
|
||||
}
|
||||
|
||||
void * vmap(struct page **pages, int count,
|
||||
unsigned long flags, pgprot_t prot)
|
||||
{
|
||||
void * addr;
|
||||
struct vm_struct *area;
|
||||
unsigned long size = count << PAGE_SHIFT;
|
||||
|
||||
if (!size || size > (max_mapnr << PAGE_SHIFT))
|
||||
return NULL;
|
||||
area = get_vm_area(size, flags);
|
||||
if (!area) {
|
||||
return NULL;
|
||||
}
|
||||
addr = area->addr;
|
||||
if (__vmalloc_area_pages(VMALLOC_VMADDR(addr), size, 0,
|
||||
prot, &pages)) {
|
||||
vfree(addr);
|
||||
return NULL;
|
||||
}
|
||||