* 2.6.9-rc1-mm1
@ 2004-08-26 8:47 Andrew Morton
2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas
` (8 more replies)
0 siblings, 9 replies; 60+ messages in thread
From: Andrew Morton @ 2004-08-26 8:47 UTC (permalink / raw)
To: linux-kernel
ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/
- nicksched is still here. There has been very little feedback, except that
it seems to slow some workloads on NUMA.
- Added a __must_check to the x86 copy_*_user functions. This means that
with a sufficiently recent gcc, all unchecked copy_*_user() calls will
generate a warning.
I fixed a few things, but binfmt_elf.c is a mess.
It's not clear how to apply the same debug check to put_user() and
friends.
Changes since 2.6.8.1-mm4:
linus.patch
bk-acpi.patch
bk-agpgart.patch
bk-alsa.patch
bk-cifs.patch
bk-dma-declare-coherent-memory.patch
bk-drm.patch
bk-ia64.patch
bk-ieee1394.patch
bk-input.patch
bk-jfs.patch
bk-pnp.patch
bk-power.patch
bk-scsi.patch
bk-usb.patch
Latest versions of external trees
-add_pin_to_irq-section-fix.patch
-procfs-taskname-locking.patch
-fix-reading-string-module-parameters-in-sysfs.patch
-ppc32-remove-hardcoded-offsets-from-ppc-asm.patch
-ppc32-optimize-fix-timer_interrupt-loop.patch
-ppc32-make-ppc40x-large-tlb-mapping-optional.patch
-ppc32-handle-misaligned-string-multiple-insns.patch
-ppc32-emulate-obsolete-instructions.patch
-ppc32-emulate-obsolete-instructions-fix.patch
-ppc32-add-docs-for-ppc-noltlbs-and-nobats-parameters.patch
-ppc32-export-__dma_sync-__dma_sync_page.patch
-ppc32-fix-bug-in-altivec-emulation.patch
-ppc32-fix-booting-on-some-oldwolrd-macs.patch
-ppc32-fix-warnings-on-ebony-mtd-build.patch
-ppc64-reduce-stack-overflow-warning-threshold.patch
-ppc64-remove-old-asm-offsets.patch
-ppc64-set-time-related-systemcfg-fields.patch
-ppc64-include-profilec-in-kernel-irqc.patch
-ppc64-1-4-use-platform-numbering-of-cpus-for-hypervisor-calls.patch
-ppc64-2-4-use-cpu_present_map-in-ppc64.patch
-ppc64-3-4-rework-secondary-smt-thread-setup-at-boot.patch
-ppc64-4-4-remove-unnecessary-cpu-maps.patch
-ppc64-power4-oprofile-update.patch
-ppc64-disable-oprofile-debug-messages.patch
-ppc64-allow-oprofile-module-to-be-safely-unloaded.patch
-ppc64-add-missing-export_symbols-for-oprofile.patch
-ppc64-fix-oprofile-error-messages.patch
-ppc64-set-tbl-it_type-in-iommu-code.patch
-ppc64-dont-call-scheduler-on-offline-cpu.patch
-ppc64-fix-idle-loop-for-offline-cpu.patch
-ppc64-c99-initializers-in-init_thread.patch
-ppc64-log-firmware-errors-during-boot.patch
-ppc64-fix-unbalanced-pci_dev_put-in-eeh-code.patch
-ppc64-reduce-verbosity-of-rtas-error-logs.patch
-ppc64-fix-v_regs-pointer-setup.patch
-ppc64-hvsi-driver.patch
-ppc64-bolted-slb-entry-for-iseries.patch
-ppc64-switch-screen_info-init-to-c99.patch
-ppc64-cpu-death-sched-timeout.patch
-ppc64-memcpy_toio-function-signature.patch
-ppc64-rtas_call-was-calling-kmalloc-too-early.patch
-ppc64-better-little-endian-bitops.patch
-ppc64-iseries-virtual-dvd-ram.patch
-ppc64-extend-ioremap-iounmap-infrastructure.patch
-ppc64-use-correct-buffer-size-in-rtas-call.patch
-ppc64-mf_proc-file-position-fix.patch
-hvcs-fixes-suggested-by-jeff-garzik-on-july-29th.patch
-ibmveth-module-tag-fixes.patch
-ibmveth-race-fix.patch
-ibmveth-hypervisor-retval-fix.patch
-ibmveth-hypervisor-memory-barrier.patch
-i2c-keywestc-build-fix.patch
-alsa-build-fix.patch
-nmi-trigger-switch-support-for-debuggingupdated.patch
-make-i386-die-more-resilient-against-recursive-errors.patch
-fix-visws-kernel-build.patch
-oops-dump-preceding-code.patch
-really-ptrace-single-step-2.patch
-disk-barrier-core.patch
-disk-barrier-ide.patch
-disk-barrier-scsi.patch
-disk-barrier-dm.patch
-disk-barrier-md.patch
-sync_dirty_buffer-retval.patch
-add-bh_eopnotsupp-for-testing.patch
-reiserfs-v3-barrier-support.patch
-ext3-barrier-support.patch
-blk_queue_free_tags-fix.patch
-blk_resize_tags-fix.patch
-blk_queue_tags_resize_failure.patch
-multipath-readahead-fix-fix.patch
-sched-timeslice-fix.patch
-sched-clean-init-idle.patch
-sched-clean-fork.patch
-kernelthread-idle-fix-2.patch
-sched-misc-cleanups-2.patch
-sched-unlikely-rt_task.patch
-sched-misc.patch
-sched-no-balance-clone.patch
-sched-remove-balance-clone.patch
-sched-fork-hotplug-cleanuppatch.patch
-sched-consolidate-sched-domains.patch
-sched-domain-node-span-4.patch
-sched-domain-node-span-4-update.patch
-sched-domain-node-span-4-update-warning-fix.patch
-sched-domain-node-span-4-fix2.patch
-sched-isolated-sched-domains.patch
-create-cpu_sibling_map-for-ppc64.patch
-sched-adjust-p4-per-cpu-gain.patch
-schedstat-v10.patch
-move-config_schedstats-to-arch-ppc64-kconfigdebug.patch
-sched-init_idle-fork_by_hand-consolidation.patch
-sched-sparc32-fix.patch
-schedstat-up-fix.patch
-sched-whitespace-cleanups.patch
-sched-nonlinear-timeslicespatch.patch
-sched-new-task-fix.patch
-release_task-may-sleep.patch
-sched-self-reap-fix.patch
-sched-smt-fixes.patch
-sched-smt-fixes-fix.patch
-memory-backed-inodes-fix.patch
-flexible-mmap-2.6.7-mm3-A8.patch
-flexmmap-patchkit-fix-for-32-bit-emu-for-64-bit-arches.patch
-sysctl-tunable-for-flexmmap.patch
-flex-mmap-for-s390x.patch
-flex-mmap-for-ppc64.patch
-posix-locking-posix_same_owner-fixes.patch
-posix-locking-hook-functions.patch
-posix-locking-nfsv4-server.patch
-posix-locking-lockd-fixes.patch
-posix-locking-lifetime-fixes.patch
-posix-locking-move-file-lock-fields.patch
-posix-locking-filesystems-call-posix_lock_file.patch
-r8169_napi-help-text-2.patch
-no-sysgood-for-ptrace-singlestep.patch
-err2-6-hashbin_remove_this-locking-fix.patch
-dm-use-idr.patch
-ipc-1-3-add-refcount-to-ipc_rcu_alloc.patch
-ipc-2-3-remove-sem_revalidate.patch
-ipc-3-3-enforce-semvmx-limit-for-undo.patch
-cleanup-of-ipc-msgc.patch
-sk98lin-procfs-fix.patch
-uml-base-patch.patch
-uml-remove-cow-driver.patch
-uml-updates-2.patch
-uml-sched-update.patch
-rename-uml-console-device.patch
-uml-readds-just-for-now-ghashh-for-uml.patch
-uml-avoid-that-gcc-breaks-uml-with-unit-at-a-time-compilation-mode.patch
-uml-fixes-an-host-fd-leak-caused-by-hostfs.patch
-uml-adds-legacy_pty-config-option.patch
-uml-makes-make-help-arch=um-work.patch
-uml-fixes-fixdepc-to-support-arch-um-include-uml-configh.patch
-uml-kill-useless-warnings.patch
-uml-avoids-compile-failure-when-host-misses-tkill.patch
-uml-reduces-code-in-_user-files-by-moving-it-in-_kern-files-if-already-possible.patch
-uml-fixes-raw-and-uses-it-in-check_one_sigio-also-fixes-a-silly-panic-eintr-returned-by-call.patch
-uml-folds-hostaudio_userc-into-hostaudio_kernc.patch
-uml-use-ptrace_scemu-the-so-called-sysemu-to-reduce-syscall-cost.patch
-uml-adds-the-nosysemu-command-line-parameter-to-disable-sysemu.patch
-uml-adds-proc-sysemu-to-toggle-sysemu-usage.patch
-uml-fix-for-sysemu-patches.patch
-uml-handles-correctly-errno-==-eintr-in-lots-of-places.patch
-uml-adds-some-exports.patch
-uml-avoids-a-panic-for-a-legal-situation.patch
-uml-removes-dead-code-in-trap_kernc.patch
-uml-make-malloc-call-vmalloc-if-needed-needed-for-hostfs-on-26-host.patch
-uml-little-kmalloc.patch
-uml-fix-os_process_pc-and-os_process_parent-for-corner-cases.patch
-uml-remove-a-group-of-unused-bh-functions.patch
-uml-updates.patch
-uml-fixes.patch
-make-uml-build-and-run.patch
-i810_audio-fix-the-error-path-of-resource-management.patch
-fix-drivers-isdn-hisax-avm_pcic-build-warning-when.patch
-idr-stale-comment.patch
-schedule-profiling.patch
-crc16-renaming-in-via-velocity-ethernet-driver.patch
-per_cpu-per_cpu-cpu_gdt_table.patch
-per_cpu-per_cpu-cpu_gdt_table-fix.patch
-per_cpu-per_cpu-init_tss.patch
-per_cpu-per_cpu-cpu_tlbstate.patch
-gcc35-alps_tdlb7.c.patch
-gcc35-always-inline.patch
-gcc35-auerswald.c.patch
-gcc35-dabusb.c.patch
-gcc35-ds.c.patch
-gcc35-fixmap.h.patch
-gcc35-mtrr.h.patch
-gcc35-sonypi.patch
-gcc35-sp887x.c.patch
-gcc35-tda1004x.c.patch
-gcc35-transport.h.patch
-gcc35-ufs_fs.h.patch
-gcc35-videodev.c.patch
-gcc35-wavefront_fx.c.patch
-net-kconfig-crc16-fix.patch
-preset-loops_per_jiffy-for-faster-booting.patch
-define-inline-as-__attribute__always_inline-also-for-gcc-=-34.patch
-gcc-34-and-broken-inlining.patch
-split-generic_file_aio_write-into-buffered-and-direct-i-o-parts.patch
-making-i-dhash_entries-cmdline-work-as-it-use-to.patch
-making-i-dhash_entries-cmdline-work-as-it-use-to-fix.patch
-send_IPI_mask_bitmask-build-fix.patch
-e1000-build-fix.patch
-e1000-inlining-fix.patch
-enable-all-events-for-initramfs.patch
-arch-i386-kernel-smpc-gcc341-inlining-fix.patch
-268-rc2-mm2-warning-on-numa-q.patch
-was-removal-of-sync-in-panic.patch
-move-cache_reap-out-of-timer-context.patch
-gettimeofday-nanoseconds-patch-makes-it-possible-for-the-posix-timer.patch
-x86-64-singlestep-through-sigreturn-system-call-2.patch
-remove-dead-prototypes.patch
-s390-use-include-asm-generic-dma-mapping-brokenh.patch
-cdrom-get_last_written-fix.patch
-get_random_bytes-returns-the-same-on-every-boot.patch
-locking-optimization-for-cache_reap.patch
-signal-race-fix.patch
-signal-race-fix-ia64.patch
-signal-race-fix-s390.patch
-signal-race-fix-x86_64.patch
-ppc-signal-handling-fixes.patch
-signal-race-fixes-sparc-sparc64.patch
-signal-race-fixes-ppc64.patch
-signal-race-fix-alpha.patch
-move-pit-code-to-timer_pit.patch
-i2o-build_111.patch
-i2o-build_111-build-fix.patch
-i2o-add-functionality-to-scsi_add_device-to-preset-hostdata.patch
-i2o-remove-on-demand-allocation-of-scsi_hosts-in-i2o_scsi.patch
-i2o-run-linux-i2oh-and-linux-i2o-devh-through-lindent.patch
-i2o-fixes-compiler-warning-on-x86_64-in-i2o_config.patch
-i2o-removes-multiplexer-notification-and-use-type-safe.patch
-i2o-maintainer.patch
-apic-output-reduction.patch
-make-shrinker_sem-an-rwsem.patch
-break-out-zone-free-list-initialization.patch
-radeonfb-cleanup-and-little-fixes.patch
-rivafb-i2c-fixes.patch
-fbmon-edd-blacklist.patch
-fbcon-differentiate-bits_per_pixel-from-color-depth.patch
-fbdev-set-color-fields-correctly.patch
-fbdev-attn-maintainers-set-correct-hardware-capabilities.patch
-rivafb-do-not-tap-vga-ports-if-not-x86.patch
-i810fb-fixes.patch
-fbdev-find-correct-logo-for-directcolor-24bpp.patch
-rivafb-kill-riva_chip_info-and-riva_chips.patch
-include-compilerh-in-videodevh.patch
-fbdev-kconfig-dependency-fix.patch
-video-mode-handling-linked-list-of-video-modes.patch
-video-mode-handling-save-per-display-graphics-display-settings.patch
-video-mode-handling-delete-entries-from-mode-list.patch
-video-mode-handling-reduce-memory-footprint-of-fbdev.patch
-fbdev-do-the-deletion-of-mode-entries-at-fbdev-level.patch
-fbdev-support-for-bold-attribute-for-monochrome-framebuffers.patch
-fbdev-use-8-bit-dac-for-capable-hardware.patch
-rivafb-directcolor-mode-and-miscellaneous-fixes.patch
-epson1355fb-salvage-epson1355-code-from-james-tree.patch
-neofb-salvage-neofb-from-james-tree.patch
-neofb-build-fix.patch
-sgivwfb-salvage-sgivwfb-from-james-tree.patch
-tdfxfb-salvage-tdfxfb-from-james-tree.patch
-net-smc9194c-fix-inline-compile-errors-fwd.patch
-net-hamachic-remove-bogus-inline-at-function-prototype.patch
-net-rrunnerc-fix-inline-compile-error.patch
-istallion-remove-inlines.patch
-mxserc-fix-inlines-fwd.patch
-radio-maestroc-remove-an-inline-fwd.patch
-net-tulip-dmfec-fix-inline-compile-errors-fwd.patch
-fix-inlining-errors-in-drivers-scsi-aic7xxx-aic79xx_osmc.patch
-fix-inline-related-gcc-34-build-failures-in.patch
-igxb_main-gcc-34-build-fix.patch
-ext2_readdir-filp-f_pos-fix.patch
-do_general_protection-doesnt-disable-irq.patch
-proc_pid_cmdline-race-fix.patch
-support-for-exar-xr17c158-octal-uart.patch
-x86_64-merge-2.patch
-x86_64-merge-2-build-fix.patch
-fix-o=-compilation-on-x86-64.patch
-altix-system-controller-communication-driver.patch
-snsc-build-fix.patch
-more-altix-system-controller-changes.patch
-altix-system-controller-fixes.patch
-move-duplicate-bug-and-warn_on-bits-to-asm-generic.patch
-move-duplicate-bug-and-warn_on-bits-to-asm-generic-fix.patch
-fix-con_buf_size-usage.patch
-vprintk-support.patch
-vprintk-for-ext2-errors.patch
-vprintk-for-ext3-errors.patch
-prio_tree-kill-vma_prio_tree_init.patch
-prio_tree-iterator-vma_prio_tree_next-cleanup.patch
-rcu-cpu-offline-cleanup.patch
-rcu-rcu-cpu-offline-fix.patch
-rcu-low-latency-rcu.patch
-rcu-clean-up-code.patch
-rcu-fix-spaces-in-rcupdateh.patch
-rcu-introduce-call_rcu_bh.patch
-rcu-use-call_rcu_bh-in-route-cache.patch
-rcu-document-rcu-api.patch
-rcu-abstracted-rcu-dereferencing.patch
-alpha-print-the-symbol-of-pc-and-ra-during-oops.patch
-first-next_cpu-returns-values-nr_cpus.patch
-drivers-net-wan-cycx_x25c189-warning-conflicting-types.patch
-watchdog-fix-warning-defined-but-not-used.patch
-token-based-thrashing-control.patch
-writeback-page-range-hint.patch
-fix-writeback-page-range-to-use-exact-limits.patch
-mpage-writepages-range-limit-fix.patch
-filemap_fdatawrite-range-interface.patch
-concurrent-o_sync-write-support.patch
-nfsd-force-server-side-tcp-when-nfsv4-enabled.patch
-nfsd-nfsd-is-missing-a-put_group_info-in-the-auth_null.patch
-nfsd-make-cache_init-initialize-reference-count-to-1.patch
-nfsd-simplify-auth_domain_lookup.patch
-nfsd-fix-ip_map-cache-reference-count-leak.patch
-nfsd-basic-v4-acl-definitions.patch
-nfsd-posix-nfsv4-acl-translation-for-nfsd.patch
-nfsd-acl-support-for-the-nfsv4-server.patch
-knfsd-fix-brokenness-with-fsid=-export-option.patch
-knfsd-get-rid-of-open_private_file.patch
-knfsd-minor-memory-leak-fix.patch
-knfsd-fix-two-xdr-encode-bugs-for-readdirplus-reply.patch
-knfsd-fix-race-with-flushing-nfsd-cache.patch
-knfsd-server-permissions-fix.patch
-cdrom-event-notification-fixes.patch
-new-device-driver-to-enable-the-ibm-multiport-serial-adapter.patch
-iteraid.patch
-kill-udf-registration-unregistration-messages.patch
-sparc-remove-undefined-symbol.patch
-nbd-fix-struct-request-race-condition.patch
-profile-consolidate-prof_cpu_mask.patch
-profile-introduce-profile_pc.patch
-profile-consolidate-hit-count-increments-in-profile_tick.patch
-profile-move-profile_operations.patch
-profile-make-private-profile-state-static.patch
-profile-make-prof_buffer-atomic_t.patch
-remove-iseries-profiling.patch
-ipmi-watchdog-patch.patch
-ipmi-driver-updates.patch
-ipmi-driver-updates-build-fix.patch
-dio-bio-sizing-fix.patch
-dio-pages-in-io-accounting-fix.patch
-is_err-is-unlikely.patch
-is_err-unlikeliness-cleanup.patch
-fix-netpoll-cleanup-on-abort-without-dev.patch
-aioc-rename-struct-timeout-to-struct-aio_timeout.patch
-fix-compiling-oldconfig-with-gcc-35.patch
-dont-pass-mem_map-into-init-functions.patch
-might-sleep-in-atomic-while-dumping-elf.patch
-awe_wave-oss-too-much-__exit.patch
-mark-loop_change_fd-as-an-ulong-compat-ioctl.patch
-readahead-simplification.patch
-consolidated-readahead-fixes.patch
-mlock-as-user-for-268-rc2-mm2.patch
-increase-mlock-limit-to-32k.patch
-idt77252c-add-missing-pci_enable_device.patch
-ip2mainc-add-missing-pci_enable_device.patch
-tpam_mainc-add-missing-pci_enable_device.patch
-ibmasm-add-missing-pci_enable_device.patch
-hp100c-add-missing-pci_enable_device.patch
-ioc3-ethc-add-missing-pci_enable_device.patch
-de4x5c-add-missing-pci_enable_device.patch
-cpqfc-add-missing-pci_enable_device.patch
-fix-gcc-35-compile-issue-in-mm-mempolicyc.patch
-eata_pio-warning-fix.patch
-via-agpc-resume-suspend-support.patch
-collected-aio-retry-fixes-and-enhancements.patch
-aio-splice-runlist-for-fairness-across-io-contexts.patch
-aio-workqueue-context-switch-reduction.patch
-make-max_init_args-25.patch
-request_region-for-winbond-and-smsc-parport-drivers.patch
-make-md-no-device-warning-kern_warning.patch
-ia64-dma_mapping-fix.patch
-automatically-enable-bigsmp-on-big-hp-machines.patch
-fix-proc-pid-statm-documentation.patch
-cciss-update-fixes-to-32-64-bit-conversions.patch
-cciss-updates-zero-out-buffer-in-passthru-ioctls-for-hp.patch
-cciss-updates-proc-fixes-for-268-rc3.patch
-cciss-updates-cylinder-calculation-fix-for-268-rc3.patch
-cciss-updates-id-change-for-v100-controller-for-268-rc3.patch
-cciss-updates-id-change-for-v100-controller-for-268-rc3-fix.patch
-cciss-updates-pdev-intr-fix-for-268-rc3.patch
-cciss-update-7-read_ahead-bumped-to-1024.patch
-cciss-update-8-maintainers-update-for-hp.patch
-cciss-congig-dependency-fix.patch
-rmaplock-1-5-pageanon-in-mapping.patch
-rmaplock-2-5-kill-page_map_lock.patch
-rmaplock-3-5-slab_destroy_by_rcu.patch
-rmaplock-4-5-mm-lock-ordering.patch
-rmaplock-5-5-swapoff-use-anon_vma.patch
-x86-bitopsh-commentary-on-instruction-reordering.patch
-clarify-get_task_mm-mmgrab.patch
-simple-fs-stop-ve-dentries.patch
-8139too-rx-fifo-overflow-recovery.patch
-8139too-be-sure-to-progress-durin-rtl8139_rx.patch
-via-velocity-more-inetaddr_notifier-fix.patch
-vm-tune-writeback.patch
-alloc-pages-watermark-fixes.patch
-alloc-pages-priority-tuning.patch
-fix-d_path-errors.patch
-emu10k1-maintainer-update.patch
-ptr_ok-cleanup.patch
-mpage_readpage-unable-to-handle-bigger-requests.patch
-improve-speed-of-freeing-bootmem.patch
-consolidate-clone_idletask-masking.patch
-kill-clone_idletask.patch
-oprofile-xscale-fixes-for-pxa270-xscale2.patch
-remove-magic-1-from-shm-segment-count.patch
-via-rhine-suspend-resume-support.patch
-via-rhine-de-isolate-phy.patch
-via-rhine-small-fixes.patch
-fix-i386-x86_64-idle-routine-selection.patch
-fix-i386-x86_64-idle-routine-selection-comment-updates.patch
-#fix-some-signed-ints-that-should-be-unsigned.patch
-x86-pae-swapspace-expansion.patch
-executable-hugetlb-pages.patch
-md-fix-problems-with-checksum-handling-in-md-superblocks.patch
-sk98lin-no-procfs-build-fix.patch
-fix-net-hamradio-dmascc-with-gcc-34-fwd.patch
-fix-warnings-in-es7000.patch
-reduce-aacraid-namespace-pollution.patch
-reduce-bkl-usage-in-do_coredump.patch
-apm_infodisabled-fix.patch
-267-rc3-mm2-inlining-failures.patch
-high2lowuid-warning-fix.patch
-new-cpu_has_-flags.patch
-get_nodes-mask-miscalculation.patch
-use-posix-headers-in-sumversionc.patch
-x86-esr-print-quietness.patch
-intel8x0c-sound-use-pci_vendor_id-rather-than-bare-numbers.patch
-fix-rxrpc-compile-errors-with-sysctl=n.patch
-ix86x86_64-cpu-features.patch
-libfs-move-transaction-file-ops-into-libfs.patch
-dont-print-per-cpu-delay-loop-calibration.patch
-fix-sn_console-for-config_smp=n.patch
-via-velocity-wrong-module-name-in-kconfig-documentation.patch
-reduce-ptyc-ifdef-clutter.patch
-bug-on-inconsistant-dcache-tree-in-may_delete.patch
-remove-dead-config_kernel_elf-kconfig-entry.patch
-fix-some-comments-about-epoch-in-arch-alpha-kernel-timec.patch
-small-simplification-for-two-security-dependencies.patch
-configurable-selinux-bootparam-value.patch
-fix-typos-in-security-securityc.patch
-use-simple_read_from_buffer-in-selinuxfs.patch
-use-simple_read_from_buffer-in-proc_info_read-and-proc_pid_attr_read.patch
-fw-new-linux-268-rc4-mm1-ipv6-in-ipv6-undefined-references.patch
-ttys0-vs-ttys00-confusion.patch
-reduce-size-of-struct-buffer_head-on-64bit.patch
-reduce-size-of-struct-dentry-on-64bit.patch
-remove-cacheline-alignment-from-inode-slabs.patch
-read-cpumasks-every-time-when-exporting-through-sysfs.patch
-centralize-i386-constants.patch
-fix-permissions-on-module_param-usage.patch
-module-parameters-in-sysfs-for-built-in-modules.patch
-remove-module_parm-from-main-part-of-kernel.patch
-filemap_index_overflow.patch
-synclinkc-replace-syncppp-with-genhdlc.patch
-synclinkmpc-replace-syncppp-with-genhdlc.patch
-synclink_csc-replace-syncppp-with-genhdlc.patch
-reiserfs-xattr-acl-fixes.patch
-files-up-to-4-gb-support-for-iso9660-filesystems.patch
-selinux-add-null-device-node-to-selinuxfs-remove-open_devnull.patch
-selinux-revalidate-access-to-controlling-tty.patch
-selinux-defer-inode-security-initialization.patch
-selinux-fix-name_bind-audit.patch
-reduce-selinux-kernel-memory-use-on-64-bit-systems.patch
-remove-last-suser-call-drivers-char-rocketc.patch
-add-pci-dependencies-to-drivers-media-dvb-ttpci-kconfig.patch
-compat_do_execve-fix.patch
-fix-4k-ext2fs-support-in-26-initrds.patch
-coding-style-do_thisab-vs-do_thisa-b.patch
-typo-in-laptop_modetxt.patch
-tainted-sysctl-permissions-fix.patch
-s390-core-changes.patch
-s390-zfcp-host-adapter.patch
-s390-lcs-network-driver.patch
-bio_uncopy_user-mem-leak.patch
-bio_uncopy_user-mem-leak-fix.patch
-notify_parent-cleanup.patch
-remove-notify_parent.patch
-i386-unbusy-tss-cleanup.patch
-proc-pid-cmdline-truncates-arguments-early.patch
-update-aci-mixer-driver-webpage.patch
-remove-read-only-immutable-checks-from-fat_truncate.patch
-ext3-documentation.patch
-ad1816-sound-driver-web-page-and-email-address.patch
-firmware-loader-is-orphan.patch
-remove-struct-bus_type-add.patch
-file_ra_state_init-speedup.patch
-dev-random-fix-latency-in-rekeying-sequence-number.patch
-dev-random-add-pool-name-to-entropy-store.patch
-dev-random-use-separate-entropy-store-for-dev-urandom.patch
-dev-random-remove-rndgetpool-ioctl.patch
-fix-bad-url-in-bsd-acct-help-entry.patch
-dothan-speedstep-fix.patch
-shows-active-inactive-on-per-node-meminfo.patch
-shows-active-inactive-on-per-node-meminfo-speedup.patch
-minix-nblocks-retval-fix.patch
-usercopy-return-EFAULT.patch
-intel8x0-latency-fix.patch
-inode-time-update-funnies-in-ncpfs.patch
-fix-oprofile-events-with-zero-event-values.patch
-pci-driver-function-documentation-fix.patch
-vlan-missing-kconfig-help.patch
-remove-obsolete-htab-reclaim-in-documentation-sysctl-kerneltxt.patch
-remove-obsolete-zero-paged-in-documentation-sysctl-kerneltxt.patch
-legousbtower-module_param-fix.patch
Merged
-context-switching-overhead-in-x-ioport.patch
Dropped - still in progress.
+auth_unix_lookup-oops-fix.patch
+auth_unix_lookup-oops-fix-fix.patch
NFS fixes
+fix-show_mem-on-discontig-machines.patch
show_mem() fix
+fix-sysrq-support-in-sn_consolec.patch
SN console sysrq fix
+request_region-for-winbond-and-smsc-parport-drivers.patch
resource allocation fix
+md-fix-problems-with-checksum-handling-in-md-superblocks.patch
MD checksumming fix (rejected by Linus. Placeholder)
+scheduler-profiling.patch
+consolidate-prof_cpu_mask.patch
+introduce-profile_pc.patch
+consolidate-hit-count-increments-in-profile_tick.patch
+move-profile_operations.patch
+make-private-profile-state-static.patch
+make-prof_buffer-atomic_t.patch
+remove-iseries-profiling.patch
Updated profiling patch series
+reduce-size-of-struct-inode-on-64bit.patch
Pack inodes better.
+ppc32-refactor-common-book-e-exception-handling-macros.patch
+ppc64-clean-up-unused-macro.patch
ppc fixes
+lockmeter-for-x86_64.patch
Implement lockmeter on x86_64
+make-perfctr_virtual-default-in-kconfig-match-recommendation.patch
perfctr Kconfig fix
+linux-2.6.8.1-49-rpc_workqueue.patch
+linux-2.6.8.1-50-rpc_queue_lock.patch
NFS updates
+add-some-key-management-specific-error-codes.patch
Add new errno codes for the key management stuff
+mostly-remove-module_parm.patch
module_parm() removals
+assign_irq_vector-section-fix.patch
+find_isa_irq_pin-should-not-be-__init.patch
Some functions can no longer be in __init with kexec
-kexec-i8259-sysfsx86_64.patch
-kexec-x86_64-i8259-fixes.patch
These were unneeded
+kexec-i8259-shutdown-x86_64.patch
Implement 8259 shutdown handlers on x86_64
+cpusets-config_cpusets-depends-on-smp.patch
+cpusets-tasks-file-simplify-format-fixes.patch
+cpusets-simplify-memory-generation.patch
cpusets stuff
+reiser4-prefetch-warning-fix.patch
+reiser4-mode-fix.patch
+reiser4-get_context_ok-warning-fixes.patch
reiser4 fixlets
+split-timer-resources.patch
timer reosurce allocation fix
+reduce-casting-in-sysenterc.patch
+cast-page_offset-math-to-void-in-early-printk.patch
+call-virt_to_page-with-void-not-ul.patch
+vmalloc_fault-cleanup.patch
+dont-align-virt_to_page-args.patch
cleanups
+include-asm-pageh-for-virt_to_page.patch
build fix
+task_vsize-locking-cleanup.patch
+task_vsize-locking-cleanup-warning-fix.patch
+o1-proc_pid_statm.patch
+o1-proc_pid_statm-fix.patch
+task-statm-no-procfs-fix.patch
+task-statm-reserved-fix.patch
+task-statm-dontcopy-fix.patch
Various speedups and fixups for /proc/pid/statm and related areas
+r8169-add-ethtool_opsget_regs_len-get_regs.patch
+r8169-per-device-receive-buffer-size.patch
+r8169-code-cleanup.patch
+r8169-enable-mwi.patch
+r8169-bump-version-number.patch
+r8169-sync-the-names-of-a-few-bits-with-the-8139cp-driver.patch
+r8169-comment-a-gcc-295x-bug.patch
+r8169-tx-checksum-offload.patch
+r8169-advertise-dma-to-high-memory.patch
+r8169-rx-checksum-support.patch
+r8169-vlan-support.patch
net driver updates
+sane-mlock_limit.patch
Make the default non-priv mlock limit sensible on larger PAGE_SIZE
+lanana-maintainer-devicestxt-patch-1-2.patch
LANANA has a new owner
+lanana-maintainer-devicestxt-2.patch
sync up devices.txt
+netmos-9805-parport-interface.patch
parport driver device support
+s390-lcs-network-driver.patch
+s390-common-i-o-layer.patch
+s390-sclp-driver-changes.patch
+s390-qeth-network-driver.patch
s390 udpates
+269-rc1-ifdef-fixes-for-drivers-isdn-hifax.patch
+269-rc1-ifdef-cleanup-for-sh64.patch
+269-rc1-ifdef-cleanup-for-cris-port.patch
+269-rc1-ifdef-cleanup-for-ppc.patch
+269-rc1-ifdef-cleanups-in-drivers-net.patch
+make-oom-killer-points-unsigned-long.patch
cleanups
+dvb-pci_enable_device-fix.patch
Fix a dvb driver's pci handling
+copying-unaligned-data-across-user-kernel-boundary.patch
Fix compat-mode directory copying
+re-fix-pagecache-reading-off-by-one.patch
+re-fix-pagecache-reading-off-by-one-cleanup.patch
Fix the off-by-one in the pagecache read() function again
+waitqueue_debug-crapectomy.patch
cleanup
+ftape-support-for-x86_64.patch
Add ftape support for x86_64
+keep-sparc32-config-consistent.patch
sparc32 Kconfig fix
+fix-typo-in-bw2c.patch
Fix some typo
+interrupt-is-enabled-before-it-should-be-when-kernel-is-booted.patch
Avoid possible early-boot lockups
+hvcs-hotplug-fixes.patch
Fix HVCS driver
+amiga-partition-reading-fix.patch
Fix parsing of Amiga partition tables
+problem-with-sis900-unknown-phy.patch
sis900 fix
+kallsyms-data-size-reduction--lookup-speedup.patch
Use smarter searching and sorting to speed up /proc/kallsyms a lot
+prevent-memory-leak-in-devpts.patch
dentry leak fix
+revert-ioc_eth3-pci_enable_device-changes.patch
+fix-hp100c-for-pci_enable_device-changes.patch
Fix these drivers for recent ill-advised PCI API updates
+x86_64-vs-select-fix.patch
Fix a symbol clash
+must_check-copy_to_user.patch
Add __must_check to x86 copy_*_user() functions
+copy_to_user-checking.patch
+sym_requeue_awaiting_cmds-uninit-var-fix.patch
+de4x5-idiocy-fix.patch
Fix some fallout from the above
number of patches in -mm: 310
number of changesets in external trees: 648
number of patches in -mm only: 296
total patches: 944
All patches:
linus.patch
auth_unix_lookup-oops-fix.patch
auth_unix_lookup() oops fix
auth_unix_lookup-oops-fix-fix.patch
auth_unix_lookup-oops-fix fix
fix-show_mem-on-discontig-machines.patch
fix show_mem on discontig machines
fix-sysrq-support-in-sn_consolec.patch
fix sysrq support in sn_console.c
request_region-for-winbond-and-smsc-parport-drivers.patch
request_region for winbond and smsc parport drivers
md-fix-problems-with-checksum-handling-in-md-superblocks.patch
md: fix problems with checksum handling in MD superblocks.
sysfs-backing-store-prepare-file_operations.patch
sysfs backing store - prepare sysfs_file_operations helpers
sysfs-backing-store-prepare-file_operations-fix.patch
fix oops with firmware loading
sysfs-backing-store-add-sysfs_dirent.patch
sysfs backing store - add sysfs_direct structure
sysfs-backing-store-use-sysfs_dirent-tree-in-removal.patch
sysfs backing store: use sysfs_dirent based tree in file removal
sysfs-backing-store-use-sysfs_dirent-tree-in-dir-file_operations.patch
sysfs backing store: use sysfs_dirent based tree in dir file operations
sysfs-backing-store-stop-pinning-dentries-inodes-for-leaves.patch
sysfs backing store: stop pinning dentries/inodes for leaf entries
scheduler-profiling.patch
schedule profileing
consolidate-prof_cpu_mask.patch
consolidate prof_cpu_mask
introduce-profile_pc.patch
introduce profile_pc()
consolidate-hit-count-increments-in-profile_tick.patch
consolidate hit count increments in profile_tick()
move-profile_operations.patch
move profile_operations
make-private-profile-state-static.patch
make private profile state static
make-prof_buffer-atomic_t.patch
make prof_buffer atomic_t
remove-iseries-profiling.patch
ppc64: remove iseries profiling
bk-acpi.patch
bk-agpgart.patch
bk-alsa.patch
bk-cifs.patch
bk-dma-declare-coherent-memory.patch
bk-drm.patch
bk-ia64.patch
bk-ieee1394.patch
bk-input.patch
bk-jfs.patch
bk-pnp.patch
bk-power.patch
bk-scsi.patch
bk-usb.patch
mm.patch
add -mmN to EXTRAVERSION
mm-swsusp-make-sure-we-do-not-return-to-userspace-where-image-is-on-disk.patch
-mm swsusp: make sure we do not return to userspace where image is on disk
mm-swsusp-copy_page-is-harmfull.patch
-mm swsusp: copy_page is harmfull
swsusp-fix-highmem.patch
swsusp: fix highmem
swsusp-do-not-disable-platform-swsusp-because-s4bios-is-available.patch
swsusp: do not disable platform swsusp because S4bios is available
swsusp-fix-default-powerdown-mode.patch
swsusp: fix default powerdown mode
mark-old-power-managment-as-deprecated-and-clean-it-up.patch
Mark old power managment as deprecated and clean it up
use-global-system_state-to-avoid-system-state-confusion.patch
Use global system_state to avoid system-state confusion
sound-control-build-fix.patch
sound/core/control.c build fix
ipr-build-fix.patch
ipr.c build fix
megaraid-build-fix.patch
[un]register_ioctl32_conversion() stubs
i386_exception_notifiers.patch
i386 exceptions notifier for kprobes
kprobes-base.patch
kprobes base patch
kprobes-unset-fix.patch
kprobes: fix things when CONFIG_KPROBES is unset
kprobes-func-args.patch
Jumper Probes to provide function arguments
kprobes-build-fix.patch
kprobes build fix
network-packet-tracer-module-using-kprobes-interface.patch
Network packet tracer module using kprobes interface.
kgdb-ga.patch
kgdb stub for ia32 (George Anzinger's one)
kgdbL warning fix
kgdb buffer overflow fix
kgdbL warning fix
kgdb: CONFIG_DEBUG_INFO fix
x86_64 fixes
correct kgdb.txt Documentation link (against 2.6.1-rc1-mm2)
kgdb: fix for recent gcc
kgdb warning fixes
THREAD_SIZE fixes for kgdb
Fix stack overflow test for non-8k stacks
kgdb-ga.patch fix for i386 single-step into sysenter
fix TRAP_BAD_SYSCALL_EXITS on i386
add TRAP_BAD_SYSCALL_EXITS config for i386
kgdb-is-incompatible-with-kprobes.patch
kgdb-is-incompatible-with-kprobes
kgdboe-netpoll.patch
kgdb-over-ethernet via netpoll
kgdboe: fix configuration of MAC address
kgdb-x86_64-support.patch
kgdb-x86_64-support.patch for 2.6.2-rc1-mm3
kgdb-x86_64-warning-fixes
kgdb-ia64-support.patch
IA64 kgdb support
ia64 kgdb repair and cleanup
ia64 kgdb fix
kgdb-ia64-fixes.patch
kgdb: ia64 fixes
reduce-size-of-struct-inode-on-64bit.patch
reduce size of struct inode on 64bit
make-tree_lock-an-rwlock.patch
make mapping->tree_lock an rwlock
must-fix.patch
must fix lists update
must fix list update
mustfix update
must-fix update
mustfix lists
ppc32-refactor-common-book-e-exception-handling-macros.patch
ppc32: refactor common Book-E exception handling macros
ppc64-clean-up-unused-macro.patch
ppc64: clean up unused macro
ppc64-reloc_hide.patch
invalidate_inodes-speedup.patch
invalidate_inodes speedup
more invalidate_inodes speedup fixes
dev-mem-restriction-patch.patch
/dev/mem restriction patch
get_user_pages-handle-VM_IO.patch
fix get_user_pages() against mappings of /dev/mem
pid_max-fix.patch
Bug when setting pid_max > 32k
jbd-remove-livelock-avoidance.patch
JBD: remove livelock avoidance code in journal_dirty_data()
journal_add_journal_head-debug.patch
journal_add_journal_head-debug
list_del-debug.patch
list_del debug check
lockmeter.patch
lockmeter
ia64 CONFIG_LOCKMETER fix
lockmeter-build-fix.patch
lockmeter-build-fix
lockmeter-for-x86_64.patch
lockmeter for x86_64
unplug-can-sleep.patch
unplug functions can sleep
firestream-warnings.patch
firestream warnings
ext3_rsv_cleanup.patch
ext3 block reservation patch set -- ext3 preallocation cleanup
ext3_rsv_base.patch
ext3 block reservation patch set -- ext3 block reservation
ext3 reservations: fix performance regression
ext3 block reservation patch set -- mount and ioctl feature
ext3 block reservation patch set -- dynamically increase reservation window
ext3 reservation ifdef cleanup patch
ext3 reservation max window size check patch
ext3 reservation file ioctl fix
ext3-reservation-default-on.patch
ext3 reservation: default to on
ext3-lazy-discard-reservation-window-patch.patch
ext3 lazy discard reservation window patch
ext3 discard reservation in last iput fix patch
Fix lazy reservation discard
ext3 reservations: bad_inode fix
ext3 reservation discard race fix
ipr-ppc64-depends.patch
Make ipr.c require ppc
tty_io-hangup-locking.patch
tty_io.c hangup locking
perfctr-core.patch
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][1/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: core
CONFIG_PERFCTR=n build fix
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][6/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: misc
perfctr-i386.patch
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][2/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: i386
perfctr #if/#ifdef cleanup
perfctr Dothan support
perfctr x86_tests build fix
perfctr x86 init bug
perfctr: K8 fix for internal benchmarking code
perfctr x86 update
perfctr-x86_64.patch
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][3/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: x86_64
perfctr-ppc.patch
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][4/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: PowerPC
perfctr ppc32 update
perfctr update 4/6: PPC32 cleanups
perfctr ppc32 buglet fix
perfctr-virtualised-counters.patch
From: Mikael Pettersson <mikpe@csd.uu.se>
Subject: [PATCH][5/6] perfctr-2.7.3 for 2.6.7-rc1-mm1: virtualised counters
perfctr update 6/6: misc minor cleanups
perfctr update 3/6: __user annotations
perfctr-cpus_complement-fix
perfctr cpumask cleanup
perfctr SMP hang fix
make-perfctr_virtual-default-in-kconfig-match-recommendation.patch
Make PERFCTR_VIRTUAL default in Kconfig match recommendation in help text
perfctr-ifdef-cleanup.patch
perfctr ifdef cleanup
perfctr-update-2-6-kconfig-related-updates.patch
perfctr update 2/6: Kconfig-related updates
perfctr-update-5-6-reduce-stack-usage.patch
perfctr update 5/6: reduce stack usage
perfctr-low-level-documentation.patch
perfctr low-level documentation
perfctr documentation update
perfctr-inheritance-1-3-driver-updates.patch
perfctr inheritance 1/3: driver updates
perfctr inheritance illegal sleep bug
perfctr-inheritance-2-3-kernel-updates.patch
perfctr inheritance 2/3: kernel updates
perfctr-inheritance-3-3-documentation-updates.patch
perfctr inheritance 3/3: documentation updates
perfctr-inheritance-locking-fix.patch
perfctr inheritance locking fix
ext3-online-resize-patch.patch
ext3: online resizing
ext3-online-resize-warning-fix
nicksched.patch
nicksched
ext3_bread-cleanup.patch
ext3_bread() cleanup
pcmcia-implement-driver-model-support.patch
pcmcia: implement driver model support
pcmcia-update-network-drivers.patch
pcmcia: update network drivers
pcmcia-update-wireless-drivers.patch
pcmcia: update wireless drivers
pcmcia-fix-eject-lockup.patch
pcmcia: fix eject lockup
pcmcia-add-hotplug-support.patch
pcmcia: add *hotplug support
linux-2.6.8.1-49-rpc_workqueue.patch
nfs: RPC: Convert rpciod into a work queue for greater flexibility
linux-2.6.8.1-50-rpc_queue_lock.patch
nfs: RPC: Remove the rpc_queue_lock global spinlock
dvdrw-support-for-267-bk13.patch
DVD+RW support for 2.6.7-bk13
cdrw-packet-writing-support-for-267-bk13.patch
CDRW packet writing support
packet: remove #warning
packet writing: door unlocking fix
pkt_lock_door() warning fix
Fix race in pktcdvd kernel thread handling
Fix open/close races in pktcdvd
packet writing: review fixups
Remove pkt_dev from struct pktcdvd_device
packet writing: convert to seq_file
dvd-rw-packet-writing-update.patch
Packet writing support for DVD-RW and DVD+RW discs.
Get blockdev size right in pktcdvd after switching discs
packet-writing-docco.patch
packet writing documentation
Trivial CDRW packet writing doc update
control-pktcdvd-with-an-auxiliary-character-device.patch
Control pktcdvd with an auxiliary character device
Subject: Re: 2.6.8-rc2-mm2
control-pktcdvd-with-an-auxiliary-character-device-fix
simplified-request-size-handling-in-cdrw-packet-writing.patch
Simplified request size handling in CDRW packet writing
fix-setting-of-maximum-read-speed-in-cdrw-packet-writing.patch
Fix setting of maximum read speed in CDRW packet writing
packet-writing-reporting-fix.patch
Packet writing reporting fixes
speed-up-the-cdrw-packet-writing-driver.patch
Speed up the cdrw packet writing driver
packet-writing-avoid-bio-hackery.patch
packet writing: avoid BIO hackery
cdrom-buffer-size-fix.patch
cdrom: buffer sizing fix
cpufreq-driver-for-nforce2-kernel-267.patch
cpufreq driver for nForce2
allow-modular-ide-pnp.patch
allow modular ide-pnp
fix-warnings-in-net-irda.patch
sparse: fix warnings in net/irda/*
add-a-few-might_sleep-checks.patch
Add a few might_sleep() checks
tmpfs-atomicity-fix.patch
tmpfs atomicity fix
dev-zero-vs-hugetlb-mappings.patch
/dev/zero vs hugetlb mappings.
hugetlbfs-private-mappings.patch
hugetlbfs private mappings
jbd-recovery-latency-fix.patch
jbd recovery latency fix
truncate_inode_pages-latency-fix.patch
truncate_inode_pages-latency-fix
journal_clean_checkpoint_list-latency-fix.patch
journal_clean_checkpoint_list latency fix
journal_clean_checkpoint_list-latency-fix-fix.patch
journal_clean_checkpoint_list-latency-fix-fix
kjournald-smp-latency-fix.patch
kjournald-smp-latency-fix
unmap_vmas-smp-latency-fix.patch
unmap_vmas-smp-latency-fix
__cleanup_transaction-latency-fix.patch
__cleanup_transaction-latency-fix
prune_dcache-latency-fix.patch
prune_dcache-latency-fix
filemap_sync-latency-fix.patch
filemap_sync-latency-fix
slab-latency-fix.patch
slab-latency-fix
get_user_pages-latency-fix.patch
get_user_pages-latency-fix
pty_write-latency-fix.patch
pty_write-latency-fix
create-nodemask_t.patch
Create nodemask_t
nodemask fix
nodemask build fix
add-ixdp2x01-board-support-to-cs89x0-driver.patch
Add IXDP2x01 board support to CS89x0 driver
b44-add-47xx-support.patch
b44: add 47xx support
allow-x86_64-to-reenable-interrupts-on-contention.patch
Allow x86_64 to reenable interrupts on contention
fix-ide-probe-double-detection.patch
Fix ide probe double detection
fix-smm-failures-on-e750x-systems.patch
fix SMM failures on E750x systems
serial-cs-and-unusable-port-size-ranges.patch
serial-cs and unusable port size ranges
vlan-support-for-3c59x-3c90x.patch
VLAN support for 3c59x/3c90x
scsi-qla2xxx-fix-inline-compile-errors.patch
qla2xxx gcc-3.5 fixes
add-support-for-it8212-ide-controllers.patch
Add support for IT8212 IDE controllers
i386-hotplug-cpu.patch
i386 Hotplug CPU
hotplug-cpu-fix-apic-queued-timer-vector-race.patch
Hotplug cpu: Fix APIC queued timer vector race
iteraid.patch
ITE RAID driver
iteraid cleanup
iteraid warning fix
iteraid: pci_enable_device() for IRQ routing
igxb-speedup.patch
igxb speedup
serialize-access-to-ide-devices.patch
serialize access to ide devices
remove-unconditional-pci-acpi-irq-routing.patch
remove unconditional PCI ACPI IRQ routing
add-pci_fixup_enable-pass.patch
pci: add pci_fixup_enable pass
disable-atykb-warning.patch
disable atykb "too many keys pressed" warning
x86_64-numa-emulation.patch
x86_64: emulate NUMA on non-NUMA hardware
wireless-extension-v17-for-linus.patch
Wireless Extension v17 for Linus
wireless-drivers-update-for-we-17.patch
Wireless drivers update for WE-17
rss-ulimit-enforcement.patch
RSS ulimit enforcement
add-some-key-management-specific-error-codes.patch
Add some key management specific error codes
implement-in-kernel-keys-keyring-management.patch
implement in-kernel keys & keyring management
implement-in-kernel-keys-keyring-management-update.patch
keys & keyring management update patch
implement-in-kernel-keys-keyring-management-update-build-fix.patch
implement-in-kernel-keys-keyring-management-update-build-fix
implement-in-kernel-keys-keyring-management-update-build-fix-2.patch
implement-in-kernel-keys-keyring-management-update-build-fix-2
key-management-patch-cleanup.patch
key management patch cleanup
keys-keyring-management-keyfs-patch.patch
keys & keyring management: keyfs patch
keyfs-build-fix.patch
keyfs build fix
implement-in-kernel-keys-keyring-management-afs-workaround.patch
implement-in-kernel-keys-keyring-management afs workaround
268-rc3-jffs2-unable-to-read-filesystems.patch
jffs2 unable to read filesystems
ide-do-spin-up-for-all-platforms.patch
IDE: do spin up for all platforms
qlogic-isp2x00-remove-needless-busyloop.patch
QLogic ISP2x00: remove needless busyloop
dnotify-autofs-may-create-signal-restart-syscall-loop.patch
dnotify + autofs may create signal/restart syscall loop
using-get_cycles-for-add_timer_randomness.patch
Using get_cycles for add_timer_randomness
waitid-system-call.patch
waitid system call
waitid-system-call-update.patch
waitid system call update
waitid-ia64-build-fix.patch
waitid-ia64-build-fix
waitid-system-call-cleanups.patch
waitid-system-call cleanups
mostly-remove-module_parm.patch
mostly remove module_parm()
serial-8250-optionally-skip-autodetection.patch
Serial 8250 optionally skip autodetection
serial-8250-omap-support.patch
Serial 8250 OMAP support
add-to-snd-intel8x0-ac97-quirk-list.patch
add to snd-intel8x0 AC97 quirk list
defxx-trivial-updates.patch
defxx trivial updates
defxx-device-name-fixes.patch
defxx device name fixes
jffs2-mount-options-discarded.patch
JFFS2 mount options discarded
assign_irq_vector-section-fix.patch
assign_irq_vector __init section fix
find_isa_irq_pin-should-not-be-__init.patch
find_isa_irq_pin should not be __init
kexec-i8259-shutdowni386.patch
kexec: i8259-shutdown.i386
kexec-i8259-shutdown-x86_64.patch
kexec: x86_64 i8259 shutdown
kexec-apic-virtwire-on-shutdowni386patch.patch
kexec: apic-virtwire-on-shutdown.i386.patch
kexec-apic-virtwire-on-shutdownx86_64.patch
kexec: apic-virtwire-on-shutdown.x86_64
kexec-ioapic-virtwire-on-shutdowni386.patch
kexec: ioapic-virtwire-on-shutdown.i386
kexec-ioapic-virtwire-on-shutdownx86_64.patch
kexec: ioapic-virtwire-on-shutdown.x86_64
kexec-e820-64bit.patch
kexec: e820-64bit
kexec-kexec-generic.patch
kexec: kexec-generic
kexec-machine_shutdownx86_64.patch
kexec: machine_shutdown.x86_64
kexec-kexecx86_64.patch
kexec: kexec.x86_64
kexec-machine_shutdowni386.patch
kexec: machine_shutdown.i386
kexec-kexeci386.patch
kexec: kexec.i386
kexec-use_mm.patch
kexec: use_mm
kexec-kexecppc.patch
kexec: kexec.ppc
new-bitmap-list-format-for-cpusets.patch
new bitmap list format (for cpusets)
cpusets-big-numa-cpu-and-memory-placement.patch
cpusets - big numa cpu and memory placement
cpusets-config_cpusets-depends-on-smp.patch
Cpusets: CONFIG_CPUSETS depends on SMP
cpusets-tasks-file-simplify-format-fixes.patch
Cpusets tasks file: simplify format, fixes
cpusets-simplify-memory-generation.patch
Cpusets: simplify memory generation
reiser4-sb_sync_inodes.patch
reiser4: vfs: add super_operations.sync_inodes()
reiser4-sb_sync_inodes-cleanup.patch
reiser4-sb_sync_inodes-cleanup
reiser4-allow-drop_inode-implementation.patch
reiser4: export vfs inode.c symbols
reiser4-allow-drop_inode-implementation-cleanup.patch
reiser4-allow-drop_inode-implementation-cleanup
reiser4-truncate_inode_pages_range.patch
reiser4: vfs: add truncate_inode_pages_range()
reiser4-truncate_inode_pages_range-cleanup.patch
reiser4-truncate_inode_pages_range-cleanup
reiser4-export-remove_from_page_cache.patch
reiser4: export pagecache add/remove functions to modules
reiser4-export-page_cache_readahead.patch
reiser4: export page_cache_readahead to modules
reiser4-reget-page-mapping.patch
reiser4: vfs: re-check page->mapping after calling try_to_release_page()
reiser4-rcu-barrier.patch
reiser4: add rcu_barrier() synchronization point
reiser4-rcu-barrier-fix.patch
reiser4-rcu-barrier fix
reiser4-export-inode_lock.patch
reiser4: export inode_lock to modules
reiser4-export-inode_lock-cleanup.patch
reiser4-export-inode_lock-cleanup
reiser4-export-pagevec-funcs.patch
reiser4: export pagevec functions to modules
reiser4-export-pagevec-funcs-cleanup.patch
reiser4-export-pagevec-funcs-cleanup
reiser4-export-radix_tree_preload.patch
reiser4: export radix_tree_preload() to modules
reiser4-radix-tree-tag.patch
reiser4: add new radix tree tag
reiser4-radix_tree_lookup_slot.patch
reiser4: add radix_tree_lookup_slot()
reiser4-aliased-dir.patch
reiser4: vfs: handle aliased directories
reiser4-kobject-umount-race.patch
reiser4: introduce filesystem kobjects
reiser4-kobject-umount-race-cleanup.patch
reiser4-kobject-umount-race-cleanup
reiser4-perthread-pages.patch
reiser4: per-thread page pools
reiser4-unstatic-kswapd.patch
reiser4: make kswapd() unstatic for debug
reiser4-include-reiser4.patch
reiser4: add to build system
reiser4-4kstacks-fix.patch
resier4-4kstacks-fix
reiser4-doc.patch
reiser4: documentation
reiser4-doc-update.patch
Update Documentation/Changes for reiser4
reiser4-only.patch
reiser4: main fs
reiser4-prefetch-warning-fix.patch
reiser4: prefetch warning fix
reiser4-mode-fix.patch
reiser4: mode type fix
reiser4-get_context_ok-warning-fixes.patch
reiser4: get_context_ok() warning fixes
reiser4-remove-debug.patch
resier4: remove debug stuff
reiser4-spinlock-debugging-build-fix-2.patch
reiser4-spinlock-debugging-build-fix-2
reiser4-sparc64-build-fix.patch
reiser4 sparc64 build fix
sys_reiser4-sparc64-build-fix.patch
sys_reiser4 sparc64 build fix
reiser4-printk-warning-fixes.patch
reiser4 printk warning fixes
fix-rusage-semantics.patch
fix rusage semantics
fix-mt-reparenting-when-thread-group-leader-dies.patch
fix MT reparenting when thread group leader dies
acpi-based-floppy-controller-enumeration.patch
ACPI-based floppy controller enumeration
possible-dcache-bug-debugging-patch.patch
Possible dcache BUG: debugging patch
copy_mount_options-size-fix.patch
copy_mount_options size fix
improve-oprofile-on-many-way-systems.patch
improve OProfile on many-way systems
oprofile-ia64-performance-counter-support.patch
OProfile ia64 performance counter support
fix-pid-hash-sizing.patch
fix PID hash sizing
use-hlist-for-pid-hash.patch
use hlist for pid hash
use-hlist-for-pid-hash-cache-friendliness.patch
use hlist for pid hash: cache friendliness
split-timer-resources.patch
Split timer resources
reduce-casting-in-sysenterc.patch
reduce casting in sysenter.c
cast-page_offset-math-to-void-in-early-printk.patch
cast PAGE_OFFSET math to void* in early printk
call-virt_to_page-with-void-not-ul.patch
call virt_to_page() with void*, not UL
vmalloc_fault-cleanup.patch
vmalloc_fault() cleanup
dont-align-virt_to_page-args.patch
don't align virt_to_page() args
include-asm-pageh-for-virt_to_page.patch
include asm/page.h for virt_to_page()
task_vsize-locking-cleanup.patch
task_vsize() locking cleanup
task_vsize-locking-cleanup-warning-fix.patch
task_vsize-locking-cleanup warning fix
o1-proc_pid_statm.patch
O(1) proc_pid_statm()
o1-proc_pid_statm-fix.patch
fix text reporting in O(1) proc_pid_statm()
task-statm-no-procfs-fix.patch
speed up /proc/pid/statm for !CONFIG_PROC_FS
task-statm-reserved-fix.patch
/proc/pid/statm accounting fixes
task-statm-dontcopy-fix.patch
Unaccount VM_DONTCOPY vmas properly
r8169-add-ethtool_opsget_regs_len-get_regs.patch
r8169: add ethtool_ops.{get_regs_len/get_regs}
r8169-per-device-receive-buffer-size.patch
r8169: per device receive buffer size
r8169-code-cleanup.patch
r8169: code cleanup
r8169-enable-mwi.patch
r8169: enable MWI
r8169-bump-version-number.patch
r8169: bump version number
r8169-sync-the-names-of-a-few-bits-with-the-8139cp-driver.patch
r8169: sync the names of a few bits with the 8139cp driver
r8169-comment-a-gcc-295x-bug.patch
r8169: comment a gcc 2.95.x bug
r8169-tx-checksum-offload.patch
r8169: Tx checksum offload
r8169-advertise-dma-to-high-memory.patch
r8169: advertise DMA to high memory
r8169-rx-checksum-support.patch
r8169: Rx checksum support
r8169-vlan-support.patch
r8169: vlan support
sane-mlock_limit.patch
sane mlock_limit
lanana-maintainer-devicestxt-patch-1-2.patch
LANANA: maintainer update
lanana-maintainer-devicestxt-2.patch
LANANA: devices.txt update
netmos-9805-parport-interface.patch
parport: NetMOS 9805 interface
s390-lcs-network-driver.patch
s390: lcs network driver
s390-common-i-o-layer.patch
s390: common i/o layer
s390-sclp-driver-changes.patch
s390: sclp driver changes
s390-qeth-network-driver.patch
s390: qeth network driver
269-rc1-ifdef-fixes-for-drivers-isdn-hifax.patch
#ifdef fixes for drivers/isdn/hifax/*
269-rc1-ifdef-cleanup-for-sh64.patch
#ifdef cleanup for sh64
269-rc1-ifdef-cleanup-for-cris-port.patch
#ifdef cleanup for cris port
269-rc1-ifdef-cleanup-for-ppc.patch
#ifdef cleanup for PPC
269-rc1-ifdef-cleanups-in-drivers-net.patch
#ifdef cleanups in drivers/net
make-oom-killer-points-unsigned-long.patch
make oom killer points unsigned long
dvb-pci_enable_device-fix.patch
dvb pci_enable_device() fix
copying-unaligned-data-across-user-kernel-boundary.patch
Copying unaligned data across user/kernel boundary
re-fix-pagecache-reading-off-by-one.patch
fix pagecache reading off-by-one
re-fix-pagecache-reading-off-by-one-cleanup.patch
re-fix-pagecache-reading-off-by-one-cleanup
waitqueue_debug-crapectomy.patch
WAITQUEUE_DEBUG cleanup
ftape-support-for-x86_64.patch
ftape support for x86_64
keep-sparc32-config-consistent.patch
Keep sparc32 config consistent
fix-typo-in-bw2c.patch
Fix typo in bw2.c
interrupt-is-enabled-before-it-should-be-when-kernel-is-booted.patch
interrupt is enabled before it should be when kernel is booted
hvcs-hotplug-fixes.patch
HVCS hotplug fixes
amiga-partition-reading-fix.patch
Amiga partition reading fix
problem-with-sis900-unknown-phy.patch
Problem with SiS900 - Unknown PHY
kallsyms-data-size-reduction--lookup-speedup.patch
kallsyms data size reduction / lookup speedup
prevent-memory-leak-in-devpts.patch
Prevent memory leak in devpts
revert-ioc_eth3-pci_enable_device-changes.patch
revert ioc3-eth.c pci_enable_device() changes
fix-hp100c-for-pci_enable_device-changes.patch
Fix hp100.c for pci_enable_device() changes
x86_64-vs-select-fix.patch
Fix x86_64 vs select.c namespace clash
must_check-copy_to_user.patch
must_check-copy_to_user
copy_to_user-checking.patch
copy_to_user-checking
sym_requeue_awaiting_cmds-uninit-var-fix.patch
sym_requeue_awaiting_cmds() warning fix
de4x5-idiocy-fix.patch
de4x5 warning fix
^ permalink raw reply [flat|nested] 60+ messages in thread* Re: 2.6.9-rc1-mm1 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton @ 2004-08-26 11:07 ` Con Kolivas 2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan ` (2 more replies) 2004-08-26 12:06 ` 2.6.9-rc1-mm1 Denis Vlasenko ` (7 subsequent siblings) 8 siblings, 3 replies; 60+ messages in thread From: Con Kolivas @ 2004-08-26 11:07 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel [-- Attachment #1: Type: text/plain, Size: 2320 bytes --] Andrew Morton wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > > > - nicksched is still here. There has been very little feedback, except that > it seems to slow some workloads on NUMA. That's because most people aren't interested in a new cpu scheduler for 2.6. The current one works well enough in most situations and people aren't trying -mm to fix their interactive problems since they are few and far between. The only reports about adverse behaviour with 2.6 we track down to "It behaves differently to what I expect" or applications with no (b)locking between threads suck under load. Personally I think the latter is a good thing as it encourages better coding, and the former is something we'll have with any alternate design. The only feedback we got on staircase was that it helped NUMA somewhat and Nick and Ingo made some criticisms (not counting any benchmarks I had to offer). The only feedback on nickshed was that it hurt NUMA somewhat, SMT interactivity was broken (an easy enough oversight), and I did not comment to avoid giving biased criticism. If you're after subjective performance feedback you're less likely to get it now than ever since you've made a strong stance against subjective reports, due to placebo effect. LKML is scary enough for the average user already. We have a situation now that if one brave single user reports good or bad behaviour everyone runs off that one user's report. Ouch! There isn't going to be a 2.7 any time soon and there are people that are using alternate schedulers already in production; which is obviously why you're giving them a test run in -mm. Clearly the lack of a formal (2.7) development branch makes this even harder. Your attempt at preventing "good stuff' from rotting in alternate trees when mainline should be benefitting is admirable. While it's fun to rewrite the scheduler and gives us something to play with, the current level of feedback is hardly the testbase off which to replace it unless there's something strikingly better about a new cpu scheduler. It will be interesting to see if this spawns any further discussion or whether Peter's scheduler's performance will also be lost in a low signal to noise ratio when it gets a run in -mm. Cheers, Con [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 256 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-26 14:28 ` Jurriaan 2004-08-26 18:25 ` 2.6.9-rc1-mm1 Thomas Davis 2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-08-26 20:51 ` 2.6.9-rc1-mm1 Martin J. Bligh 2 siblings, 1 reply; 60+ messages in thread From: Jurriaan @ 2004-08-26 14:28 UTC (permalink / raw) To: linux-kernel From: Con Kolivas <kernel@kolivas.org> Date: Thu, Aug 26, 2004 at 09:07:39PM +1000 > Andrew Morton wrote: > > > >ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > > > >- nicksched is still here. There has been very little feedback, except > >that > > it seems to slow some workloads on NUMA. > > The only feedback on nickshed was that it hurt NUMA > somewhat, SMT interactivity was broken (an easy enough oversight) I take it that was why changing consoles between mutt and slrn would include a pause of several seconds on a system with a single, hyperthreaded cpu? Is that fixed in 2.6.9-rc1-mm1? Thanks, Jurriaan -- Living on Earth includes an annual free trip around the Sun. Debian (Unstable) GNU/Linux 2.6.8.1-mm4 2x6078 bogomips load 0.06 ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan @ 2004-08-26 18:25 ` Thomas Davis 0 siblings, 0 replies; 60+ messages in thread From: Thomas Davis @ 2004-08-26 18:25 UTC (permalink / raw) To: Jurriaan; +Cc: linux-kernel Jurriaan wrote: > From: Con Kolivas <kernel@kolivas.org> > Date: Thu, Aug 26, 2004 at 09:07:39PM +1000 > >>Andrew Morton wrote: >> >>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ >>> >>>- nicksched is still here. There has been very little feedback, except >>>that >>> it seems to slow some workloads on NUMA. >> >>The only feedback on nickshed was that it hurt NUMA >>somewhat, SMT interactivity was broken (an easy enough oversight) > > > I take it that was why changing consoles between mutt and slrn would > include a pause of several seconds on a system with a single, > hyperthreaded cpu? > More than likely. I had found it's worse with X running (see ioperm vs. iopl thread) > Is that fixed in 2.6.9-rc1-mm1? > Good question, and how about the ioperm/iopl bit map problem? thomas ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan @ 2004-08-26 14:36 ` Rafael J. Wysocki 2004-08-26 14:45 ` 2.6.9-rc1-mm1 Felipe Alfaro Solana 2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 20:51 ` 2.6.9-rc1-mm1 Martin J. Bligh 2 siblings, 2 replies; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-26 14:36 UTC (permalink / raw) To: Con Kolivas; +Cc: Andrew Morton, linux-kernel On Thursday 26 of August 2004 13:07, Con Kolivas wrote: > Andrew Morton wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2 > >.6.9-rc1-mm1/ > > > > > > - nicksched is still here. There has been very little feedback, except > > that it seems to slow some workloads on NUMA. > > That's because most people aren't interested in a new cpu scheduler for > 2.6. I am, but I have no benchmarks that give any useful numbers. > The current one works well enough in most situations and people > aren't trying -mm to fix their interactive problems since they are few > and far between. Actually, with the current scheduler, updatedb really sucks. It's supposed to be a background task, but it hogs IO resources and memory like crazy (disclaimer: it's my personal subjective observation). > The only reports about adverse behaviour with 2.6 we > track down to "It behaves differently to what I expect" or applications > with no (b)locking between threads suck under load. Personally I think > the latter is a good thing as it encourages better coding, and the > former is something we'll have with any alternate design. > > The only feedback we got on staircase was that it helped NUMA somewhat > and Nick and Ingo made some criticisms (not counting any benchmarks I > had to offer). The only feedback on nickshed was that it hurt NUMA > somewhat, SMT interactivity was broken (an easy enough oversight), and I > did not comment to avoid giving biased criticism. Frankly, if I had any useful benchmark, I would have readily run it and posted the results. The problem is that I don't know what kind of results you are interested in. Please let me know what _exactly_ you want to measure. Please propose some benchmarks or post a HOWTO, or what. "Help me help you". > If you're after subjective performance feedback you're less likely to > get it now than ever since you've made a strong stance against > subjective reports, due to placebo effect. LKML is scary enough for the > average user already. We have a situation now that if one brave single > user reports good or bad behaviour everyone runs off that one user's > report. Ouch! > > There isn't going to be a 2.7 any time soon and there are people that > are using alternate schedulers already in production; which is obviously > why you're giving them a test run in -mm. Clearly the lack of a formal > (2.7) development branch makes this even harder. Your attempt at > preventing "good stuff' from rotting in alternate trees when mainline > should be benefitting is admirable. While it's fun to rewrite the > scheduler and gives us something to play with, the current level of > feedback is hardly the testbase off which to replace it unless there's > something strikingly better about a new cpu scheduler. > > It will be interesting to see if this spawns any further discussion or > whether Peter's scheduler's performance will also be lost in a low > signal to noise ratio when it gets a run in -mm. I think the problem is that relatively not so many people run -mm, and even less people try to use them for a longer time. Also, there sometimes are some issues with -mm that must be sorted out first, but then there's not much time left for testing the scheduler before the next -mm. Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-26 14:45 ` Felipe Alfaro Solana 2004-08-26 15:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas 1 sibling, 1 reply; 60+ messages in thread From: Felipe Alfaro Solana @ 2004-08-26 14:45 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: Con Kolivas, Andrew Morton, linux-kernel [-- Attachment #1: Type: text/plain, Size: 734 bytes --] On Thursday 26 August 2004 16:36, Rafael J. Wysocki wrote: > I think the problem is that relatively not so many people run -mm, and even > less people try to use them for a longer time. Also, there sometimes are > some issues with -mm that must be sorted out first, but then there's not > much time left for testing the scheduler before the next -mm. I think this is the main reason of existence for -mm kernels: find problems, sort them out and fix them. I've been running -mm kernels since 2.5.80+ and all problems I have had were resolved in a timely manner. What I think is that Con's scheduler is the one that needs to get into -mm kernels to give it more exposure. Currently, it has a very limited audience. [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 14:45 ` 2.6.9-rc1-mm1 Felipe Alfaro Solana @ 2004-08-26 15:35 ` Rafael J. Wysocki 0 siblings, 0 replies; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-26 15:35 UTC (permalink / raw) To: Felipe Alfaro Solana; +Cc: Con Kolivas, Andrew Morton, linux-kernel On Thursday 26 of August 2004 16:45, Felipe Alfaro Solana wrote: > On Thursday 26 August 2004 16:36, Rafael J. Wysocki wrote: > > I think the problem is that relatively not so many people run -mm, and > > even less people try to use them for a longer time. Also, there > > sometimes are some issues with -mm that must be sorted out first, but > > then there's not much time left for testing the scheduler before the next > > -mm. > > I think this is the main reason of existence for -mm kernels: find > problems, sort them out and fix them. That's the point. You don't pay attention to the differences between schedulers if there are more serious problems, do you? > I've been running -mm kernels since > 2.5.80+ and all problems I have had were resolved in a timely manner. I agree, but it's a different thing. :-) > What I think is that Con's scheduler is the one that needs to get into -mm > kernels to give it more exposure. Currently, it has a very limited > audience. IMHO, -mm could stick for a while with one of the alternative schedulers so that it gets more testing. Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-08-26 14:45 ` 2.6.9-rc1-mm1 Felipe Alfaro Solana @ 2004-08-26 16:38 ` Con Kolivas 2004-08-26 20:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh 1 sibling, 2 replies; 60+ messages in thread From: Con Kolivas @ 2004-08-26 16:38 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: Andrew Morton, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1224 bytes --] Rafael J. Wysocki wrote: > On Thursday 26 of August 2004 13:07, Con Kolivas wrote: > >>Andrew Morton wrote: >> >>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2 >>>.6.9-rc1-mm1/ >>> >>> >>>- nicksched is still here. There has been very little feedback, except >>>that it seems to slow some workloads on NUMA. >> >>That's because most people aren't interested in a new cpu scheduler for >>2.6. > > > I am, but I have no benchmarks that give any useful numbers. That's because there are none for interactivity; you're simply reinforcing my point. >>The current one works well enough in most situations and people >>aren't trying -mm to fix their interactive problems since they are few >>and far between. > > > Actually, with the current scheduler, updatedb really sucks. It's supposed to > be a background task, but it hogs IO resources and memory like crazy > (disclaimer: it's my personal subjective observation). The cpu scheduler plays almost no part in this. It's the I/O scheduler and the vm. IOnice will help the former _when it comes out_. Dropping the swappiness kind of helps the latter; although there are numerous alternative tweaks appearing for that too. Cheers, Con [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 256 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-26 20:36 ` Rafael J. Wysocki 2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh 1 sibling, 0 replies; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-26 20:36 UTC (permalink / raw) To: Con Kolivas; +Cc: Andrew Morton, linux-kernel On Thursday 26 of August 2004 18:38, Con Kolivas wrote: > Rafael J. Wysocki wrote: > > On Thursday 26 of August 2004 13:07, Con Kolivas wrote: > >>Andrew Morton wrote: > >>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/ > >>>2 .6.9-rc1-mm1/ > >>> > >>> > >>>- nicksched is still here. There has been very little feedback, except > >>>that it seems to slow some workloads on NUMA. > >> > >>That's because most people aren't interested in a new cpu scheduler for > >>2.6. > > > > I am, but I have no benchmarks that give any useful numbers. > > That's because there are none for interactivity; you're simply > reinforcing my point. Hm, can you tell me please what you consider as the most obvious interactivity issue that you expect to be improved by your scheduler? A typical scenario in which the "standard" one will be "not good enough" in your opinion? > >>The current one works well enough in most situations and people > >>aren't trying -mm to fix their interactive problems since they are few > >>and far between. > > > > Actually, with the current scheduler, updatedb really sucks. It's > > supposed to be a background task, but it hogs IO resources and memory > > like crazy (disclaimer: it's my personal subjective observation). > > The cpu scheduler plays almost no part in this. It's the I/O scheduler > and the vm. I wasn't quite sure so thanks for pointing it out to me. > IOnice will help the former _when it comes out_. Dropping > the swappiness kind of helps the latter; although there are numerous > alternative tweaks appearing for that too. I know that. It does not hurt me that much. :-) Still, on a dual-Opteron box with a gig of RAM I would expect it to "behave" a bit better in the default configuration ... Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 20:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-26 20:55 ` Martin J. Bligh 2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-27 0:58 ` 2.6.9-rc1-mm1 Rick Lindsley 1 sibling, 2 replies; 60+ messages in thread From: Martin J. Bligh @ 2004-08-26 20:55 UTC (permalink / raw) To: Con Kolivas, Rafael J. Wysocki; +Cc: Andrew Morton, linux-kernel, Rick Lindsley --On Friday, August 27, 2004 02:38:05 +1000 Con Kolivas <kernel@kolivas.org> wrote: > Rafael J. Wysocki wrote: >> On Thursday 26 of August 2004 13:07, Con Kolivas wrote: >> >>> Andrew Morton wrote: >>> >>>> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2 >>>> .6.9-rc1-mm1/ >>>> >>>> >>>> - nicksched is still here. There has been very little feedback, except >>>> that it seems to slow some workloads on NUMA. >>> >>> That's because most people aren't interested in a new cpu scheduler for >>> 2.6. >> >> >> I am, but I have no benchmarks that give any useful numbers. > > That's because there are none for interactivity; you're simply > reinforcing my point. Rick's schedstats stuff had some ways to measure latency that seemed to work quite nicely. Hard to simulate exactly mozilla, email, etc, but probably close enough to be far more use than "ooh, it feels faster". He did a whole paper at OLS ... Rick ... pointer? >> Actually, with the current scheduler, updatedb really sucks. It's supposed to >> be a background task, but it hogs IO resources and memory like crazy >> (disclaimer: it's my personal subjective observation). > > The cpu scheduler plays almost no part in this. It's the I/O scheduler and the vm. IOnice will help the former _when it comes out_. Dropping the swappiness kind of helps the latter; although there are numerous alternative tweaks appearing for that too. Yup. I can open a large 8Mpixel camera image in "display" and hang the whole system for about 30s too ;-( M. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh @ 2004-08-26 23:19 ` Con Kolivas 2004-08-26 23:43 ` 2.6.9-rc1-mm1 Martin J. Bligh 2004-08-27 0:37 ` 2.6.9-rc1-mm1 Nuno Silva 2004-08-27 0:58 ` 2.6.9-rc1-mm1 Rick Lindsley 1 sibling, 2 replies; 60+ messages in thread From: Con Kolivas @ 2004-08-26 23:19 UTC (permalink / raw) To: Martin J. Bligh Cc: Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley [-- Attachment #1: Type: text/plain, Size: 1050 bytes --] Martin J. Bligh wrote: > --On Friday, August 27, 2004 02:38:05 +1000 Con Kolivas <kernel@kolivas.org> wrote: >>Rafael J. Wysocki wrote: >>>Actually, with the current scheduler, updatedb really sucks. It's supposed to >>>be a background task, but it hogs IO resources and memory like crazy >>>(disclaimer: it's my personal subjective observation). >> >>The cpu scheduler plays almost no part in this. It's the I/O scheduler and the vm. IOnice will help the former _when it comes out_. Dropping the swappiness kind of helps the latter; although there are numerous alternative tweaks appearing for that too. > > Yup. I can open a large 8Mpixel camera image in "display" and hang the whole > system for about 30s too ;-( If you're talking about using the embedded image viewer in kde, that spins on wait and wastes truckloads of cpu (a perfect example of poor coding). Try loading it an external viewer and it will be 1000 times faster. If you're talking about it keeping the disk too busy on the other hand, that's I/O scheduling. Cheers, Con [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 256 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-26 23:43 ` Martin J. Bligh 2004-08-27 0:37 ` 2.6.9-rc1-mm1 Nuno Silva 1 sibling, 0 replies; 60+ messages in thread From: Martin J. Bligh @ 2004-08-26 23:43 UTC (permalink / raw) To: Con Kolivas; +Cc: Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley --On Friday, August 27, 2004 09:19:32 +1000 Con Kolivas <kernel@kolivas.org> wrote: > Martin J. Bligh wrote: >> --On Friday, August 27, 2004 02:38:05 +1000 Con Kolivas <kernel@kolivas.org> wrote: >>> Rafael J. Wysocki wrote: >>>> Actually, with the current scheduler, updatedb really sucks. It's supposed to >>>> be a background task, but it hogs IO resources and memory like crazy >>>> (disclaimer: it's my personal subjective observation). >>> >>> The cpu scheduler plays almost no part in this. It's the I/O scheduler and the vm. IOnice will help the former _when it comes out_. Dropping the swappiness kind of helps the latter; although there are numerous alternative tweaks appearing for that too. >> >> Yup. I can open a large 8Mpixel camera image in "display" and hang the whole >> system for about 30s too ;-( > > If you're talking about using the embedded image viewer in kde, that spins on wait and wastes truckloads of cpu (a perfect example of poor coding). Try loading it an external viewer and it will be 1000 times faster. If you're talking about it keeping the disk too busy on the other hand, that's I/O scheduling. Nope, I'm talking about the app "display", which I think is part of ImageMagick or soemthing. M. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 23:43 ` 2.6.9-rc1-mm1 Martin J. Bligh @ 2004-08-27 0:37 ` Nuno Silva 2004-08-27 0:46 ` 2.6.9-rc1-mm1 Con Kolivas 1 sibling, 1 reply; 60+ messages in thread From: Nuno Silva @ 2004-08-27 0:37 UTC (permalink / raw) To: Con Kolivas Cc: Martin J. Bligh, Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley Con Kolivas wrote: > Martin J. Bligh wrote: [..] >> >> Yup. I can open a large 8Mpixel camera image in "display" and hang the >> whole >> system for about 30s too ;-( > Congrats! 8MP camera! :-) > > If you're talking about using the embedded image viewer in kde, that > spins on wait and wastes truckloads of cpu (a perfect example of poor > coding). Try loading it an external viewer and it will be 1000 times > faster. If you're talking about it keeping the disk too busy on the > other hand, that's I/O scheduling. > The question is: "can a poorly coded app hang the system for 30secs?" That's a DoS ;-) Regards, Nuno Silva ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 0:37 ` 2.6.9-rc1-mm1 Nuno Silva @ 2004-08-27 0:46 ` Con Kolivas 2004-08-27 0:51 ` 2.6.9-rc1-mm1 Martin J. Bligh 0 siblings, 1 reply; 60+ messages in thread From: Con Kolivas @ 2004-08-27 0:46 UTC (permalink / raw) To: Nuno Silva Cc: Martin J. Bligh, Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley [-- Attachment #1: Type: text/plain, Size: 555 bytes --] Nuno Silva wrote: > Con Kolivas wrote: >> If you're talking about using the embedded image viewer in kde, that >> spins on wait and wastes truckloads of cpu (a perfect example of poor >> coding). Try loading it an external viewer and it will be 1000 times >> faster. If you're talking about it keeping the disk too busy on the >> other hand, that's I/O scheduling. >> > > The question is: "can a poorly coded app hang the system for 30secs?" > > That's a DoS ;-) It does not hang the system, only it's dependant tasks (ie other kde thingies) Con [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 256 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 0:46 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-27 0:51 ` Martin J. Bligh 2004-08-27 0:55 ` 2.6.9-rc1-mm1 Con Kolivas 0 siblings, 1 reply; 60+ messages in thread From: Martin J. Bligh @ 2004-08-27 0:51 UTC (permalink / raw) To: Con Kolivas, Nuno Silva Cc: Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley --On Friday, August 27, 2004 10:46:45 +1000 Con Kolivas <kernel@kolivas.org> wrote: > Nuno Silva wrote: >> Con Kolivas wrote: >>> If you're talking about using the embedded image viewer in kde, that >>> spins on wait and wastes truckloads of cpu (a perfect example of poor >>> coding). Try loading it an external viewer and it will be 1000 times >>> faster. If you're talking about it keeping the disk too busy on the >>> other hand, that's I/O scheduling. >>> >> >> The question is: "can a poorly coded app hang the system for 30secs?" >> >> That's a DoS ;-) > > It does not hang the system, only it's dependant tasks (ie other kde thingies) the display app (not KDE), however, at least seems to deny X of enough time that the mouse cursor won't move. Much badness! ;-) M. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 0:51 ` 2.6.9-rc1-mm1 Martin J. Bligh @ 2004-08-27 0:55 ` Con Kolivas 0 siblings, 0 replies; 60+ messages in thread From: Con Kolivas @ 2004-08-27 0:55 UTC (permalink / raw) To: Martin J. Bligh Cc: Nuno Silva, Rafael J. Wysocki, Andrew Morton, linux-kernel, Rick Lindsley [-- Attachment #1: Type: text/plain, Size: 891 bytes --] Martin J. Bligh wrote: > --On Friday, August 27, 2004 10:46:45 +1000 Con Kolivas <kernel@kolivas.org> wrote: > > >>Nuno Silva wrote: >> >>>Con Kolivas wrote: >>> >>>>If you're talking about using the embedded image viewer in kde, that >>>>spins on wait and wastes truckloads of cpu (a perfect example of poor >>>>coding). Try loading it an external viewer and it will be 1000 times >>>>faster. If you're talking about it keeping the disk too busy on the >>>>other hand, that's I/O scheduling. >>>> >>> >>>The question is: "can a poorly coded app hang the system for 30secs?" >>> >>>That's a DoS ;-) >> >>It does not hang the system, only it's dependant tasks (ie other kde thingies) > > > the display app (not KDE), however, at least seems to deny X of enough time > that the mouse cursor won't move. Much badness! ;-) Yes, priority inversion is a nasty thing indeed. Cheers, Con [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 256 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh 2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-27 0:58 ` Rick Lindsley 2004-08-27 20:54 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 1 sibling, 1 reply; 60+ messages in thread From: Rick Lindsley @ 2004-08-27 0:58 UTC (permalink / raw) To: Martin J. Bligh Cc: Con Kolivas, Rafael J. Wysocki, Andrew Morton, linux-kernel Rick's schedstats stuff had some ways to measure latency that seemed to work quite nicely. Hard to simulate exactly mozilla, email, etc, but probably close enough to be far more use than "ooh, it feels faster". He did a whole paper at OLS ... Rick ... pointer? http://www.finux.org/Reprints/Reprint-Lindsley-OLS2004.pdf There are patches available for schedstats, although I haven't pulled together 2.6.9-rc1 yet. Shouldn't take me but fifteen minutes, I think. Rafael, what baseline release are you comparing to? I should be able to provide some tools to measure the effect on updatedb directly for both 2.6.9-rc1 and your baseline (so long as it's 2.6-based) Rick ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 0:58 ` 2.6.9-rc1-mm1 Rick Lindsley @ 2004-08-27 20:54 ` Rafael J. Wysocki 2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley 0 siblings, 1 reply; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-27 20:54 UTC (permalink / raw) To: Rick Lindsley, Martin J. Bligh; +Cc: Con Kolivas, Andrew Morton, linux-kernel On Friday 27 of August 2004 02:58, Rick Lindsley wrote: > Rick's schedstats stuff had some ways to measure latency that seemed to > work quite nicely. Hard to simulate exactly mozilla, email, etc, but > probably close enough to be far more use than "ooh, it feels faster". > > He did a whole paper at OLS ... Rick ... pointer? > > http://www.finux.org/Reprints/Reprint-Lindsley-OLS2004.pdf > > There are patches available for schedstats, although I haven't pulled > together 2.6.9-rc1 yet. Shouldn't take me but fifteen minutes, I think. > > Rafael, what baseline release are you comparing to? I should be able > to provide some tools to measure the effect on updatedb directly for > both 2.6.9-rc1 and your baseline (so long as it's 2.6-based) 2.6.8.1, for example. I'd like to compate it with the 2.6.9-rc1-mm1, which contains the Nick's scheduler (2.6.9-rc1 has the same scheduler as 2.6.8.1, AFAIK). Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 20:54 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-27 21:54 ` Rick Lindsley 2004-08-27 22:29 ` 2.6.9-rc1-mm1 Rafael J. Wysocki ` (3 more replies) 0 siblings, 4 replies; 60+ messages in thread From: Rick Lindsley @ 2004-08-27 21:54 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Martin J. Bligh, Con Kolivas, Andrew Morton, linux-kernel > Rafael, what baseline release are you comparing to? I should be able > to provide some tools to measure the effect on updatedb directly for > both 2.6.9-rc1 and your baseline (so long as it's 2.6-based) 2.6.8.1, for example. I'd like to compate it with the 2.6.9-rc1-mm1, which contains the Nick's scheduler (2.6.9-rc1 has the same scheduler as 2.6.8.1, AFAIK). Okay. A schedstats patch for 2.6.8.1 is available at http://eaglet.rain.com/rick/linux/schedstat/patches/schedstat-2.6.8.1 or http://oss.software.ibm.com/linux/patches/?patch_id=730 You can also pick up the program "latency.c" at http://eaglet.rain.com/rick/linux/schedstat/v9/latency.c With these two things in hand, you should be able to measure the latency on 2.6.8.1 of a particular process. A patch is not necessary for 2.6.9-rc1-mm1 (schedstats is already in there) but you will need to config the kernel to use it. Then retrieve a slightly different latency.c: http://eaglet.rain.com/rick/linux/schedstat/v10/latency.c since 2.6.9-rc1-mm1 output format is different (as you noted, it's a different scheduler.) Then you should be able to see if the latency of a particular process (updatedb, for instance) changes. Rick ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley @ 2004-08-27 22:29 ` Rafael J. Wysocki 2004-09-03 21:11 ` schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki ` (2 subsequent siblings) 3 siblings, 0 replies; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-27 22:29 UTC (permalink / raw) To: Rick Lindsley; +Cc: Martin J. Bligh, Con Kolivas, Andrew Morton, linux-kernel On Friday 27 of August 2004 23:54, Rick Lindsley wrote: > > Rafael, what baseline release are you comparing to? I should be able > > to provide some tools to measure the effect on updatedb directly for > > both 2.6.9-rc1 and your baseline (so long as it's 2.6-based) > > 2.6.8.1, for example. I'd like to compate it with the 2.6.9-rc1-mm1, > which contains the Nick's scheduler (2.6.9-rc1 has the same scheduler as > 2.6.8.1, AFAIK). > > Okay. A schedstats patch for 2.6.8.1 is available at > > http://eaglet.rain.com/rick/linux/schedstat/patches/schedstat-2.6.8.1 > or > http://oss.software.ibm.com/linux/patches/?patch_id=730 > > You can also pick up the program "latency.c" at > > http://eaglet.rain.com/rick/linux/schedstat/v9/latency.c > > With these two things in hand, you should be able to measure the latency > on 2.6.8.1 of a particular process. > > A patch is not necessary for 2.6.9-rc1-mm1 (schedstats is already in there) > but you will need to config the kernel to use it. Then retrieve a slightly > different latency.c: > > http://eaglet.rain.com/rick/linux/schedstat/v10/latency.c > > since 2.6.9-rc1-mm1 output format is different (as you noted, it's a > different scheduler.) Then you should be able to see if the latency of > a particular process (updatedb, for instance) changes. Thanks a lot Rick, I'll give it a try tomorrow. Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] 2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley 2004-08-27 22:29 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-09-03 21:11 ` Rafael J. Wysocki 2004-09-08 7:09 ` Rick Lindsley 2004-09-04 18:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-09-04 23:10 ` latency.c [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki 3 siblings, 1 reply; 60+ messages in thread From: Rafael J. Wysocki @ 2004-09-03 21:11 UTC (permalink / raw) To: Rick Lindsley; +Cc: linux-kernel [-- Attachment #1: Type: text/plain, Size: 2987 bytes --] Dnia Friday 27 of August 2004 23:54, Rick Lindsley napisał: > > Rafael, what baseline release are you comparing to? I should be able > > to provide some tools to measure the effect on updatedb directly for > > both 2.6.9-rc1 and your baseline (so long as it's 2.6-based) > > 2.6.8.1, for example. I'd like to compate it with the 2.6.9-rc1-mm1, which > contains the Nick's scheduler (2.6.9-rc1 has the same scheduler as 2.6.8.1, > AFAIK). > > Okay. A schedstats patch for 2.6.8.1 is available at > > http://eaglet.rain.com/rick/linux/schedstat/patches/schedstat-2.6.8.1 > or > http://oss.software.ibm.com/linux/patches/?patch_id=730 It does not compile for me on a UP system: CC kernel/sched.o kernel/sched.c:259: error: `MAX_IDLE_TYPES' undeclared here (not in a function) kernel/sched.c:260: error: `MAX_IDLE_TYPES' undeclared here (not in a function) kernel/sched.c: In function `show_schedstat': kernel/sched.c:339: error: storage size of `itype' isn't known kernel/sched.c:365: error: `IDLE' undeclared (first use in this function) kernel/sched.c:365: error: (Each undeclared identifier is reported only once kernel/sched.c:365: error: for each function it appears in.) kernel/sched.c:365: error: `MAX_IDLE_TYPES' undeclared (first use in this function) kernel/sched.c:372: error: structure has no member named `sd' kernel/sched.c:372: error: dereferencing pointer to incomplete type kernel/sched.c:375: error: dereferencing pointer to incomplete type kernel/sched.c:379: error: dereferencing pointer to incomplete type kernel/sched.c:380: error: dereferencing pointer to incomplete type kernel/sched.c:381: error: dereferencing pointer to incomplete type kernel/sched.c:382: error: dereferencing pointer to incomplete type kernel/sched.c:383: error: dereferencing pointer to incomplete type kernel/sched.c:386: error: dereferencing pointer to incomplete type kernel/sched.c:386: error: dereferencing pointer to incomplete type kernel/sched.c:387: error: dereferencing pointer to incomplete type kernel/sched.c:387: error: dereferencing pointer to incomplete type kernel/sched.c:339: warning: unused variable `itype' kernel/sched.c: At top level: kernel/sched.c:2222: warning: `enum idle_type' declared inside parameter list kernel/sched.c:2222: warning: its scope is only this definition or declaration, which is probably not what you want kernel/sched.c:2223: error: parameter `idle' has incomplete type kernel/sched.c: In function `scheduler_tick': kernel/sched.c:2300: error: `IDLE' undeclared (first use in this function) kernel/sched.c:2384: error: `NOT_IDLE' undeclared (first use in this function) make[1]: *** [kernel/sched.o] Error 1 make: *** [kernel] Error 2 (attached is the .config). Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman [-- Attachment #2: 2.6.8.1.config --] [-- Type: text/plain, Size: 38370 bytes --] # # Automatically generated make config: don't edit # CONFIG_X86_64=y CONFIG_64BIT=y CONFIG_X86=y CONFIG_MMU=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_X86_CMPXCHG=y CONFIG_EARLY_PRINTK=y CONFIG_HPET_TIMER=y CONFIG_HPET_EMULATE_RTC=y CONFIG_GENERIC_ISA_DMA=y # # Code maturity level options # CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y # # General setup # CONFIG_SWAP=y CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_BSD_PROCESS_ACCT=y CONFIG_BSD_PROCESS_ACCT_V3=y CONFIG_SYSCTL=y CONFIG_AUDIT=y CONFIG_AUDITSYSCALL=y CONFIG_LOG_BUF_SHIFT=18 CONFIG_HOTPLUG=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y # CONFIG_EMBEDDED is not set CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set CONFIG_FUTEX=y CONFIG_EPOLL=y CONFIG_IOSCHED_NOOP=y CONFIG_IOSCHED_AS=y CONFIG_IOSCHED_DEADLINE=y CONFIG_IOSCHED_CFQ=y # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set # # Loadable module support # CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_OBSOLETE_MODPARM=y CONFIG_MODVERSIONS=y CONFIG_KMOD=y # # Processor type and features # CONFIG_MK8=y # CONFIG_MPSC is not set # CONFIG_GENERIC_CPU is not set CONFIG_X86_L1_CACHE_BYTES=64 CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_TSC=y CONFIG_X86_GOOD_APIC=y CONFIG_MICROCODE=m CONFIG_X86_MSR=m CONFIG_X86_CPUID=m CONFIG_X86_IO_APIC=y CONFIG_X86_LOCAL_APIC=y CONFIG_MTRR=y # CONFIG_SMP is not set CONFIG_PREEMPT=y CONFIG_GART_IOMMU=y CONFIG_SWIOTLB=y CONFIG_X86_MCE=y # # Power management options # CONFIG_PM=y CONFIG_SOFTWARE_SUSPEND=y # # ACPI (Advanced Configuration and Power Interface) Support # CONFIG_ACPI=y CONFIG_ACPI_BOOT=y CONFIG_ACPI_INTERPRETER=y CONFIG_ACPI_SLEEP=y CONFIG_ACPI_SLEEP_PROC_FS=y CONFIG_ACPI_AC=m CONFIG_ACPI_BATTERY=m CONFIG_ACPI_BUTTON=m CONFIG_ACPI_FAN=m CONFIG_ACPI_PROCESSOR=m CONFIG_ACPI_THERMAL=m CONFIG_ACPI_ASUS=m # CONFIG_ACPI_TOSHIBA is not set CONFIG_ACPI_DEBUG=y CONFIG_ACPI_BUS=y CONFIG_ACPI_EC=y CONFIG_ACPI_POWER=y CONFIG_ACPI_PCI=y CONFIG_ACPI_SYSTEM=y # # CPU Frequency scaling # CONFIG_CPU_FREQ=y CONFIG_CPU_FREQ_PROC_INTF=m CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set CONFIG_CPU_FREQ_GOV_PERFORMANCE=y CONFIG_CPU_FREQ_GOV_POWERSAVE=m CONFIG_CPU_FREQ_GOV_USERSPACE=m # CONFIG_CPU_FREQ_24_API is not set CONFIG_CPU_FREQ_TABLE=m # # CPUFreq processor drivers # CONFIG_X86_POWERNOW_K8=m # # Bus options (PCI etc.) # CONFIG_PCI=y CONFIG_PCI_DIRECT=y CONFIG_PCI_MMCONFIG=y # CONFIG_PCI_MSI is not set CONFIG_PCI_LEGACY_PROC=y CONFIG_PCI_NAMES=y # # PCMCIA/CardBus support # CONFIG_PCMCIA=m # CONFIG_PCMCIA_DEBUG is not set CONFIG_YENTA=m CONFIG_CARDBUS=y CONFIG_PD6729=m CONFIG_I82092=m CONFIG_TCIC=m # # PCI Hotplug Support # CONFIG_HOTPLUG_PCI=m CONFIG_HOTPLUG_PCI_FAKE=m CONFIG_HOTPLUG_PCI_ACPI=m CONFIG_HOTPLUG_PCI_CPCI=y CONFIG_HOTPLUG_PCI_CPCI_ZT5550=m CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m # CONFIG_HOTPLUG_PCI_PCIE is not set CONFIG_HOTPLUG_PCI_SHPC=m # CONFIG_HOTPLUG_PCI_SHPC_POLL_EVENT_MODE is not set # # Executable file formats / Emulations # CONFIG_BINFMT_ELF=y CONFIG_BINFMT_MISC=m CONFIG_IA32_EMULATION=y CONFIG_IA32_AOUT=y CONFIG_COMPAT=y CONFIG_SYSVIPC_COMPAT=y CONFIG_UID16=y # # Device Drivers # # # Generic Driver Options # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y CONFIG_FW_LOADER=m # CONFIG_DEBUG_DRIVER is not set # # Memory Technology Devices (MTD) # CONFIG_MTD=m # CONFIG_MTD_DEBUG is not set CONFIG_MTD_PARTITIONS=y CONFIG_MTD_CONCAT=m CONFIG_MTD_REDBOOT_PARTS=m # CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED is not set # CONFIG_MTD_REDBOOT_PARTS_READONLY is not set CONFIG_MTD_CMDLINE_PARTS=y # # User Modules And Translation Layers # CONFIG_MTD_CHAR=m CONFIG_MTD_BLOCK=m CONFIG_MTD_BLOCK_RO=m CONFIG_FTL=m CONFIG_NFTL=m CONFIG_NFTL_RW=y CONFIG_INFTL=m # # RAM/ROM/Flash chip drivers # CONFIG_MTD_CFI=m CONFIG_MTD_JEDECPROBE=m CONFIG_MTD_GEN_PROBE=m CONFIG_MTD_CFI_ADV_OPTIONS=y CONFIG_MTD_CFI_NOSWAP=y # CONFIG_MTD_CFI_BE_BYTE_SWAP is not set # CONFIG_MTD_CFI_LE_BYTE_SWAP is not set # CONFIG_MTD_CFI_GEOMETRY is not set CONFIG_MTD_MAP_BANK_WIDTH_1=y CONFIG_MTD_MAP_BANK_WIDTH_2=y CONFIG_MTD_MAP_BANK_WIDTH_4=y # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set CONFIG_MTD_CFI_I1=y CONFIG_MTD_CFI_I2=y # CONFIG_MTD_CFI_I4 is not set # CONFIG_MTD_CFI_I8 is not set CONFIG_MTD_CFI_INTELEXT=m CONFIG_MTD_CFI_AMDSTD=m CONFIG_MTD_CFI_AMDSTD_RETRY=0 CONFIG_MTD_CFI_STAA=m CONFIG_MTD_CFI_UTIL=m # CONFIG_MTD_RAM is not set # CONFIG_MTD_ROM is not set CONFIG_MTD_ABSENT=m # # Mapping drivers for chip access # CONFIG_MTD_COMPLEX_MAPPINGS=y CONFIG_MTD_PHYSMAP=m CONFIG_MTD_PHYSMAP_START=0x8000000 CONFIG_MTD_PHYSMAP_LEN=0x4000000 CONFIG_MTD_PHYSMAP_BANKWIDTH=2 # CONFIG_MTD_PNC2000 is not set CONFIG_MTD_SC520CDP=m # CONFIG_MTD_NETSC520 is not set # CONFIG_MTD_SBC_GXX is not set # CONFIG_MTD_ELAN_104NC is not set CONFIG_MTD_SCx200_DOCFLASH=m CONFIG_MTD_AMD76XROM=m # CONFIG_MTD_ICHXROM is not set CONFIG_MTD_SCB2_FLASH=m # CONFIG_MTD_NETtel is not set # CONFIG_MTD_DILNETPC is not set CONFIG_MTD_L440GX=m CONFIG_MTD_PCI=m # # Self-contained MTD device drivers # CONFIG_MTD_PMC551=m CONFIG_MTD_PMC551_BUGFIX=y # CONFIG_MTD_PMC551_DEBUG is not set CONFIG_MTD_SLRAM=m # CONFIG_MTD_PHRAM is not set CONFIG_MTD_MTDRAM=m CONFIG_MTDRAM_TOTAL_SIZE=4096 CONFIG_MTDRAM_ERASE_SIZE=128 CONFIG_MTD_BLKMTD=m # # Disk-On-Chip Device Drivers # CONFIG_MTD_DOC2000=m CONFIG_MTD_DOC2001=m CONFIG_MTD_DOC2001PLUS=m CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m CONFIG_MTD_DOCPROBE_ADVANCED=y CONFIG_MTD_DOCPROBE_ADDRESS=0x0000 CONFIG_MTD_DOCPROBE_HIGH=y CONFIG_MTD_DOCPROBE_55AA=y # # NAND Flash Device Drivers # CONFIG_MTD_NAND=m CONFIG_MTD_NAND_VERIFY_WRITE=y CONFIG_MTD_NAND_IDS=m CONFIG_MTD_NAND_DISKONCHIP=m CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADVANCED=y CONFIG_MTD_NAND_DISKONCHIP_PROBE_ADDRESS=0 CONFIG_MTD_NAND_DISKONCHIP_PROBE_HIGH=y CONFIG_MTD_NAND_DISKONCHIP_BBTWRITE=y # # Parallel port support # CONFIG_PARPORT=m CONFIG_PARPORT_PC=m CONFIG_PARPORT_PC_CML1=m CONFIG_PARPORT_SERIAL=m CONFIG_PARPORT_PC_FIFO=y CONFIG_PARPORT_PC_SUPERIO=y CONFIG_PARPORT_PC_PCMCIA=m CONFIG_PARPORT_OTHER=y CONFIG_PARPORT_1284=y # # Plug and Play support # # # Block devices # # CONFIG_BLK_DEV_FD is not set # CONFIG_PARIDE is not set # CONFIG_BLK_CPQ_DA is not set # CONFIG_BLK_CPQ_CISS_DA is not set # CONFIG_BLK_DEV_DAC960 is not set # CONFIG_BLK_DEV_UMEM is not set CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=m # CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_SX8 is not set CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_SIZE=128000 CONFIG_BLK_DEV_INITRD=y CONFIG_LBD=y # # ATA/ATAPI/MFM/RLL support # CONFIG_IDE=y CONFIG_BLK_DEV_IDE=y # # Please see Documentation/ide.txt for help/info on IDE drives # # CONFIG_BLK_DEV_IDE_SATA is not set # CONFIG_BLK_DEV_HD_IDE is not set CONFIG_BLK_DEV_IDEDISK=y CONFIG_IDEDISK_MULTI_MODE=y CONFIG_BLK_DEV_IDECS=m CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDETAPE=m CONFIG_BLK_DEV_IDEFLOPPY=m CONFIG_BLK_DEV_IDESCSI=m # CONFIG_IDE_TASK_IOCTL is not set # CONFIG_IDE_TASKFILE_IO is not set # # IDE chipset support/bugfixes # CONFIG_IDE_GENERIC=y # CONFIG_BLK_DEV_CMD640 is not set CONFIG_BLK_DEV_IDEPCI=y CONFIG_IDEPCI_SHARE_IRQ=y CONFIG_BLK_DEV_OFFBOARD=y CONFIG_BLK_DEV_GENERIC=y # CONFIG_BLK_DEV_OPTI621 is not set # CONFIG_BLK_DEV_RZ1000 is not set CONFIG_BLK_DEV_IDEDMA_PCI=y # CONFIG_BLK_DEV_IDEDMA_FORCED is not set CONFIG_IDEDMA_PCI_AUTO=y # CONFIG_IDEDMA_ONLYDISK is not set CONFIG_BLK_DEV_ADMA=y # CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_ALI15X3 is not set CONFIG_BLK_DEV_AMD74XX=y # CONFIG_BLK_DEV_ATIIXP is not set # CONFIG_BLK_DEV_CMD64X is not set # CONFIG_BLK_DEV_TRIFLEX is not set # CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CS5520 is not set # CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_HPT34X is not set # CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_SC1200 is not set # CONFIG_BLK_DEV_PIIX is not set # CONFIG_BLK_DEV_NS87415 is not set # CONFIG_BLK_DEV_PDC202XX_OLD is not set # CONFIG_BLK_DEV_PDC202XX_NEW is not set # CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SIIMAGE is not set # CONFIG_BLK_DEV_SIS5513 is not set # CONFIG_BLK_DEV_SLC90E66 is not set # CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_IDE_ARM is not set CONFIG_BLK_DEV_IDEDMA=y # CONFIG_IDEDMA_IVB is not set CONFIG_IDEDMA_AUTO=y # CONFIG_BLK_DEV_HD is not set # # SCSI device support # CONFIG_SCSI=m CONFIG_SCSI_PROC_FS=y # # SCSI support type (disk, tape, CD-ROM) # CONFIG_BLK_DEV_SD=m CONFIG_CHR_DEV_ST=m CONFIG_CHR_DEV_OSST=m CONFIG_BLK_DEV_SR=m # CONFIG_BLK_DEV_SR_VENDOR is not set CONFIG_CHR_DEV_SG=m # # Some SCSI devices (e.g. CD jukebox) support multiple LUNs # CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_CONSTANTS=y CONFIG_SCSI_LOGGING=y # # SCSI Transport Attributes # CONFIG_SCSI_SPI_ATTRS=m CONFIG_SCSI_FC_ATTRS=m # # SCSI low-level drivers # # CONFIG_BLK_DEV_3W_XXXX_RAID is not set # CONFIG_SCSI_3W_9XXX is not set # CONFIG_SCSI_ACARD is not set # CONFIG_SCSI_AACRAID is not set # CONFIG_SCSI_AIC7XXX is not set # CONFIG_SCSI_AIC7XXX_OLD is not set # CONFIG_SCSI_AIC79XX is not set # CONFIG_SCSI_MEGARAID is not set # CONFIG_SCSI_SATA is not set # CONFIG_SCSI_BUSLOGIC is not set # CONFIG_SCSI_DMX3191D is not set # CONFIG_SCSI_EATA is not set # CONFIG_SCSI_EATA_PIO is not set # CONFIG_SCSI_FUTURE_DOMAIN is not set # CONFIG_SCSI_GDTH is not set # CONFIG_SCSI_IPS is not set # CONFIG_SCSI_INIA100 is not set # CONFIG_SCSI_PPA is not set # CONFIG_SCSI_IMM is not set # CONFIG_SCSI_SYM53C8XX_2 is not set # CONFIG_SCSI_IPR is not set # CONFIG_SCSI_QLOGIC_ISP is not set # CONFIG_SCSI_QLOGIC_FC is not set # CONFIG_SCSI_QLOGIC_1280 is not set CONFIG_SCSI_QLA2XXX=m # CONFIG_SCSI_QLA21XX is not set # CONFIG_SCSI_QLA22XX is not set # CONFIG_SCSI_QLA2300 is not set # CONFIG_SCSI_QLA2322 is not set # CONFIG_SCSI_QLA6312 is not set # CONFIG_SCSI_QLA6322 is not set # CONFIG_SCSI_DC395x is not set # CONFIG_SCSI_DC390T is not set CONFIG_SCSI_DEBUG=m # # PCMCIA SCSI adapter support # CONFIG_PCMCIA_FDOMAIN=m CONFIG_PCMCIA_QLOGIC=m CONFIG_PCMCIA_SYM53C500=m # # Multi-device support (RAID and LVM) # CONFIG_MD=y # CONFIG_BLK_DEV_MD is not set CONFIG_BLK_DEV_DM=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m CONFIG_DM_MIRROR=m CONFIG_DM_ZERO=m # # Fusion MPT device support # # CONFIG_FUSION is not set # # IEEE 1394 (FireWire) support # CONFIG_IEEE1394=m # # Subsystem Options # # CONFIG_IEEE1394_VERBOSEDEBUG is not set CONFIG_IEEE1394_OUI_DB=y CONFIG_IEEE1394_EXTRA_CONFIG_ROMS=y CONFIG_IEEE1394_CONFIG_ROM_IP1394=y # # Device Drivers # CONFIG_IEEE1394_PCILYNX=m CONFIG_IEEE1394_OHCI1394=m # # Protocol Drivers # CONFIG_IEEE1394_VIDEO1394=m CONFIG_IEEE1394_SBP2=m CONFIG_IEEE1394_SBP2_PHYS_DMA=y CONFIG_IEEE1394_ETH1394=m CONFIG_IEEE1394_DV1394=m CONFIG_IEEE1394_RAWIO=m CONFIG_IEEE1394_CMP=m CONFIG_IEEE1394_AMDTP=m # # I2O device support # # CONFIG_I2O is not set # # Networking support # CONFIG_NET=y # # Networking options # CONFIG_PACKET=m CONFIG_PACKET_MMAP=y CONFIG_NETLINK_DEV=m CONFIG_UNIX=y CONFIG_NET_KEY=m CONFIG_INET=y CONFIG_IP_MULTICAST=y CONFIG_IP_ADVANCED_ROUTER=y CONFIG_IP_MULTIPLE_TABLES=y CONFIG_IP_ROUTE_FWMARK=y CONFIG_IP_ROUTE_NAT=y CONFIG_IP_ROUTE_MULTIPATH=y CONFIG_IP_ROUTE_TOS=y CONFIG_IP_ROUTE_VERBOSE=y CONFIG_IP_PNP=y CONFIG_IP_PNP_DHCP=y CONFIG_IP_PNP_BOOTP=y CONFIG_IP_PNP_RARP=y CONFIG_NET_IPIP=m CONFIG_NET_IPGRE=m CONFIG_NET_IPGRE_BROADCAST=y CONFIG_IP_MROUTE=y CONFIG_IP_PIMSM_V1=y CONFIG_IP_PIMSM_V2=y # CONFIG_ARPD is not set CONFIG_SYN_COOKIES=y CONFIG_INET_AH=m CONFIG_INET_ESP=m CONFIG_INET_IPCOMP=m # # IP: Virtual Server Configuration # CONFIG_IP_VS=m # CONFIG_IP_VS_DEBUG is not set CONFIG_IP_VS_TAB_BITS=12 # # IPVS transport protocol load balancing support # CONFIG_IP_VS_PROTO_TCP=y CONFIG_IP_VS_PROTO_UDP=y CONFIG_IP_VS_PROTO_ESP=y CONFIG_IP_VS_PROTO_AH=y # # IPVS scheduler # CONFIG_IP_VS_RR=m CONFIG_IP_VS_WRR=m CONFIG_IP_VS_LC=m CONFIG_IP_VS_WLC=m CONFIG_IP_VS_LBLC=m CONFIG_IP_VS_LBLCR=m CONFIG_IP_VS_DH=m CONFIG_IP_VS_SH=m CONFIG_IP_VS_SED=m CONFIG_IP_VS_NQ=m # # IPVS application helper # CONFIG_IP_VS_FTP=m CONFIG_IPV6=m CONFIG_IPV6_PRIVACY=y CONFIG_INET6_AH=m CONFIG_INET6_ESP=m CONFIG_INET6_IPCOMP=m CONFIG_IPV6_TUNNEL=m CONFIG_NETFILTER=y # CONFIG_NETFILTER_DEBUG is not set CONFIG_BRIDGE_NETFILTER=y # # IP: Netfilter Configuration # CONFIG_IP_NF_CONNTRACK=m CONFIG_IP_NF_FTP=m CONFIG_IP_NF_IRC=m CONFIG_IP_NF_TFTP=m CONFIG_IP_NF_AMANDA=m CONFIG_IP_NF_QUEUE=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP_NF_MATCH_LIMIT=m CONFIG_IP_NF_MATCH_IPRANGE=m CONFIG_IP_NF_MATCH_MAC=m CONFIG_IP_NF_MATCH_PKTTYPE=m CONFIG_IP_NF_MATCH_MARK=m CONFIG_IP_NF_MATCH_MULTIPORT=m CONFIG_IP_NF_MATCH_TOS=m CONFIG_IP_NF_MATCH_RECENT=m CONFIG_IP_NF_MATCH_ECN=m CONFIG_IP_NF_MATCH_DSCP=m CONFIG_IP_NF_MATCH_AH_ESP=m CONFIG_IP_NF_MATCH_LENGTH=m CONFIG_IP_NF_MATCH_TTL=m CONFIG_IP_NF_MATCH_TCPMSS=m CONFIG_IP_NF_MATCH_HELPER=m CONFIG_IP_NF_MATCH_STATE=m CONFIG_IP_NF_MATCH_CONNTRACK=m CONFIG_IP_NF_MATCH_OWNER=m CONFIG_IP_NF_MATCH_PHYSDEV=m CONFIG_IP_NF_FILTER=m CONFIG_IP_NF_TARGET_REJECT=m CONFIG_IP_NF_NAT=m CONFIG_IP_NF_NAT_NEEDED=y CONFIG_IP_NF_TARGET_MASQUERADE=m CONFIG_IP_NF_TARGET_REDIRECT=m CONFIG_IP_NF_TARGET_NETMAP=m CONFIG_IP_NF_TARGET_SAME=m # CONFIG_IP_NF_NAT_LOCAL is not set CONFIG_IP_NF_NAT_SNMP_BASIC=m CONFIG_IP_NF_NAT_IRC=m CONFIG_IP_NF_NAT_FTP=m CONFIG_IP_NF_NAT_TFTP=m CONFIG_IP_NF_NAT_AMANDA=m CONFIG_IP_NF_MANGLE=m CONFIG_IP_NF_TARGET_TOS=m CONFIG_IP_NF_TARGET_ECN=m CONFIG_IP_NF_TARGET_DSCP=m CONFIG_IP_NF_TARGET_MARK=m CONFIG_IP_NF_TARGET_CLASSIFY=m CONFIG_IP_NF_TARGET_LOG=m CONFIG_IP_NF_TARGET_ULOG=m CONFIG_IP_NF_TARGET_TCPMSS=m CONFIG_IP_NF_ARPTABLES=m CONFIG_IP_NF_ARPFILTER=m CONFIG_IP_NF_ARP_MANGLE=m CONFIG_IP_NF_COMPAT_IPCHAINS=m CONFIG_IP_NF_COMPAT_IPFWADM=m # CONFIG_IP_NF_RAW is not set # CONFIG_IP_NF_MATCH_ADDRTYPE is not set # CONFIG_IP_NF_MATCH_REALM is not set # # IPv6: Netfilter Configuration # CONFIG_IP6_NF_QUEUE=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP6_NF_MATCH_LIMIT=m CONFIG_IP6_NF_MATCH_MAC=m CONFIG_IP6_NF_MATCH_RT=m CONFIG_IP6_NF_MATCH_OPTS=m CONFIG_IP6_NF_MATCH_FRAG=m CONFIG_IP6_NF_MATCH_HL=m CONFIG_IP6_NF_MATCH_MULTIPORT=m CONFIG_IP6_NF_MATCH_OWNER=m CONFIG_IP6_NF_MATCH_MARK=m CONFIG_IP6_NF_MATCH_IPV6HEADER=m CONFIG_IP6_NF_MATCH_AHESP=m CONFIG_IP6_NF_MATCH_LENGTH=m CONFIG_IP6_NF_MATCH_EUI64=m CONFIG_IP6_NF_FILTER=m CONFIG_IP6_NF_TARGET_LOG=m CONFIG_IP6_NF_MANGLE=m CONFIG_IP6_NF_TARGET_MARK=m # CONFIG_IP6_NF_RAW is not set # # DECnet: Netfilter Configuration # # CONFIG_DECNET_NF_GRABULATOR is not set # # Bridge: Netfilter Configuration # CONFIG_BRIDGE_NF_EBTABLES=m CONFIG_BRIDGE_EBT_BROUTE=m CONFIG_BRIDGE_EBT_T_FILTER=m CONFIG_BRIDGE_EBT_T_NAT=m CONFIG_BRIDGE_EBT_802_3=m CONFIG_BRIDGE_EBT_AMONG=m CONFIG_BRIDGE_EBT_ARP=m CONFIG_BRIDGE_EBT_IP=m CONFIG_BRIDGE_EBT_LIMIT=m CONFIG_BRIDGE_EBT_MARK=m CONFIG_BRIDGE_EBT_PKTTYPE=m CONFIG_BRIDGE_EBT_STP=m CONFIG_BRIDGE_EBT_VLAN=m CONFIG_BRIDGE_EBT_ARPREPLY=m CONFIG_BRIDGE_EBT_DNAT=m CONFIG_BRIDGE_EBT_MARK_T=m CONFIG_BRIDGE_EBT_REDIRECT=m CONFIG_BRIDGE_EBT_SNAT=m CONFIG_BRIDGE_EBT_LOG=m CONFIG_XFRM=y CONFIG_XFRM_USER=m # # SCTP Configuration (EXPERIMENTAL) # CONFIG_IP_SCTP=m # CONFIG_SCTP_DBG_MSG is not set # CONFIG_SCTP_DBG_OBJCNT is not set # CONFIG_SCTP_HMAC_NONE is not set # CONFIG_SCTP_HMAC_SHA1 is not set CONFIG_SCTP_HMAC_MD5=y # CONFIG_ATM is not set CONFIG_BRIDGE=m CONFIG_VLAN_8021Q=m CONFIG_DECNET=m CONFIG_DECNET_SIOCGIFCONF=y # CONFIG_DECNET_ROUTER is not set CONFIG_LLC=m CONFIG_LLC2=m CONFIG_IPX=m CONFIG_IPX_INTERN=y CONFIG_ATALK=m CONFIG_DEV_APPLETALK=y CONFIG_IPDDP=m CONFIG_IPDDP_ENCAP=y CONFIG_IPDDP_DECAP=y CONFIG_X25=m CONFIG_LAPB=m # CONFIG_NET_DIVERT is not set CONFIG_ECONET=m # CONFIG_ECONET_AUNUDP is not set # CONFIG_ECONET_NATIVE is not set CONFIG_WAN_ROUTER=m # CONFIG_NET_HW_FLOWCONTROL is not set # # QoS and/or fair queueing # CONFIG_NET_SCHED=y CONFIG_NET_SCH_CLK_JIFFIES=y # CONFIG_NET_SCH_CLK_GETTIMEOFDAY is not set # CONFIG_NET_SCH_CLK_CPU is not set CONFIG_NET_SCH_CBQ=m CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_HFSC=m CONFIG_NET_SCH_PRIO=m CONFIG_NET_SCH_RED=m CONFIG_NET_SCH_SFQ=m CONFIG_NET_SCH_TEQL=m CONFIG_NET_SCH_TBF=m CONFIG_NET_SCH_GRED=m CONFIG_NET_SCH_DSMARK=m # CONFIG_NET_SCH_NETEM is not set CONFIG_NET_SCH_INGRESS=m CONFIG_NET_QOS=y CONFIG_NET_ESTIMATOR=y CONFIG_NET_CLS=y CONFIG_NET_CLS_TCINDEX=m CONFIG_NET_CLS_ROUTE4=m CONFIG_NET_CLS_ROUTE=y CONFIG_NET_CLS_FW=m CONFIG_NET_CLS_U32=m # CONFIG_CLS_U32_PERF is not set # CONFIG_NET_CLS_IND is not set CONFIG_NET_CLS_RSVP=m CONFIG_NET_CLS_RSVP6=m # CONFIG_NET_CLS_ACT is not set CONFIG_NET_CLS_POLICE=y # # Network testing # CONFIG_NET_PKTGEN=m CONFIG_NETPOLL=y CONFIG_NETPOLL_RX=y CONFIG_NETPOLL_TRAP=y CONFIG_NET_POLL_CONTROLLER=y # CONFIG_HAMRADIO is not set CONFIG_IRDA=m # # IrDA protocols # CONFIG_IRLAN=m CONFIG_IRNET=m CONFIG_IRCOMM=m CONFIG_IRDA_ULTRA=y # # IrDA options # CONFIG_IRDA_CACHE_LAST_LSAP=y CONFIG_IRDA_FAST_RR=y CONFIG_IRDA_DEBUG=y # # Infrared-port device drivers # # # SIR device drivers # CONFIG_IRTTY_SIR=m # # Dongle support # CONFIG_DONGLE=y CONFIG_ESI_DONGLE=m CONFIG_ACTISYS_DONGLE=m CONFIG_TEKRAM_DONGLE=m CONFIG_LITELINK_DONGLE=m CONFIG_MA600_DONGLE=m CONFIG_GIRBIL_DONGLE=m CONFIG_MCP2120_DONGLE=m CONFIG_OLD_BELKIN_DONGLE=m CONFIG_ACT200L_DONGLE=m # # Old SIR device drivers # # CONFIG_IRPORT_SIR is not set # # Old Serial dongle support # # # FIR device drivers # CONFIG_USB_IRDA=m CONFIG_SIGMATEL_FIR=m CONFIG_VLSI_FIR=m CONFIG_BT=m CONFIG_BT_L2CAP=m CONFIG_BT_SCO=m CONFIG_BT_RFCOMM=m CONFIG_BT_RFCOMM_TTY=y CONFIG_BT_BNEP=m CONFIG_BT_BNEP_MC_FILTER=y CONFIG_BT_BNEP_PROTO_FILTER=y CONFIG_BT_HIDP=m # # Bluetooth device drivers # CONFIG_BT_HCIUSB=m CONFIG_BT_HCIUSB_SCO=y CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_BCSP_TXCRC=y CONFIG_BT_HCIBCM203X=m CONFIG_BT_HCIBFUSB=m CONFIG_BT_HCIDTL1=m CONFIG_BT_HCIBT3C=m CONFIG_BT_HCIBLUECARD=m CONFIG_BT_HCIBTUART=m CONFIG_BT_HCIVHCI=m CONFIG_NETDEVICES=y CONFIG_DUMMY=m CONFIG_BONDING=m CONFIG_EQUALIZER=m CONFIG_TUN=m CONFIG_ETHERTAP=m # # ARCnet devices # # CONFIG_ARCNET is not set # # Ethernet (10 or 100Mbit) # CONFIG_NET_ETHERNET=y CONFIG_MII=m # CONFIG_HAPPYMEAL is not set # CONFIG_SUNGEM is not set # CONFIG_NET_VENDOR_3COM is not set # # Tulip family network device support # # CONFIG_NET_TULIP is not set # CONFIG_HP100 is not set CONFIG_NET_PCI=y # CONFIG_PCNET32 is not set # CONFIG_AMD8111_ETH is not set # CONFIG_ADAPTEC_STARFIRE is not set # CONFIG_B44 is not set # CONFIG_FORCEDETH is not set # CONFIG_DGRS is not set # CONFIG_EEPRO100 is not set # CONFIG_E100 is not set # CONFIG_FEALNX is not set # CONFIG_NATSEMI is not set # CONFIG_NE2K_PCI is not set # CONFIG_8139CP is not set # CONFIG_8139TOO is not set # CONFIG_SIS900 is not set # CONFIG_EPIC100 is not set # CONFIG_SUNDANCE is not set # CONFIG_VIA_RHINE is not set # CONFIG_VIA_VELOCITY is not set # # Ethernet (1000 Mbit) # # CONFIG_ACENIC is not set # CONFIG_DL2K is not set # CONFIG_E1000 is not set # CONFIG_NS83820 is not set # CONFIG_HAMACHI is not set # CONFIG_YELLOWFIN is not set # CONFIG_R8169 is not set CONFIG_SK98LIN=m # CONFIG_TIGON3 is not set # # Ethernet (10000 Mbit) # # CONFIG_IXGB is not set # CONFIG_S2IO is not set # # Token Ring devices # # CONFIG_TR is not set # # Wireless LAN (non-hamradio) # CONFIG_NET_RADIO=y # # Obsolete Wireless cards support (pre-802.11) # CONFIG_STRIP=m CONFIG_PCMCIA_WAVELAN=m CONFIG_PCMCIA_NETWAVE=m # # Wireless 802.11 Frequency Hopping cards support # CONFIG_PCMCIA_RAYCS=m # # Wireless 802.11b ISA/PCI cards support # CONFIG_HERMES=m CONFIG_PLX_HERMES=m CONFIG_TMD_HERMES=m CONFIG_PCI_HERMES=m CONFIG_ATMEL=m CONFIG_PCI_ATMEL=m # # Wireless 802.11b Pcmcia/Cardbus cards support # CONFIG_PCMCIA_HERMES=m CONFIG_AIRO_CS=m CONFIG_PCMCIA_ATMEL=m CONFIG_PCMCIA_WL3501=m # # Prism GT/Duette 802.11(a/b/g) PCI/Cardbus support # CONFIG_PRISM54=m CONFIG_NET_WIRELESS=y # # PCMCIA network device support # CONFIG_NET_PCMCIA=y CONFIG_PCMCIA_3C589=m CONFIG_PCMCIA_3C574=m CONFIG_PCMCIA_FMVJ18X=m CONFIG_PCMCIA_PCNET=m CONFIG_PCMCIA_NMCLAN=m CONFIG_PCMCIA_SMC91C92=m CONFIG_PCMCIA_XIRC2PS=m CONFIG_PCMCIA_AXNET=m # # Wan interfaces # # CONFIG_WAN is not set # CONFIG_FDDI is not set # CONFIG_HIPPI is not set # CONFIG_PLIP is not set CONFIG_PPP=m CONFIG_PPP_MULTILINK=y CONFIG_PPP_FILTER=y CONFIG_PPP_ASYNC=m CONFIG_PPP_SYNC_TTY=m CONFIG_PPP_DEFLATE=m CONFIG_PPP_BSDCOMP=m CONFIG_PPPOE=m CONFIG_SLIP=m CONFIG_SLIP_COMPRESSED=y CONFIG_SLIP_SMART=y CONFIG_SLIP_MODE_SLIP6=y # CONFIG_NET_FC is not set CONFIG_SHAPER=m CONFIG_NETCONSOLE=m # # ISDN subsystem # # CONFIG_ISDN is not set # # Telephony Support # # CONFIG_PHONE is not set # # Input device support # CONFIG_INPUT=y # # Userland interfaces # CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 CONFIG_INPUT_JOYDEV=m CONFIG_INPUT_TSDEV=m CONFIG_INPUT_TSDEV_SCREEN_X=240 CONFIG_INPUT_TSDEV_SCREEN_Y=320 CONFIG_INPUT_EVDEV=m # CONFIG_INPUT_EVBUG is not set # # Input I/O drivers # CONFIG_GAMEPORT=m CONFIG_SOUND_GAMEPORT=m CONFIG_GAMEPORT_NS558=m CONFIG_GAMEPORT_L4=m CONFIG_GAMEPORT_EMU10K1=m CONFIG_GAMEPORT_VORTEX=m CONFIG_GAMEPORT_FM801=m CONFIG_GAMEPORT_CS461x=m CONFIG_SERIO=y CONFIG_SERIO_I8042=y CONFIG_SERIO_SERPORT=m CONFIG_SERIO_CT82C710=m CONFIG_SERIO_PARKBD=m CONFIG_SERIO_PCIPS2=m # # Input Device Drivers # CONFIG_INPUT_KEYBOARD=y CONFIG_KEYBOARD_ATKBD=y CONFIG_KEYBOARD_SUNKBD=m # CONFIG_KEYBOARD_LKKBD is not set CONFIG_KEYBOARD_XTKBD=m CONFIG_KEYBOARD_NEWTON=m CONFIG_INPUT_MOUSE=y CONFIG_MOUSE_PS2=y CONFIG_MOUSE_SERIAL=m # CONFIG_MOUSE_VSXXXAA is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set CONFIG_INPUT_MISC=y CONFIG_INPUT_PCSPKR=m CONFIG_INPUT_UINPUT=m # # Character devices # CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_SERIAL_NONSTANDARD=y # CONFIG_COMPUTONE is not set # CONFIG_ROCKETPORT is not set # CONFIG_CYCLADES is not set # CONFIG_DIGIEPCA is not set # CONFIG_DIGI is not set # CONFIG_MOXA_INTELLIO is not set # CONFIG_MOXA_SMARTIO is not set # CONFIG_ISI is not set # CONFIG_SYNCLINK is not set # CONFIG_SYNCLINKMP is not set CONFIG_N_HDLC=m # CONFIG_RISCOM8 is not set # CONFIG_SPECIALIX is not set # CONFIG_SX is not set # CONFIG_RIO is not set # CONFIG_STALDRV is not set # # Serial drivers # CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CS=m CONFIG_SERIAL_8250_ACPI=y CONFIG_SERIAL_8250_NR_UARTS=4 CONFIG_SERIAL_8250_EXTENDED=y # CONFIG_SERIAL_8250_MANY_PORTS is not set CONFIG_SERIAL_8250_SHARE_IRQ=y # CONFIG_SERIAL_8250_DETECT_IRQ is not set # CONFIG_SERIAL_8250_MULTIPORT is not set # CONFIG_SERIAL_8250_RSA is not set # # Non-8250 serial port support # CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_UNIX98_PTYS=y CONFIG_LEGACY_PTYS=y CONFIG_LEGACY_PTY_COUNT=256 CONFIG_PRINTER=m # CONFIG_LP_CONSOLE is not set CONFIG_PPDEV=m CONFIG_TIPAR=m # CONFIG_QIC02_TAPE is not set # # IPMI # CONFIG_IPMI_HANDLER=m CONFIG_IPMI_PANIC_EVENT=y CONFIG_IPMI_PANIC_STRING=y CONFIG_IPMI_DEVICE_INTERFACE=m CONFIG_IPMI_SI=m CONFIG_IPMI_WATCHDOG=m # # Watchdog Cards # # CONFIG_WATCHDOG is not set CONFIG_HW_RANDOM=m CONFIG_NVRAM=m CONFIG_RTC=y # CONFIG_DTLK is not set # CONFIG_R3964 is not set # CONFIG_APPLICOM is not set # # Ftape, the floppy tape device driver # # CONFIG_FTAPE is not set CONFIG_AGP=y CONFIG_AGP_AMD64=y # CONFIG_AGP_INTEL_MCH is not set # CONFIG_DRM is not set # # PCMCIA character devices # CONFIG_SYNCLINK_CS=m # CONFIG_MWAVE is not set CONFIG_RAW_DRIVER=m CONFIG_HPET=y # CONFIG_HPET_RTC_IRQ is not set CONFIG_HPET_MMAP=y CONFIG_MAX_RAW_DEVS=4096 CONFIG_HANGCHECK_TIMER=m # # I2C support # CONFIG_I2C=m CONFIG_I2C_CHARDEV=m # # I2C Algorithms # CONFIG_I2C_ALGOBIT=m CONFIG_I2C_ALGOPCF=m # # I2C Hardware Bus support # CONFIG_I2C_ALI1535=m # CONFIG_I2C_ALI1563 is not set CONFIG_I2C_ALI15X3=m CONFIG_I2C_AMD756=m CONFIG_I2C_AMD8111=m CONFIG_I2C_I801=m CONFIG_I2C_I810=m CONFIG_I2C_ISA=m CONFIG_I2C_NFORCE2=m CONFIG_I2C_PARPORT=m CONFIG_I2C_PARPORT_LIGHT=m CONFIG_I2C_PROSAVAGE=m CONFIG_I2C_SAVAGE4=m CONFIG_SCx200_ACB=m CONFIG_I2C_SIS5595=m CONFIG_I2C_SIS630=m CONFIG_I2C_SIS96X=m CONFIG_I2C_VIA=m CONFIG_I2C_VIAPRO=m CONFIG_I2C_VOODOO3=m # # Hardware Sensors Chip support # CONFIG_I2C_SENSOR=m CONFIG_SENSORS_ADM1021=m # CONFIG_SENSORS_ADM1025 is not set # CONFIG_SENSORS_ADM1031 is not set CONFIG_SENSORS_ASB100=m CONFIG_SENSORS_DS1621=m CONFIG_SENSORS_FSCHER=m CONFIG_SENSORS_GL518SM=m CONFIG_SENSORS_IT87=m CONFIG_SENSORS_LM75=m # CONFIG_SENSORS_LM77 is not set CONFIG_SENSORS_LM78=m CONFIG_SENSORS_LM80=m CONFIG_SENSORS_LM83=m CONFIG_SENSORS_LM85=m CONFIG_SENSORS_LM90=m # CONFIG_SENSORS_MAX1619 is not set CONFIG_SENSORS_VIA686A=m CONFIG_SENSORS_W83781D=m CONFIG_SENSORS_W83L785TS=m CONFIG_SENSORS_W83627HF=m # # Other I2C Chip support # CONFIG_SENSORS_EEPROM=m # CONFIG_SENSORS_PCF8574 is not set # CONFIG_SENSORS_PCF8591 is not set # CONFIG_SENSORS_RTC8564 is not set CONFIG_I2C_DEBUG_CORE=y CONFIG_I2C_DEBUG_ALGO=y CONFIG_I2C_DEBUG_BUS=y CONFIG_I2C_DEBUG_CHIP=y # # Dallas's 1-wire bus # # CONFIG_W1 is not set # # Misc devices # # CONFIG_IBM_ASM is not set # # Multimedia devices # CONFIG_VIDEO_DEV=m # # Video For Linux # # # Video Adapters # CONFIG_VIDEO_BT848=m CONFIG_VIDEO_BWQCAM=m CONFIG_VIDEO_CQCAM=m CONFIG_VIDEO_W9966=m CONFIG_VIDEO_CPIA=m CONFIG_VIDEO_CPIA_PP=m CONFIG_VIDEO_CPIA_USB=m CONFIG_VIDEO_SAA5246A=m CONFIG_VIDEO_SAA5249=m CONFIG_TUNER_3036=m CONFIG_VIDEO_STRADIS=m # CONFIG_VIDEO_ZORAN is not set CONFIG_VIDEO_SAA7134=m CONFIG_VIDEO_MXB=m CONFIG_VIDEO_DPC=m CONFIG_VIDEO_HEXIUM_ORION=m CONFIG_VIDEO_HEXIUM_GEMINI=m CONFIG_VIDEO_CX88=m # CONFIG_VIDEO_OVCAMCHIP is not set # # Radio Adapters # CONFIG_RADIO_GEMTEK_PCI=m CONFIG_RADIO_MAXIRADIO=m CONFIG_RADIO_MAESTRO=m # # Digital Video Broadcasting Devices # CONFIG_DVB=y CONFIG_DVB_CORE=m # # Supported Frontend Modules # CONFIG_DVB_TWINHAN_DST=m CONFIG_DVB_STV0299=m CONFIG_DVB_SP887X=m CONFIG_DVB_SP887X_FIRMWARE_FILE="/etc/dvb/sc_main.mc" CONFIG_DVB_ALPS_TDLB7=m CONFIG_DVB_ALPS_TDMB7=m CONFIG_DVB_ATMEL_AT76C651=m CONFIG_DVB_CX24110=m CONFIG_DVB_GRUNDIG_29504_491=m CONFIG_DVB_GRUNDIG_29504_401=m CONFIG_DVB_MT312=m CONFIG_DVB_VES1820=m CONFIG_DVB_VES1X93=m CONFIG_DVB_TDA1004X=m CONFIG_DVB_TDA1004X_FIRMWARE_FILE="/usr/lib/hotplug/firmware/tda1004x.bin" CONFIG_DVB_NXT6000=m # # Supported SAA7146 based PCI Adapters # CONFIG_DVB_AV7110=m # CONFIG_DVB_AV7110_OSD is not set CONFIG_DVB_BUDGET=m CONFIG_DVB_BUDGET_CI=m CONFIG_DVB_BUDGET_AV=m CONFIG_DVB_BUDGET_PATCH=m # # Supported USB Adapters # CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m # # Supported FlexCopII (B2C2) Adapters # CONFIG_DVB_B2C2_SKYSTAR=m # # Supported BT878 Adapters # CONFIG_DVB_BT8XX=m CONFIG_VIDEO_SAA7146=m CONFIG_VIDEO_SAA7146_VV=m CONFIG_VIDEO_VIDEOBUF=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEO_BUF=m CONFIG_VIDEO_BTCX=m CONFIG_VIDEO_IR=m # # Graphics support # CONFIG_FB=y # CONFIG_FB_CIRRUS is not set # CONFIG_FB_PM2 is not set # CONFIG_FB_CYBER2000 is not set # CONFIG_FB_ASILIANT is not set # CONFIG_FB_IMSTT is not set # CONFIG_FB_VGA16 is not set CONFIG_FB_VESA=y CONFIG_VIDEO_SELECT=y # CONFIG_FB_HGA is not set # CONFIG_FB_RIVA is not set # CONFIG_FB_MATROX is not set # CONFIG_FB_RADEON_OLD is not set # CONFIG_FB_RADEON is not set # CONFIG_FB_ATY128 is not set # CONFIG_FB_ATY is not set # CONFIG_FB_SIS is not set # CONFIG_FB_NEOMAGIC is not set # CONFIG_FB_KYRO is not set # CONFIG_FB_3DFX is not set # CONFIG_FB_VOODOO1 is not set # CONFIG_FB_TRIDENT is not set CONFIG_FB_VIRTUAL=m # # Console display driver support # CONFIG_VGA_CONSOLE=y CONFIG_MDA_CONSOLE=m CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FONTS=y CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y # CONFIG_FONT_6x11 is not set # CONFIG_FONT_PEARL_8x8 is not set # CONFIG_FONT_ACORN_8x8 is not set # CONFIG_FONT_MINI_4x6 is not set # CONFIG_FONT_SUN8x16 is not set # CONFIG_FONT_SUN12x22 is not set # # Logo configuration # CONFIG_LOGO=y # CONFIG_LOGO_LINUX_MONO is not set # CONFIG_LOGO_LINUX_VGA16 is not set CONFIG_LOGO_LINUX_CLUT224=y # # Sound # CONFIG_SOUND=m # # Advanced Linux Sound Architecture # CONFIG_SND=m CONFIG_SND_TIMER=m CONFIG_SND_PCM=m CONFIG_SND_HWDEP=m CONFIG_SND_RAWMIDI=m CONFIG_SND_SEQUENCER=m CONFIG_SND_SEQ_DUMMY=m CONFIG_SND_OSSEMUL=y CONFIG_SND_MIXER_OSS=m CONFIG_SND_PCM_OSS=m CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_BIT32_EMUL=m CONFIG_SND_RTCTIMER=m CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_DEBUG=y CONFIG_SND_DEBUG_MEMORY=y CONFIG_SND_DEBUG_DETECT=y # # Generic devices # CONFIG_SND_MPU401_UART=m CONFIG_SND_DUMMY=m CONFIG_SND_VIRMIDI=m CONFIG_SND_MTPAV=m CONFIG_SND_SERIAL_U16550=m CONFIG_SND_MPU401=m # # PCI devices # CONFIG_SND_AC97_CODEC=m # CONFIG_SND_ALI5451 is not set # CONFIG_SND_ATIIXP is not set # CONFIG_SND_AU8810 is not set # CONFIG_SND_AU8820 is not set # CONFIG_SND_AU8830 is not set # CONFIG_SND_AZT3328 is not set # CONFIG_SND_BT87X is not set # CONFIG_SND_CS46XX is not set # CONFIG_SND_CS4281 is not set # CONFIG_SND_EMU10K1 is not set # CONFIG_SND_KORG1212 is not set # CONFIG_SND_MIXART is not set # CONFIG_SND_NM256 is not set # CONFIG_SND_RME32 is not set # CONFIG_SND_RME96 is not set # CONFIG_SND_RME9652 is not set # CONFIG_SND_HDSP is not set # CONFIG_SND_TRIDENT is not set # CONFIG_SND_YMFPCI is not set # CONFIG_SND_ALS4000 is not set # CONFIG_SND_CMIPCI is not set # CONFIG_SND_ENS1370 is not set # CONFIG_SND_ENS1371 is not set # CONFIG_SND_ES1938 is not set # CONFIG_SND_ES1968 is not set # CONFIG_SND_MAESTRO3 is not set # CONFIG_SND_FM801 is not set # CONFIG_SND_ICE1712 is not set # CONFIG_SND_ICE1724 is not set CONFIG_SND_INTEL8X0=m CONFIG_SND_INTEL8X0M=m # CONFIG_SND_SONICVIBES is not set # CONFIG_SND_VIA82XX is not set # CONFIG_SND_VX222 is not set # # ALSA USB devices # CONFIG_SND_USB_AUDIO=m # # PCMCIA devices # # # Open Sound System # # CONFIG_SOUND_PRIME is not set # # USB support # CONFIG_USB=m # CONFIG_USB_DEBUG is not set # # Miscellaneous USB options # CONFIG_USB_DEVICEFS=y CONFIG_USB_BANDWIDTH=y CONFIG_USB_DYNAMIC_MINORS=y # # USB Host Controller Drivers # CONFIG_USB_EHCI_HCD=m CONFIG_USB_EHCI_SPLIT_ISO=y # CONFIG_USB_EHCI_ROOT_HUB_TT is not set CONFIG_USB_OHCI_HCD=m CONFIG_USB_UHCI_HCD=m # # USB Device Class drivers # CONFIG_USB_AUDIO=m # # USB Bluetooth TTY can only be used with disabled Bluetooth subsystem # CONFIG_USB_MIDI=m CONFIG_USB_ACM=m CONFIG_USB_PRINTER=m CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_RW_DETECT=y CONFIG_USB_STORAGE_DATAFAB=y CONFIG_USB_STORAGE_FREECOM=y CONFIG_USB_STORAGE_ISD200=y CONFIG_USB_STORAGE_DPCM=y CONFIG_USB_STORAGE_HP8200e=y CONFIG_USB_STORAGE_SDDR09=y CONFIG_USB_STORAGE_SDDR55=y CONFIG_USB_STORAGE_JUMPSHOT=y # # USB Human Interface Devices (HID) # CONFIG_USB_HID=m CONFIG_USB_HIDINPUT=y CONFIG_HID_FF=y CONFIG_HID_PID=y CONFIG_LOGITECH_FF=y CONFIG_THRUSTMASTER_FF=y CONFIG_USB_HIDDEV=y # # USB HID Boot Protocol drivers # # CONFIG_USB_KBD is not set # CONFIG_USB_MOUSE is not set CONFIG_USB_AIPTEK=m CONFIG_USB_WACOM=m CONFIG_USB_KBTAB=m CONFIG_USB_POWERMATE=m CONFIG_USB_MTOUCH=m # CONFIG_USB_EGALAX is not set CONFIG_USB_XPAD=m CONFIG_USB_ATI_REMOTE=m # # USB Imaging devices # CONFIG_USB_MDC800=m CONFIG_USB_MICROTEK=m CONFIG_USB_HPUSBSCSI=m # # USB Multimedia devices # CONFIG_USB_DABUSB=m CONFIG_USB_VICAM=m CONFIG_USB_DSBR=m CONFIG_USB_IBMCAM=m CONFIG_USB_KONICAWC=m CONFIG_USB_OV511=m CONFIG_USB_PWC=m CONFIG_USB_SE401=m CONFIG_USB_SN9C102=m CONFIG_USB_STV680=m # # USB Network adaptors # CONFIG_USB_CATC=m CONFIG_USB_KAWETH=m CONFIG_USB_PEGASUS=m CONFIG_USB_RTL8150=m CONFIG_USB_USBNET=m # # USB Host-to-Host Cables # CONFIG_USB_ALI_M5632=y CONFIG_USB_AN2720=y CONFIG_USB_BELKIN=y CONFIG_USB_GENESYS=y CONFIG_USB_NET1080=y CONFIG_USB_PL2301=y # # Intelligent USB Devices/Gadgets # CONFIG_USB_ARMLINUX=y CONFIG_USB_EPSON2888=y CONFIG_USB_ZAURUS=y CONFIG_USB_CDCETHER=y # # USB Network Adapters # CONFIG_USB_AX8817X=y # # USB port drivers # CONFIG_USB_USS720=m # # USB Serial Converter support # CONFIG_USB_SERIAL=m CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_BELKIN=m # CONFIG_USB_SERIAL_WHITEHEAT is not set CONFIG_USB_SERIAL_DIGI_ACCELEPORT=m CONFIG_USB_SERIAL_EMPEG=m CONFIG_USB_SERIAL_FTDI_SIO=m CONFIG_USB_SERIAL_VISOR=m CONFIG_USB_SERIAL_IPAQ=m CONFIG_USB_SERIAL_IR=m CONFIG_USB_SERIAL_EDGEPORT=m CONFIG_USB_SERIAL_EDGEPORT_TI=m CONFIG_USB_SERIAL_KEYSPAN_PDA=m CONFIG_USB_SERIAL_KEYSPAN=m CONFIG_USB_SERIAL_KEYSPAN_MPR=y CONFIG_USB_SERIAL_KEYSPAN_USA28=y CONFIG_USB_SERIAL_KEYSPAN_USA28X=y CONFIG_USB_SERIAL_KEYSPAN_USA28XA=y CONFIG_USB_SERIAL_KEYSPAN_USA28XB=y CONFIG_USB_SERIAL_KEYSPAN_USA19=y CONFIG_USB_SERIAL_KEYSPAN_USA18X=y CONFIG_USB_SERIAL_KEYSPAN_USA19W=y CONFIG_USB_SERIAL_KEYSPAN_USA19QW=y CONFIG_USB_SERIAL_KEYSPAN_USA19QI=y CONFIG_USB_SERIAL_KEYSPAN_USA49W=y CONFIG_USB_SERIAL_KEYSPAN_USA49WLC=y CONFIG_USB_SERIAL_KLSI=m CONFIG_USB_SERIAL_KOBIL_SCT=m CONFIG_USB_SERIAL_MCT_U232=m CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_SAFE=m CONFIG_USB_SERIAL_SAFE_PADDED=y CONFIG_USB_SERIAL_CYBERJACK=m CONFIG_USB_SERIAL_XIRCOM=m CONFIG_USB_SERIAL_OMNINET=m CONFIG_USB_EZUSB=y # # USB Miscellaneous drivers # CONFIG_USB_EMI62=m CONFIG_USB_EMI26=m CONFIG_USB_TIGL=m CONFIG_USB_AUERSWALD=m CONFIG_USB_RIO500=m CONFIG_USB_LEGOTOWER=m CONFIG_USB_LCD=m CONFIG_USB_LED=m # CONFIG_USB_CYTHERM is not set # CONFIG_USB_PHIDGETSERVO is not set # CONFIG_USB_TEST is not set # # USB Gadget Support # # CONFIG_USB_GADGET is not set # # Firmware Drivers # # CONFIG_EDD is not set # # File systems # CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT2_FS_SECURITY=y CONFIG_EXT3_FS=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_EXT3_FS_SECURITY=y CONFIG_JBD=y CONFIG_JBD_DEBUG=y CONFIG_FS_MBCACHE=y CONFIG_REISERFS_FS=y # CONFIG_REISERFS_CHECK is not set CONFIG_REISERFS_PROC_INFO=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_REISERFS_FS_SECURITY=y # CONFIG_JFS_FS is not set CONFIG_FS_POSIX_ACL=y # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set CONFIG_QUOTA=y CONFIG_QFMT_V1=m CONFIG_QFMT_V2=m CONFIG_QUOTACTL=y CONFIG_AUTOFS_FS=m CONFIG_AUTOFS4_FS=m # # CD-ROM/DVD Filesystems # CONFIG_ISO9660_FS=m CONFIG_JOLIET=y CONFIG_ZISOFS=y CONFIG_ZISOFS_FS=m CONFIG_UDF_FS=m CONFIG_UDF_NLS=y # # DOS/FAT/NT Filesystems # CONFIG_FAT_FS=m CONFIG_MSDOS_FS=m CONFIG_VFAT_FS=m CONFIG_FAT_DEFAULT_CODEPAGE=437 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" CONFIG_NTFS_FS=m CONFIG_NTFS_DEBUG=y CONFIG_NTFS_RW=y # # Pseudo filesystems # CONFIG_PROC_FS=y CONFIG_PROC_KCORE=y CONFIG_SYSFS=y # CONFIG_DEVFS_FS is not set CONFIG_DEVPTS_FS_XATTR=y CONFIG_DEVPTS_FS_SECURITY=y CONFIG_TMPFS=y CONFIG_HUGETLBFS=y CONFIG_HUGETLB_PAGE=y CONFIG_RAMFS=y # # Miscellaneous filesystems # # CONFIG_ADFS_FS is not set # CONFIG_AFFS_FS is not set # CONFIG_HFS_FS is not set # CONFIG_HFSPLUS_FS is not set # CONFIG_BEFS_FS is not set # CONFIG_BFS_FS is not set # CONFIG_EFS_FS is not set # CONFIG_JFFS_FS is not set # CONFIG_JFFS2_FS is not set # CONFIG_CRAMFS is not set # CONFIG_VXFS_FS is not set # CONFIG_HPFS_FS is not set # CONFIG_QNX4FS_FS is not set # CONFIG_SYSV_FS is not set # CONFIG_UFS_FS is not set # # Network File Systems # CONFIG_NFS_FS=m CONFIG_NFS_V3=y CONFIG_NFS_V4=y # CONFIG_NFS_DIRECTIO is not set CONFIG_NFSD=m CONFIG_NFSD_V3=y CONFIG_NFSD_V4=y CONFIG_NFSD_TCP=y CONFIG_LOCKD=m CONFIG_LOCKD_V4=y CONFIG_EXPORTFS=m CONFIG_SUNRPC=m CONFIG_SUNRPC_GSS=m CONFIG_RPCSEC_GSS_KRB5=m CONFIG_SMB_FS=m CONFIG_SMB_NLS_DEFAULT=y CONFIG_SMB_NLS_REMOTE="cp852" CONFIG_CIFS=m CONFIG_CIFS_STATS=y CONFIG_CIFS_XATTR=y CONFIG_CIFS_POSIX=y CONFIG_NCP_FS=m CONFIG_NCPFS_PACKET_SIGNING=y CONFIG_NCPFS_IOCTL_LOCKING=y CONFIG_NCPFS_STRONG=y CONFIG_NCPFS_NFS_NS=y CONFIG_NCPFS_OS2_NS=y CONFIG_NCPFS_SMALLDOS=y CONFIG_NCPFS_NLS=y CONFIG_NCPFS_EXTRAS=y # CONFIG_CODA_FS is not set # CONFIG_AFS_FS is not set # # Partition Types # # CONFIG_PARTITION_ADVANCED is not set CONFIG_MSDOS_PARTITION=y # # Native Language Support # CONFIG_NLS=y CONFIG_NLS_DEFAULT="iso8859-2" CONFIG_NLS_CODEPAGE_437=m CONFIG_NLS_CODEPAGE_737=m CONFIG_NLS_CODEPAGE_775=m CONFIG_NLS_CODEPAGE_850=m CONFIG_NLS_CODEPAGE_852=m CONFIG_NLS_CODEPAGE_855=m CONFIG_NLS_CODEPAGE_857=m CONFIG_NLS_CODEPAGE_860=m CONFIG_NLS_CODEPAGE_861=m CONFIG_NLS_CODEPAGE_862=m CONFIG_NLS_CODEPAGE_863=m CONFIG_NLS_CODEPAGE_864=m CONFIG_NLS_CODEPAGE_865=m CONFIG_NLS_CODEPAGE_866=m CONFIG_NLS_CODEPAGE_869=m CONFIG_NLS_CODEPAGE_936=m CONFIG_NLS_CODEPAGE_950=m CONFIG_NLS_CODEPAGE_932=m CONFIG_NLS_CODEPAGE_949=m CONFIG_NLS_CODEPAGE_874=m CONFIG_NLS_ISO8859_8=m CONFIG_NLS_CODEPAGE_1250=m CONFIG_NLS_CODEPAGE_1251=m # CONFIG_NLS_ASCII is not set CONFIG_NLS_ISO8859_1=m CONFIG_NLS_ISO8859_2=m CONFIG_NLS_ISO8859_3=m CONFIG_NLS_ISO8859_4=m CONFIG_NLS_ISO8859_5=m CONFIG_NLS_ISO8859_6=m CONFIG_NLS_ISO8859_7=m CONFIG_NLS_ISO8859_9=m CONFIG_NLS_ISO8859_13=m CONFIG_NLS_ISO8859_14=m CONFIG_NLS_ISO8859_15=m CONFIG_NLS_KOI8_R=m CONFIG_NLS_KOI8_U=m CONFIG_NLS_UTF8=m # # Profiling support # CONFIG_PROFILING=y CONFIG_OPROFILE=m # # Kernel hacking # CONFIG_DEBUG_KERNEL=y # CONFIG_DEBUG_SLAB is not set CONFIG_MAGIC_SYSRQ=y CONFIG_DEBUG_SPINLOCK=y # CONFIG_CHECKING is not set # CONFIG_INIT_DEBUG is not set # CONFIG_DEBUG_INFO is not set # CONFIG_FRAME_POINTER is not set # CONFIG_IOMMU_DEBUG is not set # # Security options # CONFIG_SECURITY=y CONFIG_SECURITY_NETWORK=y CONFIG_SECURITY_CAPABILITIES=y CONFIG_SECURITY_ROOTPLUG=m CONFIG_SECURITY_SELINUX=y CONFIG_SECURITY_SELINUX_BOOTPARAM=y CONFIG_SECURITY_SELINUX_DISABLE=y CONFIG_SECURITY_SELINUX_DEVELOP=y CONFIG_SECURITY_SELINUX_MLS=y # # Cryptographic options # CONFIG_CRYPTO=y CONFIG_CRYPTO_HMAC=y CONFIG_CRYPTO_NULL=m CONFIG_CRYPTO_MD4=m CONFIG_CRYPTO_MD5=y CONFIG_CRYPTO_SHA1=m CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_DES=y CONFIG_CRYPTO_BLOWFISH=m CONFIG_CRYPTO_TWOFISH=m CONFIG_CRYPTO_SERPENT=m CONFIG_CRYPTO_AES=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m CONFIG_CRYPTO_TEA=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_KHAZAD=m CONFIG_CRYPTO_DEFLATE=m CONFIG_CRYPTO_MICHAEL_MIC=m CONFIG_CRYPTO_CRC32C=m CONFIG_CRYPTO_TEST=m # # Library routines # CONFIG_CRC_CCITT=m CONFIG_CRC32=y CONFIG_LIBCRC32C=m CONFIG_ZLIB_INFLATE=m CONFIG_ZLIB_DEFLATE=m ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] 2004-09-03 21:11 ` schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki @ 2004-09-08 7:09 ` Rick Lindsley 0 siblings, 0 replies; 60+ messages in thread From: Rick Lindsley @ 2004-09-08 7:09 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: linux-kernel I wrote: A schedstats patch for 2.6.8.1 is available at http://eaglet.rain.com/rick/linux/schedstat/patches/schedstat-2.6.8.1 or http://oss.software.ibm.com/linux/patches/?patch_id=3D730 Rafael replied: It does not compile for me on a UP system: Mea culpa. This was fixed once but didn't propogate into my last patch. Please try this patch instead. diff -rupN linux-2.6.8.1/Documentation/sched-stats.txt linux-2.6.8.1-ss/Documentation/sched-stats.txt --- linux-2.6.8.1/Documentation/sched-stats.txt 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.6.8.1-ss/Documentation/sched-stats.txt 2004-09-07 22:30:10.000000000 -0700 @@ -0,0 +1,150 @@ +Version 9 of schedstats introduces support for sched_domains, which +hit the mainline kernel in 2.6.7. Some counters make more sense to be +per-runqueue; other to be per-domain. + +In version 9 of schedstat, there is at least one level of domain +statistics for each cpu listed, and there may well be more than one +domain. Domains have no particular names in this implementation, but +the highest numbered one typically arbitrates balancing across all the +cpus on the machine, while domain0 is the most tightly focused domain, +sometimes balancing only between pairs of cpus. At this time, there +are no architectures which need more than three domain levels. The first +field in the domain stats is a bit map indicating which cpus are affected +by that domain. + +These fields are counters, and only increment. Programs which make use +of these will need to start with a baseline observation and then calculate +the change in the counters at each subsequent observation. A perl script +which does this for many of the fields is available at + + http://eaglet.rain.com/rick/linux/schedstat/ + +Note that any such script will necessarily be version-specific, as the main +reason to change versions is changes in the output format. For those wishing +to write their own scripts, the fields are described here. + +CPU statistics +-------------- +cpu<N> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 + +NOTE: In the sched_yield() statistics, the active queue is considered empty + if it has only one process in it, since obviously the process calling + sched_yield() is that process. + +First four fields are sched_yield() statistics: + 1) # of times both the active and the expired queue were empty + 2) # of times just the active queue was empty + 3) # of times just the expired queue was empty + 4) # of times sched_yield() was called + +Next four are schedule() statistics: + 5) # of times the active queue had at least one other process on it. + 6) # of times we switched to the expired queue and reused it + 7) # of times schedule() was called + 8) # of times schedule() left the processor idle + +Next four are active_load_balance() statistics: + 9) # of times active_load_balance() was called + 10) # of times active_load_balance() caused this cpu to gain a task + 11) # of times active_load_balance() caused this cpu to lose a task + 12) # of times active_load_balance() tried to move a task and failed + +Next three are try_to_wake_up() statistics: + 13) # of times try_to_wake_up() was called + 14) # of times try_to_wake_up() successfully moved the awakening task + 15) # of times try_to_wake_up() attempted to move the awakening task + +Next two are wake_up_forked_thread() statistics: + 16) # of times wake_up_forked_thread() was called + 17) # of times wake_up_forked_thread() successfully moved the forked task + +Next one is a sched_migrate_task() statistic: + 18) # of times sched_migrate_task() was called + +Next one is a sched_balance_exec() statistic: + 19) # of times sched_balance_exec() was called + +Next three are statistics describing scheduling latency: + 20) sum of all time spent running by tasks on this processor (in ms) + 21) sum of all time spent waiting to run by tasks on this processor (in ms) + 22) # of tasks (not necessarily unique) given to the processor + +The last six are statistics dealing with pull_task(): + 23) # of times pull_task() moved a task to this cpu when newly idle + 24) # of times pull_task() stole a task from this cpu when another cpu + was newly idle + 25) # of times pull_task() moved a task to this cpu when idle + 26) # of times pull_task() stole a task from this cpu when another cpu + was idle + 27) # of times pull_task() moved a task to this cpu when busy + 28) # of times pull_task() stole a task from this cpu when another cpu + was busy + + +Domain statistics +----------------- +One of these is produced per domain for each cpu described. + +domain<N> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 + +The first field is a bit mask indicating what cpus this domain operates over. + +The next fifteen are a variety of load_balance() statistics: + + 1) # of times in this domain load_balance() was called when the cpu + was idle + 2) # of times in this domain load_balance() was called when the cpu + was busy + 3) # of times in this domain load_balance() was called when the cpu + was just becoming idle + 4) # of times in this domain load_balance() tried to move one or more + tasks and failed, when the cpu was idle + 5) # of times in this domain load_balance() tried to move one or more + tasks and failed, when the cpu was busy + 6) # of times in this domain load_balance() tried to move one or more + tasks and failed, when the cpu was just becoming idle + 7) sum of imbalances discovered (if any) with each call to + load_balance() in this domain when the cpu was idle + 8) sum of imbalances discovered (if any) with each call to + load_balance() in this domain when the cpu was busy + 9) sum of imbalances discovered (if any) with each call to + load_balance() in this domain when the cpu was just becoming idle + 10) # of times in this domain load_balance() was called but did not find + a busier queue while the cpu was idle + 11) # of times in this domain load_balance() was called but did not find + a busier queue while the cpu was busy + 12) # of times in this domain load_balance() was called but did not find + a busier queue while the cpu was just becoming idle + 13) # of times in this domain a busier queue was found while the cpu was + idle but no busier group was found + 14) # of times in this domain a busier queue was found while the cpu was + busy but no busier group was found + 15) # of times in this domain a busier queue was found while the cpu was + just becoming idle but no busier group was found + +Next two are sched_balance_exec() statistics: + 17) # of times in this domain sched_balance_exec() successfully pushed + a task to a new cpu + 18) # of times in this domain sched_balance_exec() tried but failed to + push a task to a new cpu + +Next two are try_to_wake_up() statistics: + 19) # of times in this domain try_to_wake_up() tried to move a task based + on affinity and cache warmth + 20) # of times in this domain try_to_wake_up() tried to move a task based + on load balancing + + +/proc/<pid>/stat +---------------- +schedstats also changes the stat output of individual processes to +include some of the same information on a per-process level, obtainable +from /proc/<pid>/stat. Three new fields correlating to fields 20, 21, +and 22 in the CPU fields, are tacked on to the end but apply only for +that process. + +A program could be easily written to make use of these extra fields to +report on how well a particular process or set of processes is faring +under the scheduler's policies. A simple version of such a program is +available at + http://eaglet.rain.com/rick/linux/schedstat/v9/latency.c diff -rupN linux-2.6.8.1/arch/i386/Kconfig linux-2.6.8.1-ss/arch/i386/Kconfig --- linux-2.6.8.1/arch/i386/Kconfig 2004-08-14 03:54:50.000000000 -0700 +++ linux-2.6.8.1-ss/arch/i386/Kconfig 2004-09-07 22:30:10.000000000 -0700 @@ -1298,6 +1298,19 @@ config 4KSTACKS on the VM subsystem for higher order allocations. This option will also use IRQ stacks to compensate for the reduced stackspace. +config SCHEDSTATS + bool "Collect scheduler statistics" + depends on PROC_FS + default y + help + If you say Y here, additional code will be inserted into the + scheduler and related routines to collect statistics about + scheduler behavior and provide them in /proc/schedstat. These + stats may be useful for both tuning and debugging the scheduler + If you aren't debugging the scheduler or trying to tune a specific + application, you can say N to avoid the very slight overhead + this adds. + config X86_FIND_SMP_CONFIG bool depends on X86_LOCAL_APIC || X86_VOYAGER diff -rupN linux-2.6.8.1/arch/ppc/Kconfig linux-2.6.8.1-ss/arch/ppc/Kconfig --- linux-2.6.8.1/arch/ppc/Kconfig 2004-08-14 03:56:23.000000000 -0700 +++ linux-2.6.8.1-ss/arch/ppc/Kconfig 2004-09-07 22:30:10.000000000 -0700 @@ -1333,6 +1333,19 @@ config DEBUG_INFO debug the kernel. If you don't debug the kernel, you can say N. +config SCHEDSTATS + bool "Collect scheduler statistics" + depends on PROC_FS + default y + help + If you say Y here, additional code will be inserted into the + scheduler and related routines to collect statistics about + scheduler behavior and provide them in /proc/schedstat. These + stats may be useful for both tuning and debugging the scheduler + If you aren't debugging the scheduler or trying to tune a specific + application, you can say N to avoid the very slight overhead + this adds. + config BOOTX_TEXT bool "Support for early boot text console (BootX or OpenFirmware only)" depends PPC_OF diff -rupN linux-2.6.8.1/arch/ppc64/Kconfig linux-2.6.8.1-ss/arch/ppc64/Kconfig --- linux-2.6.8.1/arch/ppc64/Kconfig 2004-08-14 03:55:33.000000000 -0700 +++ linux-2.6.8.1-ss/arch/ppc64/Kconfig 2004-09-07 22:30:10.000000000 -0700 @@ -424,6 +424,19 @@ config IRQSTACKS for handling hard and soft interrupts. This can help avoid overflowing the process kernel stacks. +config SCHEDSTATS + bool "Collect scheduler statistics" + depends on PROC_FS + default y + help + If you say Y here, additional code will be inserted into the + scheduler and related routines to collect statistics about + scheduler behavior and provide them in /proc/schedstat. These + stats may be useful for both tuning and debugging the scheduler + If you aren't debugging the scheduler or trying to tune a specific + application, you can say N to avoid the very slight overhead + this adds. + config SPINLINE bool "Inline spinlock code at each call site" depends on SMP && !PPC_SPLPAR && !PPC_ISERIES diff -rupN linux-2.6.8.1/arch/x86_64/Kconfig linux-2.6.8.1-ss/arch/x86_64/Kconfig --- linux-2.6.8.1/arch/x86_64/Kconfig 2004-08-14 03:55:59.000000000 -0700 +++ linux-2.6.8.1-ss/arch/x86_64/Kconfig 2004-09-07 22:30:10.000000000 -0700 @@ -461,6 +461,19 @@ config DEBUG_INFO Say Y here only if you plan to use gdb to debug the kernel. Please note that this option requires new binutils. If you don't debug the kernel, you can say N. + +config SCHEDSTATS + bool "Collect scheduler statistics" + depends on PROC_FS + default y + help + If you say Y here, additional code will be inserted into the + scheduler and related routines to collect statistics about + scheduler behavior and provide them in /proc/schedstat. These + stats may be useful for both tuning and debugging the scheduler + If you aren't debugging the scheduler or trying to tune a specific + application, you can say N to avoid the very slight overhead + this adds. config FRAME_POINTER bool "Compile the kernel with frame pointers" diff -rupN linux-2.6.8.1/fs/proc/array.c linux-2.6.8.1-ss/fs/proc/array.c --- linux-2.6.8.1/fs/proc/array.c 2004-08-14 03:55:34.000000000 -0700 +++ linux-2.6.8.1-ss/fs/proc/array.c 2004-09-07 22:30:10.000000000 -0700 @@ -358,9 +358,15 @@ int proc_pid_stat(struct task_struct *ta /* Temporary variable needed for gcc-2.96 */ start_time = jiffies_64_to_clock_t(task->start_time - INITIAL_JIFFIES); +#ifdef CONFIG_SCHEDSTATS + res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ +%lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu \ +%lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu %lu %lu %lu\n", +#else res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ %lu %lu %lu %lu %lu %ld %ld %ld %ld %d %ld %llu %lu %ld %lu %lu %lu %lu %lu \ %lu %lu %lu %lu %lu %lu %lu %lu %d %d %lu %lu\n", +#endif task->pid, task->comm, state, @@ -405,7 +411,14 @@ int proc_pid_stat(struct task_struct *ta task->exit_signal, task_cpu(task), task->rt_priority, +#ifdef CONFIG_SCHEDSTATS + task->policy, + task->sched_info.cpu_time, + task->sched_info.run_delay, + task->sched_info.pcnt); +#else task->policy); +#endif /* CONFIG_SCHEDSTATS */ if(mm) mmput(mm); return res; diff -rupN linux-2.6.8.1/fs/proc/proc_misc.c linux-2.6.8.1-ss/fs/proc/proc_misc.c --- linux-2.6.8.1/fs/proc/proc_misc.c 2004-08-14 03:54:50.000000000 -0700 +++ linux-2.6.8.1-ss/fs/proc/proc_misc.c 2004-09-07 22:30:10.000000000 -0700 @@ -282,6 +282,10 @@ static struct file_operations proc_vmsta .release = seq_release, }; +#ifdef CONFIG_SCHEDSTATS +extern struct file_operations proc_schedstat_operations; +#endif + #ifdef CONFIG_PROC_HARDWARE static int hardware_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -681,6 +685,9 @@ void __init proc_misc_init(void) #ifdef CONFIG_MODULES create_seq_entry("modules", 0, &proc_modules_operations); #endif +#ifdef CONFIG_SCHEDSTATS + create_seq_entry("schedstat", 0, &proc_schedstat_operations); +#endif #ifdef CONFIG_PROC_KCORE proc_root_kcore = create_proc_entry("kcore", S_IRUSR, NULL); if (proc_root_kcore) { diff -rupN linux-2.6.8.1/include/linux/sched.h linux-2.6.8.1-ss/include/linux/sched.h --- linux-2.6.8.1/include/linux/sched.h 2004-08-14 03:54:49.000000000 -0700 +++ linux-2.6.8.1-ss/include/linux/sched.h 2004-09-07 22:53:00.000000000 -0700 @@ -96,6 +96,16 @@ extern unsigned long nr_running(void); extern unsigned long nr_uninterruptible(void); extern unsigned long nr_iowait(void); +#ifdef CONFIG_SCHEDSTATS +struct sched_info; +extern void cpu_sched_info(struct sched_info *, int); +#define schedstat_inc(rq, field) rq->field++; +#define schedstat_add(rq, field, amt) rq->field += amt; +#else +#define schedstat_inc(rq, field) do { } while (0); +#define schedstat_add(rq, field, amt) do { } while (0); +#endif + #include <linux/time.h> #include <linux/param.h> #include <linux/resource.h> @@ -347,6 +357,18 @@ struct k_itimer { struct timespec wall_to_prev; /* wall_to_monotonic used when set */ }; +#ifdef CONFIG_SCHEDSTATS +struct sched_info { + /* cumulative counters */ + unsigned long cpu_time, /* time spent on the cpu */ + run_delay, /* time spent waiting on a runqueue */ + pcnt; /* # of timeslices run on this cpu */ + + /* timestamps */ + unsigned long last_arrival, /* when we last ran on a cpu */ + last_queued; /* when we were last queued to run */ +}; +#endif /* CONFIG_SCHEDSTATS */ struct io_context; /* See blkdev.h */ void exit_io_context(void); @@ -409,6 +431,10 @@ struct task_struct { cpumask_t cpus_allowed; unsigned int time_slice, first_time_slice; +#ifdef CONFIG_SCHEDSTATS + struct sched_info sched_info; +#endif /* CONFIG_SCHEDSTATS */ + struct list_head tasks; /* * ptrace_list/ptrace_children forms the list of my children @@ -564,6 +590,14 @@ do { if (atomic_dec_and_test(&(tsk)->usa #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_SYNCWRITE 0x00200000 /* I am doing a sync write */ +enum idle_type +{ + IDLE, + NOT_IDLE, + NEWLY_IDLE, + MAX_IDLE_TYPES +}; + #ifdef CONFIG_SMP #define SCHED_LOAD_SCALE 128UL /* increase resolution of load */ @@ -606,6 +640,23 @@ struct sched_domain { unsigned long last_balance; /* init to jiffies. units in jiffies */ unsigned int balance_interval; /* initialise to 1. units in ms. */ unsigned int nr_balance_failed; /* initialise to 0 */ + +#ifdef CONFIG_SCHEDSTATS + /* load_balance() stats */ + unsigned long lb_cnt[MAX_IDLE_TYPES]; + unsigned long lb_failed[MAX_IDLE_TYPES]; + unsigned long lb_imbalance[MAX_IDLE_TYPES]; + unsigned long lb_nobusyg[MAX_IDLE_TYPES]; + unsigned long lb_nobusyq[MAX_IDLE_TYPES]; + + /* sched_balance_exec() stats */ + unsigned long sbe_attempts; + unsigned long sbe_pushed; + + /* try_to_wake_up() stats */ + unsigned long ttwu_wake_affine; + unsigned long ttwu_wake_balance; +#endif }; /* Common values for SMT siblings */ diff -rupN linux-2.6.8.1/kernel/fork.c linux-2.6.8.1-ss/kernel/fork.c --- linux-2.6.8.1/kernel/fork.c 2004-08-14 03:54:49.000000000 -0700 +++ linux-2.6.8.1-ss/kernel/fork.c 2004-09-07 22:30:10.000000000 -0700 @@ -965,6 +965,11 @@ struct task_struct *copy_process(unsigne p->security = NULL; p->io_context = NULL; p->audit_context = NULL; + +#ifdef CONFIG_SCHEDSTATS + memset(&p->sched_info, 0, sizeof(p->sched_info)); +#endif /* CONFIG_SCHEDSTATS */ + #ifdef CONFIG_NUMA p->mempolicy = mpol_copy(p->mempolicy); if (IS_ERR(p->mempolicy)) { diff -rupN linux-2.6.8.1/kernel/sched.c linux-2.6.8.1-ss/kernel/sched.c --- linux-2.6.8.1/kernel/sched.c 2004-08-14 03:55:59.000000000 -0700 +++ linux-2.6.8.1-ss/kernel/sched.c 2004-09-07 23:55:54.000000000 -0700 @@ -40,6 +40,8 @@ #include <linux/cpu.h> #include <linux/percpu.h> #include <linux/kthread.h> +#include <linux/seq_file.h> +#include <linux/times.h> #include <asm/tlb.h> #include <asm/unistd.h> @@ -218,6 +220,9 @@ struct runqueue { unsigned long expired_timestamp, nr_uninterruptible; unsigned long long timestamp_last_tick; task_t *curr, *idle; +#ifdef CONFIG_SCHEDSTATS + int cpu; /* to make easy reverse-lookups with per-cpu runqueues */ +#endif struct mm_struct *prev_mm; prio_array_t *active, *expired, arrays[2]; int best_expired_prio; @@ -233,6 +238,48 @@ struct runqueue { task_t *migration_thread; struct list_head migration_queue; #endif + +#ifdef CONFIG_SCHEDSTATS + /* latency stats */ + struct sched_info rq_sched_info; + + /* sys_sched_yield() stats */ + unsigned long yld_exp_empty; + unsigned long yld_act_empty; + unsigned long yld_both_empty; + unsigned long yld_cnt; + + /* schedule() stats */ + unsigned long sched_noswitch; + unsigned long sched_switch; + unsigned long sched_cnt; + unsigned long sched_goidle; + + /* pull_task() stats */ + unsigned long pt_gained[MAX_IDLE_TYPES]; + unsigned long pt_lost[MAX_IDLE_TYPES]; + + /* active_load_balance() stats */ + unsigned long alb_cnt; + unsigned long alb_lost; + unsigned long alb_gained; + unsigned long alb_failed; + + /* try_to_wake_up() stats */ + unsigned long ttwu_cnt; + unsigned long ttwu_attempts; + unsigned long ttwu_moved; + + /* wake_up_forked_thread() stats */ + unsigned long wuft_cnt; + unsigned long wuft_moved; + + /* sched_migrate_task() stats */ + unsigned long smt_cnt; + + /* sched_balance_exec() stats */ + unsigned long sbe_cnt; +#endif }; static DEFINE_PER_CPU(struct runqueue, runqueues); @@ -279,6 +326,100 @@ static inline void task_rq_unlock(runque spin_unlock_irqrestore(&rq->lock, *flags); } +#ifdef CONFIG_SCHEDSTATS +/* + * bump this up when changing the output format or the meaning of an existing + * format, so that tools can adapt (or abort) + */ +#define SCHEDSTAT_VERSION 9 + +static int show_schedstat(struct seq_file *seq, void *v) +{ + int cpu; + enum idle_type itype; + + seq_printf(seq, "version %d\n", SCHEDSTAT_VERSION); + seq_printf(seq, "timestamp %lu\n", jiffies); + for_each_online_cpu (cpu) { + + runqueue_t *rq = cpu_rq(cpu); +#ifdef CONFIG_SMP + struct sched_domain *sd; + int dcnt = 0; +#endif + + /* runqueue-specific stats */ + seq_printf(seq, + "cpu%d %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu " + "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", + cpu, rq->yld_both_empty, + rq->yld_act_empty, rq->yld_exp_empty, + rq->yld_cnt, rq->sched_noswitch, + rq->sched_switch, rq->sched_cnt, rq->sched_goidle, + rq->alb_cnt, rq->alb_gained, rq->alb_lost, + rq->alb_failed, + rq->ttwu_cnt, rq->ttwu_moved, rq->ttwu_attempts, + rq->wuft_cnt, rq->wuft_moved, + rq->smt_cnt, rq->sbe_cnt, rq->rq_sched_info.cpu_time, + rq->rq_sched_info.run_delay, rq->rq_sched_info.pcnt); + + for (itype = IDLE; itype < MAX_IDLE_TYPES; itype++) + seq_printf(seq, " %lu %lu", rq->pt_gained[itype], + rq->pt_lost[itype]); + + seq_printf(seq, "\n"); + +#ifdef CONFIG_SMP + /* domain-specific stats */ + for_each_domain(cpu, sd) { + char mask_str[NR_CPUS]; + + cpumask_scnprintf(mask_str, NR_CPUS, sd->span); + seq_printf(seq, "domain%d %s", dcnt++, mask_str); + for (itype = IDLE; itype < MAX_IDLE_TYPES; itype++) { + seq_printf(seq, " %lu %lu %lu %lu %lu", + sd->lb_cnt[itype], + sd->lb_failed[itype], + sd->lb_imbalance[itype], + sd->lb_nobusyq[itype], + sd->lb_nobusyg[itype]); + } + seq_printf(seq, " %lu %lu %lu %lu\n", + sd->sbe_pushed, sd->sbe_attempts, + sd->ttwu_wake_affine, sd->ttwu_wake_balance); + } +#endif + } + return 0; +} + +static int schedstat_open(struct inode *inode, struct file *file) +{ + unsigned size = PAGE_SIZE * (1 + num_online_cpus() / 32); + char *buf = kmalloc(size, GFP_KERNEL); + struct seq_file *m; + int res; + + if (!buf) + return -ENOMEM; + res = single_open(file, show_schedstat, NULL); + if (!res) { + m = file->private_data; + m->buf = buf; + m->size = size; + } else + kfree(buf); + return res; +} + +struct file_operations proc_schedstat_operations = { + .open = schedstat_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +#endif + /* * rq_lock - lock a given runqueue and disable interrupts. */ @@ -298,6 +439,113 @@ static inline void rq_unlock(runqueue_t spin_unlock_irq(&rq->lock); } +#ifdef CONFIG_SCHEDSTATS +/* + * Called when a process is dequeued from the active array and given + * the cpu. We should note that with the exception of interactive + * tasks, the expired queue will become the active queue after the active + * queue is empty, without explicitly dequeuing and requeuing tasks in the + * expired queue. (Interactive tasks may be requeued directly to the + * active queue, thus delaying tasks in the expired queue from running; + * see scheduler_tick()). + * + * This function is only called from sched_info_arrive(), rather than + * dequeue_task(). Even though a task may be queued and dequeued multiple + * times as it is shuffled about, we're really interested in knowing how + * long it was from the *first* time it was queued to the time that it + * finally hit a cpu. + */ +static inline void sched_info_dequeued(task_t *t) +{ + t->sched_info.last_queued = 0; +} + +/* + * Called when a task finally hits the cpu. We can now calculate how + * long it was waiting to run. We also note when it began so that we + * can keep stats on how long its timeslice is. + */ +static inline void sched_info_arrive(task_t *t) +{ + unsigned long now = jiffies; + unsigned long diff = 0; + struct runqueue *rq = task_rq(t); + + if (t->sched_info.last_queued) + diff = now - t->sched_info.last_queued; + sched_info_dequeued(t); + t->sched_info.run_delay += diff; + t->sched_info.last_arrival = now; + t->sched_info.pcnt++; + + if (!rq) + return; + + rq->rq_sched_info.run_delay += diff; + rq->rq_sched_info.pcnt++; +} + +/* + * Called when a process is queued into either the active or expired + * array. The time is noted and later used to determine how long we + * had to wait for us to reach the cpu. Since the expired queue will + * become the active queue after active queue is empty, without dequeuing + * and requeuing any tasks, we are interested in queuing to either. It + * is unusual but not impossible for tasks to be dequeued and immediately + * requeued in the same or another array: this can happen in sched_yield(), + * set_user_nice(), and even load_balance() as it moves tasks from runqueue + * to runqueue. + * + * This function is only called from enqueue_task(), but also only updates + * the timestamp if it is already not set. It's assumed that + * sched_info_dequeued() will clear that stamp when appropriate. + */ +static inline void sched_info_queued(task_t *t) +{ + if (!t->sched_info.last_queued) + t->sched_info.last_queued = jiffies; +} + +/* + * Called when a process ceases being the active-running process, either + * voluntarily or involuntarily. Now we can calculate how long we ran. + */ +static inline void sched_info_depart(task_t *t) +{ + struct runqueue *rq = task_rq(t); + unsigned long diff = jiffies - t->sched_info.last_arrival; + + t->sched_info.cpu_time += diff; + + if (rq) + rq->rq_sched_info.cpu_time += diff; +} + +/* + * Called when tasks are switched involuntarily due, typically, to expiring + * their time slice. (This may also be called when switching to or from + * the idle task.) We are only called when prev != next. + */ +static inline void sched_info_switch(task_t *prev, task_t *next) +{ + struct runqueue *rq = task_rq(prev); + + /* + * prev now departs the cpu. It's not interesting to record + * stats about how efficient we were at scheduling the idle + * process, however. + */ + if (prev != rq->idle) + sched_info_depart(prev); + + if (next != rq->idle) + sched_info_arrive(next); +} +#else +#define sched_info_queued(t) {} +#define sched_info_switch(t, next) {} +#endif /* CONFIG_SCHEDSTATS */ + /* * Adding/removing a task to/from a priority array: */ @@ -311,6 +559,7 @@ static void dequeue_task(struct task_str static void enqueue_task(struct task_struct *p, prio_array_t *array) { + sched_info_queued(p); list_add_tail(&p->run_list, array->queue + p->prio); __set_bit(p->prio, array->bitmap); array->nr_active++; @@ -735,11 +984,12 @@ static int try_to_wake_up(task_t * p, un runqueue_t *rq; #ifdef CONFIG_SMP unsigned long load, this_load; - struct sched_domain *sd; + struct sched_domain *sd = NULL; int new_cpu; #endif rq = task_rq_lock(p, &flags); + schedstat_inc(rq, ttwu_cnt); old_state = p->state; if (!(old_state & state)) goto out; @@ -787,23 +1037,35 @@ static int try_to_wake_up(task_t * p, un */ imbalance = sd->imbalance_pct + (sd->imbalance_pct - 100) / 2; - if ( ((sd->flags & SD_WAKE_AFFINE) && - !task_hot(p, rq->timestamp_last_tick, sd)) - || ((sd->flags & SD_WAKE_BALANCE) && - imbalance*this_load <= 100*load) ) { + if ((sd->flags & SD_WAKE_AFFINE) && + !task_hot(p, rq->timestamp_last_tick, sd)) { + /* + * This domain has SD_WAKE_AFFINE and p is cache cold + * in this domain. + */ + if (cpu_isset(cpu, sd->span)) { + schedstat_inc(sd, ttwu_wake_affine); + goto out_set_cpu; + } + } else if ((sd->flags & SD_WAKE_BALANCE) && + imbalance*this_load <= 100*load) { /* - * Now sd has SD_WAKE_AFFINE and p is cache cold in sd - * or sd has SD_WAKE_BALANCE and there is an imbalance + * This domain has SD_WAKE_BALANCE and there is + * an imbalance. */ - if (cpu_isset(cpu, sd->span)) + if (cpu_isset(cpu, sd->span)) { + schedstat_inc(sd, ttwu_wake_balance); goto out_set_cpu; + } } } new_cpu = cpu; /* Could not wake to this_cpu. Wake to cpu instead */ out_set_cpu: + schedstat_inc(rq, ttwu_attempts); new_cpu = wake_idle(new_cpu, p); if (new_cpu != cpu && cpu_isset(new_cpu, p->cpus_allowed)) { + schedstat_inc(rq, ttwu_moved); set_task_cpu(p, new_cpu); task_rq_unlock(rq, &flags); /* might preempt at this point */ @@ -855,7 +1117,7 @@ out: int fastcall wake_up_process(task_t * p) { return try_to_wake_up(p, TASK_STOPPED | - TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0); + TASK_INTERRUPTIBLE | TASK_UNINTERRUPTIBLE, 0); } EXPORT_SYMBOL(wake_up_process); @@ -1155,13 +1417,6 @@ static void double_rq_unlock(runqueue_t spin_unlock(&rq2->lock); } -enum idle_type -{ - IDLE, - NOT_IDLE, - NEWLY_IDLE, -}; - #ifdef CONFIG_SMP /* @@ -1228,6 +1483,7 @@ void fastcall wake_up_forked_thread(task * Find the largest domain that this CPU is part of that * is willing to balance on clone: */ + schedstat_inc(this_rq, wuft_cnt); for_each_domain(this_cpu, tmp) if (tmp->flags & SD_BALANCE_CLONE) sd = tmp; @@ -1280,6 +1536,7 @@ lock_again: rq->nr_running++; } } else { + schedstat_inc(this_rq, wuft_moved); /* Not the local CPU - must adjust timestamp */ p->timestamp = (p->timestamp - this_rq->timestamp_last_tick) + rq->timestamp_last_tick; @@ -1310,6 +1567,7 @@ static void sched_migrate_task(task_t *p || unlikely(cpu_is_offline(dest_cpu))) goto out; + schedstat_inc(rq, smt_cnt); /* force the process onto the specified CPU */ if (migrate_task(p, dest_cpu, &req)) { /* Need to wait for migration thread (might exit: take ref). */ @@ -1337,6 +1595,7 @@ void sched_balance_exec(void) struct sched_domain *tmp, *sd = NULL; int new_cpu, this_cpu = get_cpu(); + schedstat_inc(this_rq(), sbe_cnt); /* Prefer the current CPU if there's only this task running */ if (this_rq()->nr_running <= 1) goto out; @@ -1345,9 +1604,11 @@ void sched_balance_exec(void) if (tmp->flags & SD_BALANCE_EXEC) sd = tmp; + schedstat_inc(sd, sbe_attempts); if (sd) { new_cpu = find_idlest_cpu(current, this_cpu, sd); if (new_cpu != this_cpu) { + schedstat_inc(sd, sbe_pushed); put_cpu(); sched_migrate_task(current, new_cpu); return; @@ -1486,6 +1747,15 @@ skip_queue: idx++; goto skip_bitmap; } + + /* + * Right now, this is the only place pull_task() is called, + * so we can safely collect pull_task() stats here rather than + * inside pull_task(). + */ + schedstat_inc(this_rq, pt_gained[idle]); + schedstat_inc(busiest, pt_lost[idle]); + pull_task(busiest, array, tmp, this_rq, dst_array, this_cpu); pulled++; @@ -1680,14 +1950,20 @@ static int load_balance(int this_cpu, ru int nr_moved; spin_lock(&this_rq->lock); - - group = find_busiest_group(sd, this_cpu, &imbalance, idle); - if (!group) - goto out_balanced; + schedstat_inc(sd, lb_cnt[idle]); + + group = find_busiest_group(sd, this_cpu, &imbalance, idle); + if (!group) { + schedstat_inc(sd, lb_nobusyg[idle]); + goto out_balanced; + } busiest = find_busiest_queue(group); - if (!busiest) - goto out_balanced; + if (!busiest) { + schedstat_inc(sd, lb_nobusyq[idle]); + goto out_balanced; + } + /* * This should be "impossible", but since load * balancing is inherently racy and statistical, @@ -1698,6 +1974,8 @@ static int load_balance(int this_cpu, ru goto out_balanced; } + schedstat_add(sd, lb_imbalance[idle], imbalance); + nr_moved = 0; if (busiest->nr_running > 1) { /* @@ -1714,6 +1992,7 @@ static int load_balance(int this_cpu, ru spin_unlock(&this_rq->lock); if (!nr_moved) { + schedstat_inc(sd, lb_failed[idle]); sd->nr_balance_failed++; if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { @@ -1768,20 +2047,29 @@ static int load_balance_newidle(int this unsigned long imbalance; int nr_moved = 0; + schedstat_inc(sd, lb_cnt[NEWLY_IDLE]); group = find_busiest_group(sd, this_cpu, &imbalance, NEWLY_IDLE); - if (!group) + if (!group) { + schedstat_inc(sd, lb_nobusyg[NEWLY_IDLE]); goto out; + } busiest = find_busiest_queue(group); - if (!busiest || busiest == this_rq) + if (!busiest || busiest == this_rq) { + schedstat_inc(sd, lb_nobusyq[NEWLY_IDLE]); goto out; + } /* Attempt to move tasks */ double_lock_balance(this_rq, busiest); + schedstat_add(sd, lb_imbalance[NEWLY_IDLE], imbalance); nr_moved = move_tasks(this_rq, this_cpu, busiest, imbalance, sd, NEWLY_IDLE); + if (!nr_moved) + schedstat_inc(sd, lb_failed[NEWLY_IDLE]); + spin_unlock(&busiest->lock); out: @@ -1820,6 +2108,7 @@ static void active_load_balance(runqueue struct sched_group *group, *busy_group; int i; + schedstat_inc(busiest, alb_cnt); if (busiest->nr_running <= 1) return; @@ -1866,7 +2155,12 @@ static void active_load_balance(runqueue if (unlikely(busiest == rq)) goto next_group; double_lock_balance(busiest, rq); - move_tasks(rq, push_cpu, busiest, 1, sd, IDLE); + if (move_tasks(rq, push_cpu, busiest, 1, sd, IDLE)) { + schedstat_inc(busiest, alb_lost); + schedstat_inc(rq, alb_gained); + } else { + schedstat_inc(busiest, alb_failed); + } spin_unlock(&rq->lock); next_group: group = group->next; @@ -2210,6 +2504,7 @@ need_resched: rq = this_rq(); release_kernel_lock(prev); + schedstat_inc(rq, sched_cnt); now = sched_clock(); if (likely(now - prev->timestamp < NS_MAX_SLEEP_AVG)) run_time = now - prev->timestamp; @@ -2256,18 +2551,21 @@ need_resched: /* * Switch the active and expired arrays. */ + schedstat_inc(rq, sched_switch); rq->active = rq->expired; rq->expired = array; array = rq->active; rq->expired_timestamp = 0; rq->best_expired_prio = MAX_PRIO; - } + } else + schedstat_inc(rq, sched_noswitch); idx = sched_find_first_bit(array->bitmap); queue = array->queue + idx; next = list_entry(queue->next, task_t, run_list); if (dependent_sleeper(cpu, rq, next)) { + schedstat_inc(rq, sched_goidle); next = rq->idle; goto switch_tasks; } @@ -2297,6 +2595,7 @@ switch_tasks: } prev->timestamp = now; + sched_info_switch(prev, next); if (likely(prev != next)) { next->timestamp = now; rq->nr_switches++; @@ -3008,6 +3307,7 @@ asmlinkage long sys_sched_yield(void) prio_array_t *array = current->array; prio_array_t *target = rq->expired; + schedstat_inc(rq, yld_cnt); /* * We implement yielding by moving the task into the expired * queue. @@ -3018,6 +3318,15 @@ asmlinkage long sys_sched_yield(void) if (unlikely(rt_task(current))) target = rq->active; + if (current->array->nr_active == 1) { + schedstat_inc(rq, yld_act_empty); + if (!rq->expired->nr_active) { + schedstat_inc(rq, yld_both_empty); + } + } else if (!rq->expired->nr_active) { + schedstat_inc(rq, yld_exp_empty); + } + dequeue_task(current, array); enqueue_task(current, target); @@ -3603,7 +3912,7 @@ static int migration_call(struct notifie rq->idle->static_prio = MAX_PRIO; __setscheduler(rq->idle, SCHED_NORMAL, 0); task_rq_unlock(rq, &flags); - BUG_ON(rq->nr_running != 0); + BUG_ON(rq->nr_running != 0); /* No need to migrate the tasks: it was best-effort if * they didn't do lock_cpu_hotplug(). Just wake up @@ -3618,7 +3927,7 @@ static int migration_call(struct notifie complete(&req->done); } spin_unlock_irq(&rq->lock); - break; + break; #endif } return NOTIFY_OK; @@ -3937,6 +4246,9 @@ void __init sched_init(void) spin_lock_init(&rq->lock); rq->active = rq->arrays; rq->expired = rq->arrays + 1; +#ifdef CONFIG_SCHEDSTATS + rq->cpu = i; +#endif /* CONFIG_SCHEDSTATS */ rq->best_expired_prio = MAX_PRIO; #ifdef CONFIG_SMP ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley 2004-08-27 22:29 ` 2.6.9-rc1-mm1 Rafael J. Wysocki 2004-09-03 21:11 ` schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki @ 2004-09-04 18:35 ` Rafael J. Wysocki 2004-09-08 8:10 ` 2.6.9-rc1-mm1 Rick Lindsley 2004-09-04 23:10 ` latency.c [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki 3 siblings, 1 reply; 60+ messages in thread From: Rafael J. Wysocki @ 2004-09-04 18:35 UTC (permalink / raw) To: Rick Lindsley; +Cc: Martin J. Bligh, Con Kolivas, Andrew Morton, linux-kernel [-- Attachment #1: Type: text/plain, Size: 557 bytes --] On Friday 27 of August 2004 23:54, Rick Lindsley wrote: [- snip -] > Okay. A schedstats patch for 2.6.8.1 is available at > > http://eaglet.rain.com/rick/linux/schedstat/patches/schedstat-2.6.8.1 > or > http://oss.software.ibm.com/linux/patches/?patch_id=730 > It seems that after applying it one has to apply the two attached patches to the kernel to get it compile on a UP system. Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman [-- Attachment #2: schedstat-2.6.8.1-sched.h.patch --] [-- Type: text/x-diff, Size: 809 bytes --] --- orig/linux-2.6.8.1/include/linux/sched.h 2004-09-04 20:13:39.950362408 +0200 +++ linux/include/linux/sched.h 2004-09-04 19:39:10.965895856 +0200 @@ -590,6 +590,14 @@ #define PF_LESS_THROTTLE 0x00100000 /* Throttle me less: I clean memory */ #define PF_SYNCWRITE 0x00200000 /* I am doing a sync write */ +enum idle_type +{ + IDLE, + NOT_IDLE, + NEWLY_IDLE, + MAX_IDLE_TYPES +}; + #ifdef CONFIG_SMP #define SCHED_LOAD_SCALE 128UL /* increase resolution of load */ @@ -601,14 +609,6 @@ #define SD_WAKE_BALANCE 32 /* Perform balancing at task wakeup */ #define SD_SHARE_CPUPOWER 64 /* Domain members share cpu power */ -enum idle_type -{ - IDLE, - NOT_IDLE, - NEWLY_IDLE, - MAX_IDLE_TYPES -}; - struct sched_group { struct sched_group *next; /* Must be a circular list */ cpumask_t cpumask; [-- Attachment #3: schedstat-2.6.8.1-sched.c.patch --] [-- Type: text/x-diff, Size: 737 bytes --] --- orig/linux-2.6.8.1/kernel/sched.c 2004-09-04 20:13:39.958361192 +0200 +++ linux/kernel/sched.c 2004-09-04 19:42:53.097126776 +0200 @@ -342,10 +342,12 @@ seq_printf(seq, "timestamp %lu\n", jiffies); for_each_online_cpu (cpu) { +#ifdef CONFIG_SMP int dcnt = 0; - runqueue_t *rq = cpu_rq(cpu); struct sched_domain *sd; +#endif + runqueue_t *rq = cpu_rq(cpu); /* runqueue-specific stats */ seq_printf(seq, @@ -368,6 +370,7 @@ seq_printf(seq, "\n"); +#ifdef CONFIG_SMP /* domain-specific stats */ for_each_domain(cpu, sd) { char mask_str[NR_CPUS]; @@ -386,6 +389,7 @@ sd->sbe_pushed, sd->sbe_attempts, sd->ttwu_wake_affine, sd->ttwu_wake_balance); } +#endif } return 0; } ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-09-04 18:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-09-08 8:10 ` Rick Lindsley 0 siblings, 0 replies; 60+ messages in thread From: Rick Lindsley @ 2004-09-08 8:10 UTC (permalink / raw) To: Rafael J. Wysocki Cc: Martin J. Bligh, Con Kolivas, Andrew Morton, linux-kernel Yes, that's correct. Thanks; I've updated the patch. Rick ^ permalink raw reply [flat|nested] 60+ messages in thread
* latency.c [was: Re: 2.6.9-rc1-mm1] 2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley ` (2 preceding siblings ...) 2004-09-04 18:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-09-04 23:10 ` Rafael J. Wysocki 2004-09-08 8:12 ` Rick Lindsley 3 siblings, 1 reply; 60+ messages in thread From: Rafael J. Wysocki @ 2004-09-04 23:10 UTC (permalink / raw) To: Rick Lindsley; +Cc: Martin J. Bligh, Con Kolivas, linux-kernel [-- Attachment #1: Type: text/plain, Size: 1256 bytes --] On Friday 27 of August 2004 23:54, Rick Lindsley wrote: [- snip -] > You can also pick up the program "latency.c" at > > http://eaglet.rain.com/rick/linux/schedstat/v9/latency.c > > With these two things in hand, you should be able to measure the latency > on 2.6.8.1 of a particular process. > > A patch is not necessary for 2.6.9-rc1-mm1 (schedstats is already in there) > but you will need to config the kernel to use it. Then retrieve a slightly > different latency.c: > > http://eaglet.rain.com/rick/linux/schedstat/v10/latency.c > > since 2.6.9-rc1-mm1 output format is different (as you noted, it's a > different scheduler.) Then you should be able to see if the latency of > a particular process (updatedb, for instance) changes. I've fiddled a bit with both the latency.c programs. I've added some options to them etc. In particular, now you can specify a program to run and monitor instead of a pid, which is handy if you need to monitor processes that exit quickly. Everything is documented in the sources (attached). I thought you might find this useful. :-) Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman [-- Attachment #2: latency-v9.c --] [-- Type: text/x-csrc, Size: 5613 bytes --] /* * latency -- measure the scheduling latency of a particular process from * the extra information provided in /proc/<pid>stat by version 4 of * the schedstat patch. PLEASE NOTE: This program does NOT check to * make sure that extra information is there; it assumes the last * three fields in that line are the ones it's interested in. Using * it on a kernel that does not have the schedstat patch compiled in * will cause it to happily produce bizarre results. * * Note too that this is known to work only with versions 4 and 5 * of the schedstat patch, for similar reasons. * * This currently monitors only one pid at a time but could easily * be modified to do more. */ /* * Modified by Rafael J. Wysocki <rjw@sisk.pl> on September 4, 2004 * Added options: * -o -- allows one to specify a log file to store the results in * -n -- turns on a numerical-only format (mutually exclusive with -v) * -r -- allows one to specify a program to run and monitor for latencies instead of a pid * * The -r option is handy if you want to monitor a process that exits quickly (eg. gcc or tar etc.). * The -o is necessary if -r is specified to separate the output of latency.c with the output of the * monitored process * The output generated with the -n option may be useful for creating graphs */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <getopt.h> #include <string.h> #include <strings.h> #define STRLEN 256 char procbuf[512]; char statname[64]; char progpath[STRLEN]; char logpath[STRLEN]; char *Progname; FILE *fp, *outp; void usage() { fprintf(stderr, "Usage: %s [{-v|-n} ][-s sleeptime ][-o logfile ]{-r program|<pid>}\n", Progname); exit(-1); } /* * execute() is used to spawn a new process that will be monitored for latencies * The new process' command line is passed in *file */ void execute(char *file) { char *ptr, **args; int cnt = 1, j; /* See how many arguments are to be passed */ for (ptr = file; *ptr; ptr++) if (*ptr == ' ') cnt++; args = (char **)malloc((cnt + 1) * sizeof(char *)); /* Extract the arguments */ args[0] = file; ptr = file; for (j = 1; j < cnt; j++) { ptr = index(ptr, ' '); *ptr++ = '\0'; args[j] = ptr; } args[j] = NULL; /* Run the program */ execvp(args[0], args); } /* * get_stats() -- we presume that we are interested in the last three * fields of the line we are handed, and further, that they contain * only numbers and single spaces. */ void get_stats(char *buf, char *id, unsigned int *run_ticks, unsigned int *wait_ticks, unsigned int *nran) { char *ptr; ptr = index(buf, ')') + 1; *ptr = 0; strcpy(id, buf); *ptr = ' '; ptr = rindex(buf,' '); if (!ptr) return; *nran = atoi(ptr--); while (isdigit(*ptr) && --ptr != buf); if (ptr == buf) return; *wait_ticks = atoi(ptr--); while (isdigit(*ptr) && --ptr != buf); if (ptr == buf) return; *run_ticks = atoi(ptr); } main(int argc, char *argv[]) { int c; unsigned int sleeptime = 5, pid = 0, verbose = 0, numeric = 0, runprog = 0, log = 0; char id[32]; unsigned int run_ticks, wait_ticks, nran; unsigned int orun_ticks=0, owait_ticks=0, oran=0; Progname = argv[0]; id[0] = 0; while ((c = getopt(argc, argv, "s:vnr:o:")) != -1) { switch (c) { case 's': sleeptime = atoi(optarg); break; case 'v': verbose++; break; case 'n': numeric++; break; case 'r': strncpy(progpath, optarg, STRLEN - 1); progpath[STRLEN - 1] = '\0'; runprog++; break; case 'o': strncpy(logpath, optarg, STRLEN - 1); logpath[STRLEN - 1] = '\0'; log++; break; default: usage(); } } if (verbose && numeric) usage(); if (runprog) { pid = fork(); if (pid < 0) { puts("fork() failed"); exit(pid); } if (!pid) execute(progpath); } else if (optind < argc) { pid = atoi(argv[optind]); } if (!pid) usage(); outp = NULL; if (log) outp = fopen(logpath, "w"); if (!outp) { outp = stdout; log = 0; } /* * now just spin collecting the stats */ sprintf(statname,"/proc/%d/stat", pid); while (fp = fopen(statname, "r")) { if (runprog) waitpid(pid, NULL, WNOHANG); if (!fgets(procbuf, sizeof(procbuf), fp)) break; get_stats(procbuf, id, &run_ticks, &wait_ticks, &nran); if (verbose) fprintf(outp, "%s %d(%d) %d(%d) %d(%d) %4.2f %4.2f\n", id, run_ticks, run_ticks - orun_ticks, wait_ticks, wait_ticks - owait_ticks, nran, nran - oran, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); else if (numeric) fprintf(outp, "%s %4.2f %4.2f\n", id, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); else fprintf(outp, "%s avgrun=%4.2fms avgwait=%4.2fms\n", id, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); fclose(fp); oran = nran; orun_ticks = run_ticks; owait_ticks = wait_ticks; sleep(sleeptime); if (runprog) waitpid(pid, NULL, WNOHANG); fp = fopen(statname,"r"); if (!fp) break; } if (log) fclose(outp); if (id[0]) printf("Process %s has exited.\n", id); else printf("Process %d does not exist.\n", pid); exit(0); } [-- Attachment #3: latency-v10.c --] [-- Type: text/x-csrc, Size: 6230 bytes --] /* * latency -- measure the scheduling latency of a particular process from * the extra information provided in /proc/<pid>stat by version 4 of * the schedstat patch. PLEASE NOTE: This program does NOT check to * make sure that extra information is there; it assumes the last * three fields in that line are the ones it's interested in. Using * it on a kernel that does not have the schedstat patch compiled in * will cause it to happily produce bizarre results. * * Note too that this is known to work only with versions 4 and 5 * of the schedstat patch, for similar reasons. * * This currently monitors only one pid at a time but could easily * be modified to do more. */ /* * Modified by Rafael J. Wysocki <rjw@sisk.pl> on September 4, 2004 * Added options: * -o -- allows one to specify a log file to store the results in * -n -- turns on a numerical-only format (mutually exclusive with -v) * -r -- allows one to specify a program to run and monitor for latencies instead of a pid * * The -r option is handy if you want to monitor a process that exits quickly (eg. gcc or tar etc.). * The -o is necessary if -r is specified to separate the output of latency.c with the output of the * monitored process * The output generated with the -n option may be useful for creating graphs */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <getopt.h> #include <string.h> #include <strings.h> #define STRLEN 256 extern char *index(), *rindex(); char procbuf[512]; char statname[64]; char progpath[STRLEN]; char logpath[STRLEN]; char *Progname; FILE *fp, *outp; void usage() { fprintf(stderr, "Usage: %s [{-v|-n} ][-s sleeptime ][-o logfile ]{-r program|<pid>}\n", Progname); exit(-1); } /* * execute() is used to spawn a new process that will be monitored for latencies * The new process' command line is passed in *file */ void execute(char *file) { char *ptr, **args; int cnt = 1, j; /* See how many arguments are to be passed */ for (ptr = file; *ptr; ptr++) if (*ptr == ' ') cnt++; args = (char **)malloc((cnt + 1) * sizeof(char *)); /* Extract the arguments */ args[0] = file; ptr = file; for (j = 1; j < cnt; j++) { ptr = index(ptr, ' '); *ptr++ = '\0'; args[j] = ptr; } args[j] = NULL; /* Run the program */ execvp(args[0], args); } /* * get_stats() -- we presume that we are interested in the first three * fields of the line we are handed, and further, that they contain * only numbers and single spaces. */ void get_stats(char *buf, unsigned int *run_ticks, unsigned int *wait_ticks, unsigned int *nran) { char *ptr; /* sanity */ if (!buf || !run_ticks || !wait_ticks || !nran) return; /* leading blanks */ ptr = buf; while (*ptr && isblank(*ptr)) ptr++; /* first number -- run_ticks */ *run_ticks = atoi(ptr); while (*ptr && isdigit(*ptr)) ptr++; while (*ptr && isblank(*ptr)) ptr++; /* second number -- wait_ticks */ *wait_ticks = atoi(ptr); while (*ptr && isdigit(*ptr)) ptr++; while (*ptr && isblank(*ptr)) ptr++; /* last number -- nran */ *nran = atoi(ptr); } /* * get_id() -- extract the id field from that /proc/<pid>/stat file */ void get_id(char *buf, char *id) { char *ptr; /* sanity */ if (!buf || !id) return; ptr = index(buf, ')') + 1; *ptr = 0; strcpy(id, buf); *ptr = ' '; return; } main(int argc, char *argv[]) { int c; unsigned int sleeptime = 5, pid = 0, verbose = 0, numeric = 0, runprog = 0, log = 0; char id[32]; unsigned int run_ticks, wait_ticks, nran; unsigned int orun_ticks=0, owait_ticks=0, oran=0; Progname = argv[0]; id[0] = 0; while ((c = getopt(argc,argv,"s:vnr:o:")) != -1) { switch (c) { case 's': sleeptime = atoi(optarg); break; case 'v': verbose++; break; case 'n': numeric++; break; case 'r': strncpy(progpath, optarg, STRLEN - 1); progpath[STRLEN - 1] = '\0'; runprog++; break; case 'o': strncpy(logpath, optarg, STRLEN - 1); logpath[STRLEN - 1] = '\0'; log++; break; default: usage(); } } if (verbose && numeric) usage(); if (runprog) { pid = fork(); if (pid < 0) { puts("fork() failed"); exit(pid); } if (!pid) execute(progpath); } else if (optind < argc) { pid = atoi(argv[optind]); } if (!pid) usage(); outp = NULL; if (log) outp = fopen(logpath, "w"); if (!outp) { outp = stdout; log = 0; } sprintf(statname, "/proc/%d/stat", pid); if (fp = fopen(statname, "r")) { if (fgets(procbuf, sizeof(procbuf), fp)) get_id(procbuf, id); fclose(fp); } /* * now just spin collecting the stats */ sprintf(statname, "/proc/%d/schedstat", pid); while (fp = fopen(statname, "r")) { if (runprog) waitpid(pid, NULL, WNOHANG); if (!fgets(procbuf, sizeof(procbuf), fp)) break; get_stats(procbuf, &run_ticks, &wait_ticks, &nran); if (verbose) fprintf(outp, "%s %d(%d) %d(%d) %d(%d) %4.2f %4.2f\n", id, run_ticks, run_ticks - orun_ticks, wait_ticks, wait_ticks - owait_ticks, nran, nran - oran, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); else if (numeric) fprintf(outp, "%s %4.2f %4.2f\n", id, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); else fprintf(outp, "%s avgrun=%4.2fms avgwait=%4.2fms\n", id, nran - oran ? (double)(run_ticks-orun_ticks)/(nran - oran) : 0, nran - oran ? (double)(wait_ticks-owait_ticks)/(nran - oran) : 0); fclose(fp); oran = nran; orun_ticks = run_ticks; owait_ticks = wait_ticks; sleep(sleeptime); if (runprog) waitpid(pid, NULL, WNOHANG); fp = fopen(statname,"r"); if (!fp) break; } if (log) fclose(outp); if (id[0]) printf("Process %s has exited.\n", id); else printf("Process %d does not exist.\n", pid); exit(0); } ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: latency.c [was: Re: 2.6.9-rc1-mm1] 2004-09-04 23:10 ` latency.c [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki @ 2004-09-08 8:12 ` Rick Lindsley 2004-09-08 12:02 ` Rafael J. Wysocki 0 siblings, 1 reply; 60+ messages in thread From: Rick Lindsley @ 2004-09-08 8:12 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: Martin J. Bligh, Con Kolivas, linux-kernel I've fiddled a bit with both the latency.c programs. I've added some options to them etc. In particular, now you can specify a program to run and monitor instead of a pid, which is handy if you need to monitor processes that exit quickly. Everything is documented in the sources (attached). I thought you might find this useful. :-) Thank you much! yes, that will make it more useful. I'll add it to my backlog and see if I can't get it out to the web page this week. Rick ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: latency.c [was: Re: 2.6.9-rc1-mm1] 2004-09-08 8:12 ` Rick Lindsley @ 2004-09-08 12:02 ` Rafael J. Wysocki 0 siblings, 0 replies; 60+ messages in thread From: Rafael J. Wysocki @ 2004-09-08 12:02 UTC (permalink / raw) To: linux-kernel On Wednesday 08 of September 2004 10:12, Rick Lindsley wrote: > I've fiddled a bit with both the latency.c programs. I've added some > options to them etc. In particular, now you can specify a program > to run and monitor instead of a pid, which is handy if you need to > monitor processes that exit quickly. Everything is documented in > the sources (attached). I thought you might find this useful. :-) > > Thank you much! yes, that will make it more useful. I'll add it to my > backlog and see if I can't get it out to the web page this week. Great! There is a missing #include in my sources which produces a misleading warning. Also, I think that the hint about latency.c working only with versions 4 and 5 of schedstat is no longer valid. :-) Please, apply: --- old/latency-v10.c 2004-09-08 13:48:37.176519744 +0200 +++ latency-v10.c 2004-09-08 13:55:01.956024368 +0200 @@ -7,9 +7,6 @@ * it on a kernel that does not have the schedstat patch compiled in * will cause it to happily produce bizarre results. * - * Note too that this is known to work only with versions 4 and 5 - * of the schedstat patch, for similar reasons. - * * This currently monitors only one pid at a time but could easily * be modified to do more. */ @@ -28,6 +25,7 @@ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> +#include <stdlib.h> #include <stdio.h> #include <getopt.h> #include <string.h> Greets, RJW -- - Would you tell me, please, which way I ought to go from here? - That depends a good deal on where you want to get to. -- Lewis Carroll "Alice's Adventures in Wonderland" ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan 2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-26 20:51 ` Martin J. Bligh 2004-08-27 1:43 ` 2.6.9-rc1-mm1 Nick Piggin 2 siblings, 1 reply; 60+ messages in thread From: Martin J. Bligh @ 2004-08-26 20:51 UTC (permalink / raw) To: Con Kolivas, Andrew Morton; +Cc: linux-kernel --On Thursday, August 26, 2004 21:07:39 +1000 Con Kolivas <kernel@kolivas.org> wrote: > Andrew Morton wrote: >> >> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ >> >> >> - nicksched is still here. There has been very little feedback, except that >> it seems to slow some workloads on NUMA. > > That's because most people aren't interested in a new cpu scheduler for > 2.6. The current one works well enough in most situations and people > aren't trying -mm to fix their interactive problems since they are few > and far between. The only reports about adverse behaviour with 2.6 we track down to "It behaves differently to what I expect" or applications with no (b)locking between threads suck under load. Personally I think the latter is a good thing as it encourages better coding, and the former is something we'll have with any alternate design. Well ... it'd be nice to know what nicksched was trying to fix. Then maybe we could try to measure it. There's lots of stuff in the changelog about what technical stuff was fiddled with ... but nothing I can see about what it was meant to acheive. > The only feedback we got on staircase was that it helped NUMA somewhat and Nick and Ingo made some criticisms (not counting any benchmarks I had to offer). The only feedback on nickshed was that it hurt NUMA somewhat, SMT interactivity was broken (an easy enough oversight), and I did not comment to avoid giving biased criticism. The main thing I liked about staircase was it seemed to simplify things. Having mere mortals comprehend the code seems like a Good Plan (tm). The fact that it seemed to bounce tasks around a crapload less was a nice bonus ;-) Cache is king. M. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 20:51 ` 2.6.9-rc1-mm1 Martin J. Bligh @ 2004-08-27 1:43 ` Nick Piggin 0 siblings, 0 replies; 60+ messages in thread From: Nick Piggin @ 2004-08-27 1:43 UTC (permalink / raw) To: Martin J. Bligh; +Cc: Con Kolivas, Andrew Morton, linux-kernel Martin J. Bligh wrote: > --On Thursday, August 26, 2004 21:07:39 +1000 Con Kolivas <kernel@kolivas.org> wrote: > > >>Andrew Morton wrote: >> >>>ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ >>> >>> >>>- nicksched is still here. There has been very little feedback, except that >>> it seems to slow some workloads on NUMA. >> >>That's because most people aren't interested in a new cpu scheduler for >>2.6. The current one works well enough in most situations and people >>aren't trying -mm to fix their interactive problems since they are few >>and far between. The only reports about adverse behaviour with 2.6 we track down to "It behaves differently to what I expect" or applications with no (b)locking between threads suck under load. Personally I think the latter is a good thing as it encourages better coding, and the former is something we'll have with any alternate design. > > > Well ... it'd be nice to know what nicksched was trying to fix. Then maybe > we could try to measure it. There's lots of stuff in the changelog about > what technical stuff was fiddled with ... but nothing I can see about what > it was meant to acheive. > It is supposed to be "as simple as possible and no simpler" approach to the 2 array scheduler. The current one has a lot of 'unfairness' and temporal dependencies. Eg, "if a process has been in an interruptible sleep and woken from interrupt, and has been previously marked as 'interactive' then blah. If it has been in an uninterruptible sleep then do something completely different" (I just made that up) So, some people's watchdog process that is using *no* CPU get 50 second latencies. And you get unfairness problems where one CPU hog is given twice the amount of CPU time as another because it got marked as interactive long ago. Basically, the only inputs into nicksched are when a process sleeps and when it runs. The only per-process state is basically how much it runs and how much it sleeps. Everyone is treated the same. The kernbench regression is something I don't take lightly though. I'll see if I can get to the bottom of it. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton 2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas @ 2004-08-26 12:06 ` Denis Vlasenko 2004-08-26 19:40 ` 2.6.9-rc1-mm1 Sam Ravnborg 2004-08-26 17:58 ` 2.6.9-rc1-mm1 (compile stats) John Cherry ` (6 subsequent siblings) 8 siblings, 1 reply; 60+ messages in thread From: Denis Vlasenko @ 2004-08-26 12:06 UTC (permalink / raw) To: Andrew Morton, linux-kernel; +Cc: Sam Ravnborg [-- Attachment #1: Type: text/plain, Size: 1373 bytes --] On Thursday 26 August 2004 11:47, Andrew Morton wrote: > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ I use separate build directory. .... LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD .tmp_vmlinux3 KSYM .tmp_kallsyms3.S AS .tmp_kallsyms3.o LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map AS arch/i386/boot/bootsect.o LD arch/i386/boot/bootsect AS arch/i386/boot/setup.o LD arch/i386/boot/setup AS arch/i386/boot/compressed/head.o CC arch/i386/boot/compressed/misc.o OBJCOPY arch/i386/boot/compressed/vmlinux.bin GZIP arch/i386/boot/compressed/vmlinux.bin.gz LD arch/i386/boot/compressed/piggy.o LD arch/i386/boot/compressed/vmlinux OBJCOPY arch/i386/boot/vmlinux.bin HOSTCC arch/i386/boot/tools/build cc1: No such file or directory: opening dependency file arch/i386/boot/tools/.build.d make[2]: *** [arch/i386/boot/tools/build] Error 1 make[1]: *** [bzImage] Error 2 make: *** [bzImage] Error 2 build dir does not have arch/i386/boot/tools/build/tools/ at all. src dir has lone build.c in arch/i386/boot/tools/build/tools/. make output and .config are attached. -- vda [-- Attachment #2: !make.log.bz2 --] [-- Type: application/x-bzip2, Size: 6948 bytes --] [-- Attachment #3: .config.bz2 --] [-- Type: application/x-bzip2, Size: 7857 bytes --] ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 12:06 ` 2.6.9-rc1-mm1 Denis Vlasenko @ 2004-08-26 19:40 ` Sam Ravnborg 0 siblings, 0 replies; 60+ messages in thread From: Sam Ravnborg @ 2004-08-26 19:40 UTC (permalink / raw) To: Denis Vlasenko; +Cc: Andrew Morton, linux-kernel, Sam Ravnborg On Thu, Aug 26, 2004 at 03:06:18PM +0300, Denis Vlasenko wrote: > On Thursday 26 August 2004 11:47, Andrew Morton wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > > I use separate build directory. > > .... > LD .tmp_vmlinux1 > KSYM .tmp_kallsyms1.S > AS .tmp_kallsyms1.o > LD .tmp_vmlinux2 > KSYM .tmp_kallsyms2.S > AS .tmp_kallsyms2.o > LD .tmp_vmlinux3 > KSYM .tmp_kallsyms3.S > AS .tmp_kallsyms3.o > LD vmlinux > SYSMAP System.map > SYSMAP .tmp_System.map > AS arch/i386/boot/bootsect.o > LD arch/i386/boot/bootsect > AS arch/i386/boot/setup.o > LD arch/i386/boot/setup > AS arch/i386/boot/compressed/head.o > CC arch/i386/boot/compressed/misc.o > OBJCOPY arch/i386/boot/compressed/vmlinux.bin > GZIP arch/i386/boot/compressed/vmlinux.bin.gz > LD arch/i386/boot/compressed/piggy.o > LD arch/i386/boot/compressed/vmlinux > OBJCOPY arch/i386/boot/vmlinux.bin > HOSTCC arch/i386/boot/tools/build > cc1: No such file or directory: opening dependency file arch/i386/boot/tools/.build.d > make[2]: *** [arch/i386/boot/tools/build] Error 1 > make[1]: *** [bzImage] Error 2 > make: *** [bzImage] Error 2 > > build dir does not have arch/i386/boot/tools/build/tools/ at all. > src dir has lone build.c in arch/i386/boot/tools/build/tools/. Correct. Fixet - see mail with subject "kbuild fixes" sent to lkml. Sam ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 (compile stats) 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton 2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas 2004-08-26 12:06 ` 2.6.9-rc1-mm1 Denis Vlasenko @ 2004-08-26 17:58 ` John Cherry 2004-08-26 18:53 ` 2.6.9-rc1-mm1 - undefined references - [PATCH] Paolo Ornati ` (5 subsequent siblings) 8 siblings, 0 replies; 60+ messages in thread From: John Cherry @ 2004-08-26 17:58 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel@vger.kernel.org Linux 2.6 (mm tree) Compile Statistics (gcc 3.2.2) Kernel bzImage bzImage bzImage modules bzImage modules (defconfig) (allno) (allyes) (allyes) (allmod) (allmod) --------------- ---------- -------- -------- -------- -------- -------- 2.6.9-rc1-mm1 0w/0e 0w/0e 80w/0e 4w/0e 1w/0e 74w/0e 2.6.8.1-mm4 0w/0e 0w/0e 78w/0e 4w/0e 1w/0e 73w/0e 2.6.8.1-mm3 0w/96e 0w/0e 78w/97e 4w/0e 1w/0e 74w/89e 2.6.8.1-mm2 0w/96e 0w/0e 78w/97e 4w/0e 1w/0e 74w/89e 2.6.8.1-mm1 0w/0e 0w/0e 78w/0e 4w/0e 1w/0e 74w/0e 2.6.8-rc4-mm1 0w/0e 0w/5e 81w/0e 4w/0e 1w/0e 75w/0e 2.6.8-rc3-mm2 1w/7e 0w/5e 82w/8e 4w/0e 2w/8e 75w/0e 2.6.8-rc3-mm1 0w/0e 1w/5e 81w/9e 4w/0e 1w/0e 75w/0e 2.6.8-rc2-mm2 0w/0e 4w/5e 87w/9e 4w/0e 1w/0e 80w/0e 2.6.8-rc2-mm1 0w/0e 0w/0e 83w/9e 3w/0e 1w/0e 81w/0e 2.6.8-rc1-mm1 0w/0e 0w/0e 88w/9e 5w/0e 1w/0e 87w/0e 2.6.7-mm7 0w/0e 0w/0e 89w/9e 5w/0e 1w/0e 84w/0e 2.6.7-mm6 0w/0e 0w/0e 85w/9e 5w/0e 1w/0e 80w/0e 2.6.7-mm5 0w/0e 0w/0e 92w/0e 5w/0e 1w/0e 87w/0e 2.6.7-mm4 0w/0e 0w/0e 94w/0e 5w/0e 1w/0e 89w/0e 2.6.7-mm3 0w/0e 0w/0e 90w/6e 5w/0e 1w/0e 86w/0e 2.6.7-mm2 0w/0e 0w/0e 109w/0e 7w/0e 1w/0e 106w/0e 2.6.7-mm1 0w/0e 5w/0e 108w/0e 5w/0e 1w/0e 104w/0e 2.6.7-rc3-mm2 0w/0e 5w/0e 105w/10e 5w/0e 2w/0e 100w/2e 2.6.7-rc3-mm1 0w/0e 5w/0e 104w/10e 5w/0e 2w/0e 100w/2e 2.6.7-rc2-mm2 0w/0e 5w/0e 109w/10e 5w/0e 2w/0e 105w/2e 2.6.7-rc2-mm1 0w/0e 12w/0e 158w/13e 5w/0e 3w/0e 153w/4e 2.6.7-rc1-mm1 0w/0e 6w/0e 108w/0e 5w/0e 2w/0e 104w/0e 2.6.6-mm5 0w/0e 0w/0e 109w/5e 5w/0e 2w/0e 110w/0e 2.6.6-mm4 0w/0e 0w/0e 112w/9e 5w/0e 2w/5e 106w/1e 2.6.6-mm3 3w/9e 0w/0e 120w/26e 5w/0e 2w/0e 114w/10e 2.6.6-mm2 4w/11e 0w/0e 120w/24e 6w/0e 2w/0e 118w/9e 2.6.6-mm1 1w/0e 0w/0e 118w/25e 6w/0e 2w/0e 114w/10e 2.6.6-rc3-mm2 0w/0e 0w/0e 117w/ 0e 8w/0e 2w/0e 116w/0e 2.6.6-rc3-mm1 0w/0e 0w/0e 120w/10e 8w/0e 2w/0e 152w/2e 2.6.6-rc2-mm2 0w/0e 1w/5e 118w/ 0e 8w/0e 3w/0e 118w/0e 2.6.6-rc2-mm1 0w/0e 0w/0e 115w/ 0e 7w/0e 3w/0e 116w/0e 2.6.6-rc1-mm1 0w/0e 0w/7e 122w/ 0e 7w/0e 4w/0e 122w/0e 2.6.5-mm6 0w/0e 0w/0e 123w/ 0e 7w/0e 4w/0e 124w/0e 2.6.5-mm5 0w/0e 0w/0e 119w/ 0e 7w/0e 4w/0e 120w/0e 2.6.5-mm4 0w/0e 0w/0e 120w/ 0e 7w/0e 4w/0e 121w/0e 2.6.5-mm3 0w/0e 1w/0e 121w/12e 7w/0e 3w/0e 123w/0e 2.6.5-mm2 0w/0e 0w/0e 128w/12e 7w/0e 3w/0e 134w/0e 2.6.5-mm1 0w/0e 5w/0e 122w/ 0e 7w/0e 3w/0e 124w/0e 2.6.5-rc3-mm4 0w/0e 0w/0e 124w/ 0e 8w/0e 4w/0e 126w/0e 2.6.5-rc3-mm3 0w/0e 5w/0e 129w/14e 8w/0e 4w/0e 129w/6e 2.6.5-rc3-mm2 0w/0e 5w/0e 130w/14e 8w/0e 4w/0e 129w/6e 2.6.5-rc3-mm1 0w/0e 5w/0e 129w/ 0e 8w/0e 4w/0e 129w/0e 2.6.5-rc2-mm5 0w/0e 5w/0e 130w/ 0e 8w/0e 4w/0e 129w/0e 2.6.5-rc2-mm4 0w/0e 5w/0e 134w/ 0e 8w/0e 3w/0e 133w/0e 2.6.5-rc2-mm3 0w/0e 5w/0e 134w/ 0e 8w/0e 3w/0e 133w/0e 2.6.5-rc2-mm2 0w/0e 5w/0e 137w/ 0e 8w/0e 3w/0e 134w/0e 2.6.5-rc2-mm1 0w/0e 5w/0e 136w/ 0e 8w/0e 3w/0e 134w/0e 2.6.5-rc1-mm2 0w/0e 5w/0e 135w/ 5e 8w/0e 3w/0e 133w/0e 2.6.5-rc1-mm1 0w/0e 5w/0e 135w/ 5e 8w/0e 3w/0e 133w/0e 2.6.4-mm2 1w/2e 5w/2e 144w/10e 8w/0e 3w/2e 144w/0e 2.6.4-mm1 1w/0e 5w/0e 146w/ 5e 8w/0e 3w/0e 144w/0e 2.6.4-rc2-mm1 1w/0e 5w/0e 146w/12e 11w/0e 3w/0e 147w/2e 2.6.4-rc1-mm2 1w/0e 5w/0e 144w/ 0e 11w/0e 3w/0e 145w/0e 2.6.4-rc1-mm1 1w/0e 5w/0e 147w/ 5e 11w/0e 3w/0e 147w/0e 2.6.3-mm4 1w/0e 5w/0e 146w/ 0e 7w/0e 3w/0e 142w/0e 2.6.3-mm3 1w/2e 5w/2e 146w/15e 7w/0e 3w/2e 144w/5e 2.6.3-mm2 1w/8e 5w/0e 140w/ 0e 7w/0e 3w/0e 138w/0e 2.6.3-mm1 1w/0e 5w/0e 143w/ 5e 7w/0e 3w/0e 141w/0e 2.6.3-rc3-mm1 1w/0e 0w/0e 144w/13e 7w/0e 3w/0e 142w/3e 2.6.3-rc2-mm1 1w/0e 0w/265e 144w/ 5e 7w/0e 3w/0e 145w/0e 2.6.3-rc1-mm1 1w/0e 0w/265e 141w/ 5e 7w/0e 3w/0e 143w/0e 2.6.2-mm1 2w/0e 0w/264e 147w/ 5e 7w/0e 3w/0e 173w/0e 2.6.2-rc3-mm1 2w/0e 0w/265e 146w/ 5e 7w/0e 3w/0e 172w/0e 2.6.2-rc2-mm2 0w/0e 0w/264e 145w/ 5e 7w/0e 3w/0e 171w/0e 2.6.2-rc2-mm1 0w/0e 0w/264e 146w/ 5e 7w/0e 3w/0e 172w/0e 2.6.2-rc1-mm3 0w/0e 0w/265e 144w/ 8e 7w/0e 3w/0e 169w/0e 2.6.2-rc1-mm2 0w/0e 0w/264e 144w/ 5e 10w/0e 3w/0e 171w/0e 2.6.2-rc1-mm1 0w/0e 0w/264e 144w/ 5e 10w/0e 3w/0e 171w/0e 2.6.1-mm5 2w/5e 0w/264e 153w/11e 10w/0e 3w/0e 180w/0e 2.6.1-mm4 0w/821e 0w/264e 154w/ 5e 8w/1e 5w/0e 179w/0e 2.6.1-mm3 0w/0e 0w/0e 151w/ 5e 10w/0e 3w/0e 177w/0e 2.6.1-mm2 0w/0e 0w/0e 143w/ 5e 12w/0e 3w/0e 171w/0e 2.6.1-mm1 0w/0e 0w/0e 146w/ 9e 12w/0e 6w/0e 171w/0e 2.6.1-rc2-mm1 0w/0e 0w/0e 149w/ 0e 12w/0e 6w/0e 171w/4e 2.6.1-rc1-mm2 0w/0e 0w/0e 157w/15e 12w/0e 3w/0e 185w/4e 2.6.1-rc1-mm1 0w/0e 0w/0e 156w/10e 12w/0e 3w/0e 184w/2e 2.6.0-mm2 0w/0e 0w/0e 161w/ 0e 12w/0e 3w/0e 189w/0e 2.6.0-mm1 0w/0e 0w/0e 173w/ 0e 12w/0e 3w/0e 212w/0e Web page with links to complete details: http://developer.osdl.org/cherry/compile/ John ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 - undefined references - [PATCH] 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton ` (2 preceding siblings ...) 2004-08-26 17:58 ` 2.6.9-rc1-mm1 (compile stats) John Cherry @ 2004-08-26 18:53 ` Paolo Ornati 2004-08-28 8:54 ` Adrian Bunk 2004-08-26 22:46 ` 2.6.9-rc1-mm1 Rafael J. Wysocki ` (4 subsequent siblings) 8 siblings, 1 reply; 60+ messages in thread From: Paolo Ornati @ 2004-08-26 18:53 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel On Thursday 26 August 2004 10:47, you wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > make[1]: `arch/i386/kernel/asm-offsets.s' is up to date. CHK include/linux/compile.h CPP arch/i386/kernel/vsyscall.lds.s SYSCALL arch/i386/kernel/vsyscall-int80.so SYSCALL arch/i386/kernel/vsyscall-sysenter.so AS arch/i386/kernel/vsyscall.o SYSCALL arch/i386/kernel/vsyscall-syms.o LD arch/i386/kernel/built-in.o GEN .version CHK include/linux/compile.h UPD include/linux/compile.h CC init/version.o LD init/built-in.o LD .tmp_vmlinux1 drivers/built-in.o(.data+0x40a68): undefined reference to `cfb_fillrect' drivers/built-in.o(.data+0x40a6c): undefined reference to `cfb_copyarea' make: *** [.tmp_vmlinux1] Error 1 as shown by the code (drivers/video/tdfxfb.c): #ifdef CONFIG_FB_3DFX_ACCEL .fb_fillrect = tdfxfb_fillrect, .fb_copyarea = tdfxfb_copyarea, .fb_imageblit = tdfxfb_imageblit, .fb_cursor = tdfxfb_cursor, #else .fb_fillrect = cfb_fillrect, .fb_copyarea = cfb_copyarea, .fb_imageblit = cfb_imageblit, .fb_cursor = soft_cursor, #endif 3dfx framebuffer driver depends on "cfb_fillrect.c" and "cfb_copyarea.c" if it's compiled without CONFIG_FB_3DFX_ACCEL turned on... Signed-off-by: Paolo Ornati <ornati@fastwebnet.it> --- linux-2.6.9-rc1-mm1/drivers/video/Makefile.orig 2004-08-26 19:24:10.000000000 +0200 +++ linux-2.6.9-rc1-mm1/drivers/video/Makefile 2004-08-26 20:27:55.097186528 +0200 @@ -34,7 +34,11 @@ obj-$(CONFIG_FB_CYBER) += cyb obj-$(CONFIG_FB_CYBER2000) += cyber2000fb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_GBE) += gbefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_SGIVW) += sgivwfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o -obj-$(CONFIG_FB_3DFX) += tdfxfb.o cfbimgblt.o +obj-$(CONFIG_FB_3DFX) += tdfxfb.o tdfxfb_lib.o +tdfxfb_lib-y := cfbimgblt.o +ifneq ($(CONFIG_FB_3DFX_ACCEL),y) +tdfxfb_lib-y += cfbfillrect.o cfbcopyarea.o +endif obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_HP300) += hpfb.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_OF) += offb.o cfbfillrect.o cfbimgblt.o cfbcopyarea.o -- Paolo Ornati Gentoo Linux (kernel 2.6.8-gentoo-r1) ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 - undefined references - [PATCH] 2004-08-26 18:53 ` 2.6.9-rc1-mm1 - undefined references - [PATCH] Paolo Ornati @ 2004-08-28 8:54 ` Adrian Bunk 2004-08-28 9:45 ` Paolo Ornati 0 siblings, 1 reply; 60+ messages in thread From: Adrian Bunk @ 2004-08-28 8:54 UTC (permalink / raw) To: Paolo Ornati; +Cc: Andrew Morton, linux-kernel On Thu, Aug 26, 2004 at 08:53:08PM +0200, Paolo Ornati wrote: > On Thursday 26 August 2004 10:47, you wrote: > > > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > > > > make[1]: `arch/i386/kernel/asm-offsets.s' is up to date. > CHK include/linux/compile.h > CPP arch/i386/kernel/vsyscall.lds.s > SYSCALL arch/i386/kernel/vsyscall-int80.so > SYSCALL arch/i386/kernel/vsyscall-sysenter.so > AS arch/i386/kernel/vsyscall.o > SYSCALL arch/i386/kernel/vsyscall-syms.o > LD arch/i386/kernel/built-in.o > GEN .version > CHK include/linux/compile.h > UPD include/linux/compile.h > CC init/version.o > LD init/built-in.o > LD .tmp_vmlinux1 > drivers/built-in.o(.data+0x40a68): undefined reference to `cfb_fillrect' > drivers/built-in.o(.data+0x40a6c): undefined reference to `cfb_copyarea' > make: *** [.tmp_vmlinux1] Error 1 > > > as shown by the code (drivers/video/tdfxfb.c): > > #ifdef CONFIG_FB_3DFX_ACCEL > .fb_fillrect = tdfxfb_fillrect, > .fb_copyarea = tdfxfb_copyarea, > .fb_imageblit = tdfxfb_imageblit, > .fb_cursor = tdfxfb_cursor, > #else > .fb_fillrect = cfb_fillrect, > .fb_copyarea = cfb_copyarea, > .fb_imageblit = cfb_imageblit, > .fb_cursor = soft_cursor, > #endif > > 3dfx framebuffer driver depends on "cfb_fillrect.c" and "cfb_copyarea.c" > if it's compiled without CONFIG_FB_3DFX_ACCEL turned on... >... Your analysis is correct, but the following patch is a bit better since it doesn't add a tdfxfb_lib: Signed-off-by: Adrian Bunk <bunk@fs.tum.de> --- linux-2.6.9-rc1-mm1-full/drivers/video/Makefile.old 2004-08-28 10:41:30.000000000 +0200 +++ linux-2.6.9-rc1-mm1-full/drivers/video/Makefile 2004-08-28 10:46:20.000000000 +0200 @@ -35,6 +35,9 @@ obj-$(CONFIG_FB_GBE) += gbefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_SGIVW) += sgivwfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_3DFX) += tdfxfb.o cfbimgblt.o +ifneq ($(CONFIG_FB_3DFX_ACCEL),y) + obj-$(CONFIG_FB_3DFX) += cfbfillrect.o cfbcopyarea.o +endif obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o obj-$(CONFIG_FB_HP300) += hpfb.o cfbfillrect.o cfbimgblt.o obj-$(CONFIG_FB_OF) += offb.o cfbfillrect.o cfbimgblt.o cfbcopyarea.o ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 - undefined references - [PATCH] 2004-08-28 8:54 ` Adrian Bunk @ 2004-08-28 9:45 ` Paolo Ornati 0 siblings, 0 replies; 60+ messages in thread From: Paolo Ornati @ 2004-08-28 9:45 UTC (permalink / raw) To: Adrian Bunk; +Cc: Andrew Morton, linux-kernel On Saturday 28 August 2004 10:54, Adrian Bunk wrote: > > Your analysis is correct, but the following patch is a bit better since > it doesn't add a tdfxfb_lib: > > > Signed-off-by: Adrian Bunk <bunk@fs.tum.de> > > --- linux-2.6.9-rc1-mm1-full/drivers/video/Makefile.old 2004-08-28 10:41:30.000000000 +0200 > +++ linux-2.6.9-rc1-mm1-full/drivers/video/Makefile 2004-08-28 10:46:20.000000000 +0200 > @@ -35,6 +35,9 @@ > obj-$(CONFIG_FB_GBE) += gbefb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o > obj-$(CONFIG_FB_SGIVW) += sgivwfb.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o > obj-$(CONFIG_FB_3DFX) += tdfxfb.o cfbimgblt.o > +ifneq ($(CONFIG_FB_3DFX_ACCEL),y) > + obj-$(CONFIG_FB_3DFX) += cfbfillrect.o cfbcopyarea.o > +endif > obj-$(CONFIG_FB_MAC) += macfb.o macmodes.o cfbfillrect.o cfbcopyarea.o cfbimgblt.o > obj-$(CONFIG_FB_HP300) += hpfb.o cfbfillrect.o cfbimgblt.o > obj-$(CONFIG_FB_OF) += offb.o cfbfillrect.o cfbimgblt.o cfbcopyarea.o I agree. ;-) -- Paolo Ornati Gentoo Linux (kernel 2.6.8-gentoo-r3) ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton ` (3 preceding siblings ...) 2004-08-26 18:53 ` 2.6.9-rc1-mm1 - undefined references - [PATCH] Paolo Ornati @ 2004-08-26 22:46 ` Rafael J. Wysocki 2004-08-26 22:50 ` 2.6.9-rc1-mm1 Andrew Morton 2004-08-26 23:53 ` 2.6.9-rc1-mm1 Tomasz Torcz ` (3 subsequent siblings) 8 siblings, 1 reply; 60+ messages in thread From: Rafael J. Wysocki @ 2004-08-26 22:46 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel On Thursday 26 of August 2004 10:47, Andrew Morton wrote: > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6 >.9-rc1-mm1/ > > > - nicksched is still here. There has been very little feedback, except > that it seems to slow some workloads on NUMA. > It has the problem that I have reported for 2.6.8.1-mm4, that after issuing: # rmmod snd_seq_oss the kernel goes into a strange state: - one CPU (either CPU0 or CPU1) is 100% loaded with system load - the other CPU is free - the process "rmmod snd_seq_oss" is in the D+ state - when I exit KDE session the system hangs solid (no way to get to it, reset necessary). - when I try this from a virtual terminal, it freezes the keyboard and I can't get to the other virtual terminals/X, but I can get to the system via ssh. No Oops is reported, and it does not happen on 2.6.8.1-mm2. Regards, RJW -- For a successful technology, reality must take precedence over public relations, for nature cannot be fooled. -- Richard P. Feynman ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 22:46 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-26 22:50 ` Andrew Morton 0 siblings, 0 replies; 60+ messages in thread From: Andrew Morton @ 2004-08-26 22:50 UTC (permalink / raw) To: Rafael J. Wysocki; +Cc: linux-kernel "Rafael J. Wysocki" <rjw@sisk.pl> wrote: > > On Thursday 26 of August 2004 10:47, Andrew Morton wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6 > >.9-rc1-mm1/ > > > > > > - nicksched is still here. There has been very little feedback, except > > that it seems to slow some workloads on NUMA. > > > > It has the problem that I have reported for 2.6.8.1-mm4, that after issuing: > > # rmmod snd_seq_oss > > the kernel goes into a strange state: Rusty sent out a couple of patches which should fix this up. They'll be in next -mm. Probably the below patch: --- .13565-linux-2.6.8.1-mm4/kernel/stop_machine.c 2004-05-10 15:13:59.000000000 +1000 +++ .13565-linux-2.6.8.1-mm4.updated/kernel/stop_machine.c 2004-08-26 16:24:56.000000000 +1000 @@ -82,7 +86,7 @@ static int stop_machine(void) int i, ret = 0; struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; /* One high-prio thread per cpu. We'll do this one. */ - sys_sched_setscheduler(current->pid, SCHED_FIFO, ¶m); + sys_sched_setscheduler(current->pid, SCHED_RR, ¶m); atomic_set(&stopmachine_thread_ack, 0); ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: 2.6.9-rc1-mm1 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton ` (4 preceding siblings ...) 2004-08-26 22:46 ` 2.6.9-rc1-mm1 Rafael J. Wysocki @ 2004-08-26 23:53 ` Tomasz Torcz [not found] ` <20040827043132.GJ2793@holomorphy.com> ` (2 subsequent siblings) 8 siblings, 0 replies; 60+ messages in thread From: Tomasz Torcz @ 2004-08-26 23:53 UTC (permalink / raw) To: linux-kernel On Thu, Aug 26, 2004 at 01:47:45AM -0700, Andrew Morton wrote: > - nicksched is still here. There has been very little feedback, except that > it seems to slow some workloads on NUMA. I've today returned from -mm series to 2.6.9-rc1 and noticed some changes. Usual workload of my celeron 366 consist of bunch of transparent Eterms, firefox, xmms playing and some background daemons (like spamassassin). Xmms is known for unpleasant behaviour - it sleeps a lot, slowing down entire system. This isn't noticable in top, which show ~10% CPU dedicated to xmms, but it very easy to feel. Nick scheduler in contrast to stock scheduler from -linus make interativity a lot better. When switching workspaces, windows redraw almost instantly (max 2 seconds), whereas in -linus I often have to wait up to 8-10 seconds to work. when running -mm, playing xmms don't slow thinhs much. Kernel compile is almost as fast, as when xmms is shut. In -linus in turn, playing xmms can slow down compile twice. Firefox loading 3-4 pages in tabs in -linus makes all desktop lagging. Scheduler from -mm makes load caused by firefox unnoticabled in other apps. That are my observations. It's nothing scientific and there are no solind numbers from benchmarks to support them. -- Tomasz Torcz To co nierealne - tutaj jest normalne. zdzichu@irc.-nie.spam-.pl Ziomale na życie mają tu patenty specjalne. ^ permalink raw reply [flat|nested] 60+ messages in thread
[parent not found: <20040827043132.GJ2793@holomorphy.com>]
* Re: 2.6.9-rc1-mm1 [not found] ` <20040827043132.GJ2793@holomorphy.com> @ 2004-08-27 21:42 ` William Lee Irwin III 0 siblings, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-27 21:42 UTC (permalink / raw) To: Andrew Morton, linux-kernel On Thu, Aug 26, 2004 at 01:47:45AM -0700, Andrew Morton wrote: > > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ [...] On Thu, Aug 26, 2004 at 09:31:32PM -0700, William Lee Irwin III wrote: > Hmm. Something odd is going on; initcall_debug doesn't seem to function > as expected. It reports strings with "queue" as a substring instead of > the expected function names. There may be a bootstrap ordering issue > (though apparently benign, just initcall_debug) with kallsyms bits. I suspect endianness; sparc64 is affected, but not x86-64. Now checking kallsyms lookup -related results on ppc64... -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* [0/4] standardized waitqueue hashing 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton ` (6 preceding siblings ...) [not found] ` <20040827043132.GJ2793@holomorphy.com> @ 2004-08-28 5:26 ` William Lee Irwin III 2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III 2004-08-28 9:06 ` [patch] 2.6.9-rc1-mm1: megaraid_mbox.c compile error with gcc 3.4 Adrian Bunk 8 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 5:26 UTC (permalink / raw) To: Andrew Morton; +Cc: Oleg Nesterov, linux-kernel On Thu, Aug 26, 2004 at 01:47:45AM -0700, Andrew Morton wrote: > ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.9-rc1/2.6.9-rc1-mm1/ > - nicksched is still here. There has been very little feedback, except that > it seems to slow some workloads on NUMA. > - Added a __must_check to the x86 copy_*_user functions. This means that > with a sufficiently recent gcc, all unchecked copy_*_user() calls will > generate a warning. > I fixed a few things, but binfmt_elf.c is a mess. > It's not clear how to apply the same debug check to put_user() and > friends. The following patch series consolidates the various instances of waitqueue hashing to use a uniform structure and share the per-zone hashtable among all waitqueue hashers. This is expected to increase the number of hashtable buckets available for waiting on bh's and inodes and eliminate statically allocated kernel data structures for greater node locality and reduced kernel image size. Some attempt was made to look similar to Oleg Nesterov's suggested API in order to provide some kind of credit for independent invention of something very similar (the original versions of these patches predated my public postings on the subject of filtered waitqueues). These patches have the further benefit and intention of enabling aio to use filtered wakeups by standardizing the data structure passed to wake functions so that embedded waitqueue elements in aio structures may be succesfully passed to the filtered wakeup wake functions, though this patch series doesn't implement that particular functionality. Successfully stress-tested on x86-64 and ia64. -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* [1/4] standardize bit waiting data type 2004-08-28 5:26 ` [0/4] standardized waitqueue hashing William Lee Irwin III @ 2004-08-28 5:31 ` William Lee Irwin III 2004-08-28 5:35 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III ` (2 more replies) 0 siblings, 3 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 5:31 UTC (permalink / raw) To: Andrew Morton; +Cc: Oleg Nesterov, linux-kernel On Fri, Aug 27, 2004 at 10:26:27PM -0700, William Lee Irwin III wrote: > The following patch series consolidates the various instances of > waitqueue hashing to use a uniform structure and share the per-zone > hashtable among all waitqueue hashers. This is expected to increase the > number of hashtable buckets available for waiting on bh's and inodes > and eliminate statically allocated kernel data structures for greater > node locality and reduced kernel image size. Some attempt was made to > look similar to Oleg Nesterov's suggested API in order to provide some > kind of credit for independent invention of something very similar (the > original versions of these patches predated my public postings on the > subject of filtered waitqueues). Eliminate specialized page and bh waitqueue hashing structures in favor of a standardized structure, using wake_up_bit() to wake waiters using the standardized wait_bit_key structure. Index: mm1-2.6.9-rc1/fs/buffer.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/buffer.c 2004-08-26 15:04:08.000000000 -0700 +++ mm1-2.6.9-rc1/fs/buffer.c 2004-08-27 22:02:17.837872264 -0700 @@ -43,26 +43,6 @@ #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) -struct bh_wait_queue { - struct buffer_head *bh; - wait_queue_t wait; -}; - -#define __DEFINE_BH_WAIT(name, b, f) \ - struct bh_wait_queue name = { \ - .bh = b, \ - .wait = { \ - .task = current, \ - .flags = f, \ - .func = bh_wake_function, \ - .task_list = \ - LIST_HEAD_INIT(name.wait.task_list),\ - }, \ - } -#define DEFINE_BH_WAIT(name, bh) __DEFINE_BH_WAIT(name, bh, 0) -#define DEFINE_BH_WAIT_EXCLUSIVE(name, bh) \ - __DEFINE_BH_WAIT(name, bh, WQ_FLAG_EXCLUSIVE) - /* * Hashed waitqueue_head's for wait_on_buffer() */ @@ -93,24 +73,10 @@ wait_queue_head_t *wq = bh_waitq_head(bh); smp_mb(); - if (waitqueue_active(wq)) - __wake_up(wq, TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE, 1, bh); + __wake_up_bit(wq, &bh->b_state, BH_Lock); } EXPORT_SYMBOL(wake_up_buffer); -static int bh_wake_function(wait_queue_t *wait, unsigned mode, - int sync, void *key) -{ - struct buffer_head *bh = key; - struct bh_wait_queue *wq; - - wq = container_of(wait, struct bh_wait_queue, wait); - if (wq->bh != bh || buffer_locked(bh)) - return 0; - else - return autoremove_wake_function(wait, mode, sync, key); -} - static void sync_buffer(struct buffer_head *bh) { struct block_device *bd; @@ -124,7 +90,7 @@ void fastcall __lock_buffer(struct buffer_head *bh) { wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_BH_WAIT_EXCLUSIVE(wait, bh); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); do { prepare_to_wait_exclusive(wqh, &wait.wait, @@ -153,15 +119,13 @@ void __wait_on_buffer(struct buffer_head * bh) { wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_BH_WAIT(wait, bh); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - do { - prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - } while (buffer_locked(bh)); + prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); + if (buffer_locked(bh)) { + sync_buffer(bh); + io_schedule(); + } finish_wait(wqh, &wait.wait); } Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-26 15:04:12.000000000 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-27 22:02:13.647509296 -0700 @@ -227,6 +227,29 @@ EXPORT_SYMBOL(autoremove_wake_function); +int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *arg) +{ + struct wait_bit_key *key = arg; + struct wait_bit_queue *wait_bit = + container_of(wait, struct wait_bit_queue, wait); + + if (wait_bit->key.flags != key->flags || + wait_bit->key.bit_nr != key->bit_nr || + test_bit(key->bit_nr, key->flags)) + return 0; + else + return autoremove_wake_function(wait, mode, sync, key); +} +EXPORT_SYMBOL(wake_bit_function); + +void fastcall __wake_up_bit(wait_queue_head_t *wq, unsigned long *word, int bit) +{ + struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit); + if (waitqueue_active(wq)) + __wake_up(wq, TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE, 1, &key); +} +EXPORT_SYMBOL(__wake_up_bit); + void __init fork_init(unsigned long mempages) { #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR Index: mm1-2.6.9-rc1/mm/filemap.c =================================================================== --- mm1-2.6.9-rc1.orig/mm/filemap.c 2004-08-27 09:11:29.000000000 -0700 +++ mm1-2.6.9-rc1/mm/filemap.c 2004-08-27 22:02:05.772706448 -0700 @@ -355,40 +355,6 @@ * at a cost of "thundering herd" phenomena during rare hash * collisions. */ -struct page_wait_queue { - struct page *page; - int bit; - wait_queue_t wait; -}; - -static int page_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key) -{ - struct page *page = key; - struct page_wait_queue *wq; - - wq = container_of(wait, struct page_wait_queue, wait); - if (wq->page != page || test_bit(wq->bit, &page->flags)) - return 0; - else - return autoremove_wake_function(wait, mode, sync, NULL); -} - -#define __DEFINE_PAGE_WAIT(name, p, b, f) \ - struct page_wait_queue name = { \ - .page = p, \ - .bit = b, \ - .wait = { \ - .task = current, \ - .func = page_wake_function, \ - .flags = f, \ - .task_list = LIST_HEAD_INIT(name.wait.task_list),\ - }, \ - } - -#define DEFINE_PAGE_WAIT(name, p, b) __DEFINE_PAGE_WAIT(name, p, b, 0) -#define DEFINE_PAGE_WAIT_EXCLUSIVE(name, p, b) \ - __DEFINE_PAGE_WAIT(name, p, b, WQ_FLAG_EXCLUSIVE) - static wait_queue_head_t *page_waitqueue(struct page *page) { const struct zone *zone = page_zone(page); @@ -396,27 +362,16 @@ return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)]; } -static void wake_up_page(struct page *page) -{ - const unsigned int mode = TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE; - wait_queue_head_t *waitqueue = page_waitqueue(page); - - if (waitqueue_active(waitqueue)) - __wake_up(waitqueue, mode, 1, page); -} - void fastcall wait_on_page_bit(struct page *page, int bit_nr) { wait_queue_head_t *waitqueue = page_waitqueue(page); - DEFINE_PAGE_WAIT(wait, page, bit_nr); + DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, bit_nr); - do { - prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); - if (test_bit(bit_nr, &page->flags)) { - sync_page(page); - io_schedule(); - } - } while (test_bit(bit_nr, &page->flags)); + prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); + if (test_bit(bit_nr, &page->flags)) { + sync_page(page); + io_schedule(); + } finish_wait(waitqueue, &wait.wait); } @@ -439,11 +394,12 @@ */ void fastcall unlock_page(struct page *page) { + unsigned long *word = (unsigned long *)&page->flags; smp_mb__before_clear_bit(); if (!TestClearPageLocked(page)) BUG(); smp_mb__after_clear_bit(); - wake_up_page(page); + __wake_up_bit(page_waitqueue(page), word, PG_locked); } EXPORT_SYMBOL(unlock_page); @@ -454,12 +410,13 @@ */ void end_page_writeback(struct page *page) { + unsigned long *word = (unsigned long *)&page->flags; if (!TestClearPageReclaim(page) || rotate_reclaimable_page(page)) { if (!test_clear_page_writeback(page)) BUG(); smp_mb__after_clear_bit(); } - wake_up_page(page); + __wake_up_bit(page_waitqueue(page), word, PG_writeback); } EXPORT_SYMBOL(end_page_writeback); @@ -475,7 +432,7 @@ void fastcall __lock_page(struct page *page) { wait_queue_head_t *wqh = page_waitqueue(page); - DEFINE_PAGE_WAIT_EXCLUSIVE(wait, page, PG_locked); + DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, PG_locked); while (TestSetPageLocked(page)) { prepare_to_wait_exclusive(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-26 15:03:53.000000000 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-27 22:02:21.778273232 -0700 @@ -37,6 +37,16 @@ struct list_head task_list; }; +struct wait_bit_key { + unsigned long *flags; + int bit_nr; +}; + +struct wait_bit_queue { + struct wait_bit_key key; + wait_queue_t wait; +}; + struct __wait_queue_head { spinlock_t lock; struct list_head task_list; @@ -63,6 +73,9 @@ #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) +#define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ + { .flags = word, .bit_nr = bit, } + static inline void init_waitqueue_head(wait_queue_head_t *q) { q->lock = SPIN_LOCK_UNLOCKED; @@ -125,6 +138,7 @@ void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key)); extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode)); extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); +void FASTCALL(__wake_up_bit(wait_queue_head_t *, unsigned long *, int)); #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) @@ -277,6 +291,7 @@ wait_queue_t *wait, int state)); void FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait)); int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); +int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); #define DEFINE_WAIT(name) \ wait_queue_t name = { \ @@ -287,6 +302,17 @@ }, \ } +#define DEFINE_WAIT_BIT(name, word, bit) \ + struct wait_bit_queue name = { \ + .key = __WAIT_BIT_KEY_INITIALIZER(word, bit), \ + .wait = { \ + .task = current, \ + .func = wake_bit_function, \ + .task_list = \ + LIST_HEAD_INIT(name.wait.task_list), \ + }, \ + } + #define init_wait(wait) \ do { \ wait->task = current; \ ^ permalink raw reply [flat|nested] 60+ messages in thread
* [2/4] consolidate bit waiting code patterns 2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III @ 2004-08-28 5:35 ` William Lee Irwin III 2004-08-28 5:37 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III 2004-08-28 6:17 ` [1/4] standardize bit waiting data type Andrew Morton 2004-08-28 9:18 ` [1/4] standardize bit waiting data type Christoph Hellwig 2 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 5:35 UTC (permalink / raw) To: Andrew Morton; +Cc: Oleg Nesterov, linux-kernel On Fri, Aug 27, 2004 at 10:31:12PM -0700, William Lee Irwin III wrote: > Eliminate specialized page and bh waitqueue hashing structures in favor > of a standardized structure, using wake_up_bit() to wake waiters using > the standardized wait_bit_key structure. Consolidate bit waiting code patterns for page waitqueues using __wait_on_bit() and __wait_on_bit_lock(). Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-27 22:02:13.647509296 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-27 22:15:35.543602560 -0700 @@ -250,6 +250,40 @@ } EXPORT_SYMBOL(__wake_up_bit); +int __sched __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q, + unsigned long *word, + int bit, int (*wait)(unsigned long *), unsigned mode) +{ + int ret; + + prepare_to_wait(wq, &q->wait, mode); + if (test_bit(bit, word)) { + if ((ret = (*wait)(word))) + return ret; + } + finish_wait(wq, &q->wait); + return 0; +} +EXPORT_SYMBOL(__wait_on_bit); + +int __sched __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, + unsigned long *word, int bit, + int (*wait)(unsigned long *), unsigned mode) +{ + int ret; + + while (test_and_set_bit(bit, word)) { + prepare_to_wait_exclusive(wq, &q->wait, mode); + if (test_bit(bit, word)) { + if ((ret = (*wait)(word))) + return ret; + } + } + finish_wait(wq, &q->wait); + return 0; +} +EXPORT_SYMBOL(__wait_on_bit_lock); + void __init fork_init(unsigned long mempages) { #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR Index: mm1-2.6.9-rc1/mm/filemap.c =================================================================== --- mm1-2.6.9-rc1.orig/mm/filemap.c 2004-08-27 22:02:05.772706448 -0700 +++ mm1-2.6.9-rc1/mm/filemap.c 2004-08-27 22:15:35.551601344 -0700 @@ -132,9 +132,11 @@ } EXPORT_SYMBOL(remove_from_page_cache); -static inline int sync_page(struct page *page) +static int sync_page(unsigned long *word) { struct address_space *mapping; + struct page *page + = container_of((page_flags_t *)word, struct page, flags); /* * FIXME, fercrissake. What is this barrier here for? @@ -142,7 +144,8 @@ smp_mb(); mapping = page_mapping(page); if (mapping && mapping->a_ops && mapping->a_ops->sync_page) - return mapping->a_ops->sync_page(page); + mapping->a_ops->sync_page(page); + io_schedule(); return 0; } @@ -362,19 +365,18 @@ return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)]; } +static inline void wake_up_page(struct page *page, int bit) +{ + __wake_up_bit(page_waitqueue(page), (unsigned long *)&page->flags, bit); +} + void fastcall wait_on_page_bit(struct page *page, int bit_nr) { - wait_queue_head_t *waitqueue = page_waitqueue(page); DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, bit_nr); - prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); - if (test_bit(bit_nr, &page->flags)) { - sync_page(page); - io_schedule(); - } - finish_wait(waitqueue, &wait.wait); + __wait_on_bit(page_waitqueue(page), &wait, wait.key.flags, + bit_nr, sync_page, TASK_UNINTERRUPTIBLE); } - EXPORT_SYMBOL(wait_on_page_bit); /** @@ -394,12 +396,11 @@ */ void fastcall unlock_page(struct page *page) { - unsigned long *word = (unsigned long *)&page->flags; smp_mb__before_clear_bit(); if (!TestClearPageLocked(page)) BUG(); smp_mb__after_clear_bit(); - __wake_up_bit(page_waitqueue(page), word, PG_locked); + wake_up_page(page, PG_locked); } EXPORT_SYMBOL(unlock_page); @@ -410,13 +411,12 @@ */ void end_page_writeback(struct page *page) { - unsigned long *word = (unsigned long *)&page->flags; if (!TestClearPageReclaim(page) || rotate_reclaimable_page(page)) { if (!test_clear_page_writeback(page)) BUG(); smp_mb__after_clear_bit(); } - __wake_up_bit(page_waitqueue(page), word, PG_writeback); + wake_up_page(page, PG_writeback); } EXPORT_SYMBOL(end_page_writeback); @@ -431,19 +431,11 @@ */ void fastcall __lock_page(struct page *page) { - wait_queue_head_t *wqh = page_waitqueue(page); DEFINE_WAIT_BIT(wait, (unsigned long *)&page->flags, PG_locked); - while (TestSetPageLocked(page)) { - prepare_to_wait_exclusive(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (PageLocked(page)) { - sync_page(page); - io_schedule(); - } - } - finish_wait(wqh, &wait.wait); + __wait_on_bit_lock(page_waitqueue(page), &wait, wait.key.flags, + PG_locked, sync_page, TASK_UNINTERRUPTIBLE); } - EXPORT_SYMBOL(__lock_page); /* Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-27 22:02:21.778273232 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-27 22:15:35.554600888 -0700 @@ -139,6 +139,8 @@ extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode)); extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); void FASTCALL(__wake_up_bit(wait_queue_head_t *, unsigned long *, int)); +int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned)); +int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned)); #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) ^ permalink raw reply [flat|nested] 60+ messages in thread
* [3/4] eliminate bh waitqueue hashtable 2004-08-28 5:35 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III @ 2004-08-28 5:37 ` William Lee Irwin III 2004-08-28 5:38 ` [4/4] eliminate inode " William Lee Irwin III 0 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 5:37 UTC (permalink / raw) To: Andrew Morton; +Cc: Oleg Nesterov, linux-kernel On Fri, Aug 27, 2004 at 10:35:57PM -0700, William Lee Irwin III wrote: > Consolidate bit waiting code patterns for page waitqueues using > __wait_on_bit() and __wait_on_bit_lock(). Eliminate the bh waitqueue hashtable using bit_waitqueue() via wait_on_bit() and wake_up_bit() to locate the waitqueue head associated with a bit. Index: mm1-2.6.9-rc1/fs/buffer.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/buffer.c 2004-08-27 22:02:17.837872264 -0700 +++ mm1-2.6.9-rc1/fs/buffer.c 2004-08-27 22:15:39.524997296 -0700 @@ -43,14 +43,6 @@ #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) -/* - * Hashed waitqueue_head's for wait_on_buffer() - */ -#define BH_WAIT_TABLE_ORDER 7 -static struct bh_wait_queue_head { - wait_queue_head_t wqh; -} ____cacheline_aligned_in_smp bh_wait_queue_heads[1<<BH_WAIT_TABLE_ORDER]; - inline void init_buffer(struct buffer_head *bh, bh_end_io_t *handler, void *private) { @@ -58,49 +50,31 @@ bh->b_private = private; } -/* - * Return the address of the waitqueue_head to be used for this - * buffer_head - */ -wait_queue_head_t *bh_waitq_head(struct buffer_head *bh) -{ - return &bh_wait_queue_heads[hash_ptr(bh, BH_WAIT_TABLE_ORDER)].wqh; -} -EXPORT_SYMBOL(bh_waitq_head); - void wake_up_buffer(struct buffer_head *bh) { - wait_queue_head_t *wq = bh_waitq_head(bh); - smp_mb(); - __wake_up_bit(wq, &bh->b_state, BH_Lock); + wake_up_bit(&bh->b_state, BH_Lock); } EXPORT_SYMBOL(wake_up_buffer); -static void sync_buffer(struct buffer_head *bh) +static int sync_buffer(unsigned long *word) { struct block_device *bd; + struct buffer_head *bh + = container_of(word, struct buffer_head, b_state); smp_mb(); bd = bh->b_bdev; if (bd) blk_run_address_space(bd->bd_inode->i_mapping); + io_schedule(); + return 0; } void fastcall __lock_buffer(struct buffer_head *bh) { - wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - - do { - prepare_to_wait_exclusive(wqh, &wait.wait, - TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - } while (test_set_buffer_locked(bh)); - finish_wait(wqh, &wait.wait); + wait_on_bit_lock(&bh->b_state, BH_Lock, sync_buffer, + TASK_UNINTERRUPTIBLE); } EXPORT_SYMBOL(__lock_buffer); @@ -118,15 +92,7 @@ */ void __wait_on_buffer(struct buffer_head * bh) { - wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - - prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - finish_wait(wqh, &wait.wait); + wait_on_bit(&bh->b_state, BH_Lock, sync_buffer, TASK_UNINTERRUPTIBLE); } static void @@ -3096,14 +3062,11 @@ void __init buffer_init(void) { - int i; int nrpages; bh_cachep = kmem_cache_create("buffer_head", sizeof(struct buffer_head), 0, SLAB_PANIC, init_buffer_head, NULL); - for (i = 0; i < ARRAY_SIZE(bh_wait_queue_heads); i++) - init_waitqueue_head(&bh_wait_queue_heads[i].wqh); /* * Limit the bh occupancy to 10% of ZONE_NORMAL Index: mm1-2.6.9-rc1/fs/jbd/transaction.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/jbd/transaction.c 2004-08-26 15:03:31.000000000 -0700 +++ mm1-2.6.9-rc1/fs/jbd/transaction.c 2004-08-27 22:15:39.532996080 -0700 @@ -633,21 +633,21 @@ * disk then we cannot do copy-out here. */ if (jh->b_jlist == BJ_Shadow) { - wait_queue_head_t *wqh; - DEFINE_WAIT(wait); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); + wait_queue_head_t *wqh + = bit_waitqueue(&bh->b_state, BH_Lock); JBUFFER_TRACE(jh, "on shadow: sleep"); jbd_unlock_bh_state(bh); /* commit wakes up all shadow buffers after IO */ - wqh = bh_waitq_head(bh); for ( ; ; ) { - prepare_to_wait(wqh, &wait, + prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); if (jh->b_jlist != BJ_Shadow) break; schedule(); } - finish_wait(wqh, &wait); + finish_wait(wqh, &wait.wait); goto repeat; } Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-27 22:15:35.543602560 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-27 22:15:39.537995320 -0700 @@ -40,6 +40,7 @@ #include <linux/audit.h> #include <linux/profile.h> #include <linux/rmap.h> +#include <linux/hash.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> @@ -242,6 +243,16 @@ } EXPORT_SYMBOL(wake_bit_function); +wait_queue_head_t * fastcall bit_waitqueue(unsigned long *word, int bit) +{ + const int shift = BITS_PER_LONG == 32 ? 5 : 6; + const struct zone *zone = page_zone(virt_to_page(word)); + unsigned long val = (unsigned long)word << shift | bit; + + return &zone->wait_table[hash_long(val, zone->wait_table_bits)]; +} +EXPORT_SYMBOL(bit_waitqueue); + void fastcall __wake_up_bit(wait_queue_head_t *wq, unsigned long *word, int bit) { struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit); Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-27 22:15:35.554600888 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-27 22:15:39.540994864 -0700 @@ -24,6 +24,7 @@ #include <linux/stddef.h> #include <linux/spinlock.h> #include <asm/system.h> +#include <asm/current.h> typedef struct __wait_queue wait_queue_t; typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key); @@ -141,6 +142,12 @@ void FASTCALL(__wake_up_bit(wait_queue_head_t *, unsigned long *, int)); int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned)); int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, unsigned long *, int, int (*)(unsigned long *), unsigned)); +wait_queue_head_t *FASTCALL(bit_waitqueue(unsigned long *, int)); + +static inline void wake_up_bit(unsigned long *word, int bit) +{ + __wake_up_bit(bit_waitqueue(word, bit), word, bit); +} #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) @@ -321,6 +328,24 @@ wait->func = autoremove_wake_function; \ INIT_LIST_HEAD(&wait->task_list); \ } while (0) + +static inline int wait_on_bit(unsigned long *word, int bit, + int (*wait)(unsigned long *), unsigned mode) +{ + DEFINE_WAIT_BIT(q, word, bit); + wait_queue_head_t *wqh = bit_waitqueue(word, bit); + + return __wait_on_bit(wqh, &q, word, bit, wait, mode); +} + +static inline int wait_on_bit_lock(unsigned long *word, int bit, + int (*wait)(unsigned long *), unsigned mode) +{ + DEFINE_WAIT_BIT(q, word, bit); + wait_queue_head_t *wqh = bit_waitqueue(word, bit); + + return __wait_on_bit_lock(wqh, &q, word, bit, wait, mode); +} #endif /* __KERNEL__ */ ^ permalink raw reply [flat|nested] 60+ messages in thread
* [4/4] eliminate inode waitqueue hashtable 2004-08-28 5:37 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III @ 2004-08-28 5:38 ` William Lee Irwin III 0 siblings, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 5:38 UTC (permalink / raw) To: Andrew Morton; +Cc: Oleg Nesterov, linux-kernel On Fri, Aug 27, 2004 at 10:37:26PM -0700, William Lee Irwin III wrote: > Eliminate the bh waitqueue hashtable using bit_waitqueue() via > wait_on_bit() and wake_up_bit() to locate the waitqueue head associated > with a bit. Eliminate the inode waitqueue hashtable using bit_waitqueue() via wait_on_bit() and wake_up_bit() to locate the waitqueue head associated with a bit. Index: mm1-2.6.9-rc1/fs/inode.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/inode.c 2004-08-26 15:04:02.000000000 -0700 +++ mm1-2.6.9-rc1/fs/inode.c 2004-08-27 22:15:43.602377440 -0700 @@ -1257,37 +1257,17 @@ #endif -/* - * Hashed waitqueues for wait_on_inode(). The table is pretty small - the - * kernel doesn't lock many inodes at the same time. - */ -#define I_WAIT_TABLE_ORDER 3 -static struct i_wait_queue_head { - wait_queue_head_t wqh; -} ____cacheline_aligned_in_smp i_wait_queue_heads[1<<I_WAIT_TABLE_ORDER]; +#define __I_LOCK 3 -/* - * Return the address of the waitqueue_head to be used for this inode - */ -static wait_queue_head_t *i_waitq_head(struct inode *inode) +static int inode_wait(unsigned long *word) { - return &i_wait_queue_heads[hash_ptr(inode, I_WAIT_TABLE_ORDER)].wqh; + schedule(); + return 0; } void __wait_on_inode(struct inode *inode) { - DECLARE_WAITQUEUE(wait, current); - wait_queue_head_t *wq = i_waitq_head(inode); - - add_wait_queue(wq, &wait); -repeat: - set_current_state(TASK_UNINTERRUPTIBLE); - if (inode->i_state & I_LOCK) { - schedule(); - goto repeat; - } - remove_wait_queue(wq, &wait); - __set_current_state(TASK_RUNNING); + wait_on_bit(&inode->i_state, __I_LOCK, inode_wait, TASK_UNINTERRUPTIBLE); } /* @@ -1305,27 +1285,23 @@ */ static void __wait_on_freeing_inode(struct inode *inode) { - DECLARE_WAITQUEUE(wait, current); - wait_queue_head_t *wq = i_waitq_head(inode); + wait_queue_head_t *wq = bit_waitqueue(&inode->i_state, __I_LOCK); + DEFINE_WAIT_BIT(wait, &inode->i_state, __I_LOCK); - add_wait_queue(wq, &wait); - set_current_state(TASK_UNINTERRUPTIBLE); + prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE); spin_unlock(&inode_lock); schedule(); - remove_wait_queue(wq, &wait); + finish_wait(wq, &wait.wait); spin_lock(&inode_lock); } void wake_up_inode(struct inode *inode) { - wait_queue_head_t *wq = i_waitq_head(inode); - /* * Prevent speculative execution through spin_unlock(&inode_lock); */ smp_mb(); - if (waitqueue_active(wq)) - wake_up_all(wq); + wake_up_bit(&inode->i_state, __I_LOCK); } EXPORT_SYMBOL(wake_up_inode); @@ -1361,11 +1337,6 @@ void __init inode_init(unsigned long mempages) { - int i; - - for (i = 0; i < ARRAY_SIZE(i_wait_queue_heads); i++) - init_waitqueue_head(&i_wait_queue_heads[i].wqh); - /* inode slab cache */ inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode), 0, SLAB_PANIC, init_once, NULL); ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III 2004-08-28 5:35 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III @ 2004-08-28 6:17 ` Andrew Morton 2004-08-28 6:34 ` William Lee Irwin III 2004-08-28 9:18 ` [1/4] standardize bit waiting data type Christoph Hellwig 2 siblings, 1 reply; 60+ messages in thread From: Andrew Morton @ 2004-08-28 6:17 UTC (permalink / raw) To: William Lee Irwin III; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: > > void fastcall unlock_page(struct page *page) > { > + unsigned long *word = (unsigned long *)&page->flags; This will break if a little-endian 64-bit architecture elects to use a 32-bit page_flags_t. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 6:17 ` [1/4] standardize bit waiting data type Andrew Morton @ 2004-08-28 6:34 ` William Lee Irwin III 2004-08-28 6:40 ` Andrew Morton 0 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 6:34 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: >> void fastcall unlock_page(struct page *page) >> { >> + unsigned long *word = (unsigned long *)&page->flags; On Fri, Aug 27, 2004 at 11:17:13PM -0700, Andrew Morton wrote: > This will break if a little-endian 64-bit architecture elects to use a > 32-bit page_flags_t. You mean a big-endian one? I did check to be sure none did so; only x86-64 does. Easy enough to dress up so BE arches can do it too. -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 6:34 ` William Lee Irwin III @ 2004-08-28 6:40 ` Andrew Morton 2004-08-28 6:48 ` William Lee Irwin III 0 siblings, 1 reply; 60+ messages in thread From: Andrew Morton @ 2004-08-28 6:40 UTC (permalink / raw) To: William Lee Irwin III; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: > > William Lee Irwin III <wli@holomorphy.com> wrote: > >> void fastcall unlock_page(struct page *page) > >> { > >> + unsigned long *word = (unsigned long *)&page->flags; > > On Fri, Aug 27, 2004 at 11:17:13PM -0700, Andrew Morton wrote: > > This will break if a little-endian 64-bit architecture elects to use a > > 32-bit page_flags_t. > > You mean a big-endian one? I did check to be sure none did so; only > x86-64 does. Easy enough to dress up so BE arches can do it too. > hm. Actually, the page_flags_t hack can only work on little-endian hardware anyway. perhaps your implementation should imitate x86_64/bitops.h and use a void*, along with apologetic comments. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 6:40 ` Andrew Morton @ 2004-08-28 6:48 ` William Lee Irwin III 2004-08-28 9:20 ` William Lee Irwin III 0 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 6:48 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: >> You mean a big-endian one? I did check to be sure none did so; only >> x86-64 does. Easy enough to dress up so BE arches can do it too. On Fri, Aug 27, 2004 at 11:40:33PM -0700, Andrew Morton wrote: > hm. Actually, the page_flags_t hack can only work on little-endian > hardware anyway. > perhaps your implementation should imitate x86_64/bitops.h and use a void*, > along with apologetic comments. Okay, I'll resend it done that way. -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* [1/4] standardize bit waiting data type 2004-08-28 6:48 ` William Lee Irwin III @ 2004-08-28 9:20 ` William Lee Irwin III 2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III 0 siblings, 1 reply; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:20 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel On Fri, Aug 27, 2004 at 11:40:33PM -0700, Andrew Morton wrote: >> hm. Actually, the page_flags_t hack can only work on little-endian >> hardware anyway. >> perhaps your implementation should imitate x86_64/bitops.h and use a void*, >> along with apologetic comments. On Fri, Aug 27, 2004 at 11:48:29PM -0700, William Lee Irwin III wrote: > Okay, I'll resend it done that way. I didn't see very many apologies in x86-64 so I wasn't entirely sure what those would consist of; void * and some minor commentary added. Let me know if there's something more specific I should add comments about. Thanks. -- wli Eliminate specialized page and bh waitqueue hashing structures in favor of a standardized structure, using wake_up_bit() to wake waiters using the standardized wait_bit_key structure. Index: mm1-2.6.9-rc1/fs/buffer.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/buffer.c 2004-08-26 15:04:08.000000000 -0700 +++ mm1-2.6.9-rc1/fs/buffer.c 2004-08-27 23:50:07.644312184 -0700 @@ -43,26 +43,6 @@ #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) -struct bh_wait_queue { - struct buffer_head *bh; - wait_queue_t wait; -}; - -#define __DEFINE_BH_WAIT(name, b, f) \ - struct bh_wait_queue name = { \ - .bh = b, \ - .wait = { \ - .task = current, \ - .flags = f, \ - .func = bh_wake_function, \ - .task_list = \ - LIST_HEAD_INIT(name.wait.task_list),\ - }, \ - } -#define DEFINE_BH_WAIT(name, bh) __DEFINE_BH_WAIT(name, bh, 0) -#define DEFINE_BH_WAIT_EXCLUSIVE(name, bh) \ - __DEFINE_BH_WAIT(name, bh, WQ_FLAG_EXCLUSIVE) - /* * Hashed waitqueue_head's for wait_on_buffer() */ @@ -93,24 +73,10 @@ wait_queue_head_t *wq = bh_waitq_head(bh); smp_mb(); - if (waitqueue_active(wq)) - __wake_up(wq, TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE, 1, bh); + __wake_up_bit(wq, &bh->b_state, BH_Lock); } EXPORT_SYMBOL(wake_up_buffer); -static int bh_wake_function(wait_queue_t *wait, unsigned mode, - int sync, void *key) -{ - struct buffer_head *bh = key; - struct bh_wait_queue *wq; - - wq = container_of(wait, struct bh_wait_queue, wait); - if (wq->bh != bh || buffer_locked(bh)) - return 0; - else - return autoremove_wake_function(wait, mode, sync, key); -} - static void sync_buffer(struct buffer_head *bh) { struct block_device *bd; @@ -124,7 +90,7 @@ void fastcall __lock_buffer(struct buffer_head *bh) { wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_BH_WAIT_EXCLUSIVE(wait, bh); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); do { prepare_to_wait_exclusive(wqh, &wait.wait, @@ -153,15 +119,13 @@ void __wait_on_buffer(struct buffer_head * bh) { wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_BH_WAIT(wait, bh); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - do { - prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - } while (buffer_locked(bh)); + prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); + if (buffer_locked(bh)) { + sync_buffer(bh); + io_schedule(); + } finish_wait(wqh, &wait.wait); } Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-26 15:04:12.000000000 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 01:20:04.105925320 -0700 @@ -227,6 +227,29 @@ EXPORT_SYMBOL(autoremove_wake_function); +int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *arg) +{ + struct wait_bit_key *key = arg; + struct wait_bit_queue *wait_bit + = container_of(wait, struct wait_bit_queue, wait); + + if (wait_bit->key.flags != key->flags || + wait_bit->key.bit_nr != key->bit_nr || + test_bit(key->bit_nr, key->flags)) + return 0; + else + return autoremove_wake_function(wait, mode, sync, key); +} +EXPORT_SYMBOL(wake_bit_function); + +void fastcall __wake_up_bit(wait_queue_head_t *wq, void *word, int bit) +{ + struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit); + if (waitqueue_active(wq)) + __wake_up(wq, TASK_INTERRUPTIBLE|TASK_UNINTERRUPTIBLE, 1, &key); +} +EXPORT_SYMBOL(__wake_up_bit); + void __init fork_init(unsigned long mempages) { #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR Index: mm1-2.6.9-rc1/mm/filemap.c =================================================================== --- mm1-2.6.9-rc1.orig/mm/filemap.c 2004-08-27 09:11:29.000000000 -0700 +++ mm1-2.6.9-rc1/mm/filemap.c 2004-08-28 01:19:28.658314176 -0700 @@ -355,40 +355,6 @@ * at a cost of "thundering herd" phenomena during rare hash * collisions. */ -struct page_wait_queue { - struct page *page; - int bit; - wait_queue_t wait; -}; - -static int page_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key) -{ - struct page *page = key; - struct page_wait_queue *wq; - - wq = container_of(wait, struct page_wait_queue, wait); - if (wq->page != page || test_bit(wq->bit, &page->flags)) - return 0; - else - return autoremove_wake_function(wait, mode, sync, NULL); -} - -#define __DEFINE_PAGE_WAIT(name, p, b, f) \ - struct page_wait_queue name = { \ - .page = p, \ - .bit = b, \ - .wait = { \ - .task = current, \ - .func = page_wake_function, \ - .flags = f, \ - .task_list = LIST_HEAD_INIT(name.wait.task_list),\ - }, \ - } - -#define DEFINE_PAGE_WAIT(name, p, b) __DEFINE_PAGE_WAIT(name, p, b, 0) -#define DEFINE_PAGE_WAIT_EXCLUSIVE(name, p, b) \ - __DEFINE_PAGE_WAIT(name, p, b, WQ_FLAG_EXCLUSIVE) - static wait_queue_head_t *page_waitqueue(struct page *page) { const struct zone *zone = page_zone(page); @@ -396,27 +362,16 @@ return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)]; } -static void wake_up_page(struct page *page) -{ - const unsigned int mode = TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE; - wait_queue_head_t *waitqueue = page_waitqueue(page); - - if (waitqueue_active(waitqueue)) - __wake_up(waitqueue, mode, 1, page); -} - void fastcall wait_on_page_bit(struct page *page, int bit_nr) { wait_queue_head_t *waitqueue = page_waitqueue(page); - DEFINE_PAGE_WAIT(wait, page, bit_nr); + DEFINE_WAIT_BIT(wait, &page->flags, bit_nr); - do { - prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); - if (test_bit(bit_nr, &page->flags)) { - sync_page(page); - io_schedule(); - } - } while (test_bit(bit_nr, &page->flags)); + prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); + if (test_bit(bit_nr, &page->flags)) { + sync_page(page); + io_schedule(); + } finish_wait(waitqueue, &wait.wait); } @@ -443,7 +398,7 @@ if (!TestClearPageLocked(page)) BUG(); smp_mb__after_clear_bit(); - wake_up_page(page); + __wake_up_bit(page_waitqueue(page), &page->flags, PG_locked); } EXPORT_SYMBOL(unlock_page); @@ -459,7 +414,7 @@ BUG(); smp_mb__after_clear_bit(); } - wake_up_page(page); + __wake_up_bit(page_waitqueue(page), &page->flags, PG_writeback); } EXPORT_SYMBOL(end_page_writeback); @@ -475,7 +430,7 @@ void fastcall __lock_page(struct page *page) { wait_queue_head_t *wqh = page_waitqueue(page); - DEFINE_PAGE_WAIT_EXCLUSIVE(wait, page, PG_locked); + DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); while (TestSetPageLocked(page)) { prepare_to_wait_exclusive(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-26 15:03:53.000000000 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-27 23:51:01.407138992 -0700 @@ -37,6 +37,16 @@ struct list_head task_list; }; +struct wait_bit_key { + void *flags; + int bit_nr; +}; + +struct wait_bit_queue { + struct wait_bit_key key; + wait_queue_t wait; +}; + struct __wait_queue_head { spinlock_t lock; struct list_head task_list; @@ -63,6 +73,9 @@ #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) +#define __WAIT_BIT_KEY_INITIALIZER(word, bit) \ + { .flags = word, .bit_nr = bit, } + static inline void init_waitqueue_head(wait_queue_head_t *q) { q->lock = SPIN_LOCK_UNLOCKED; @@ -125,6 +138,7 @@ void FASTCALL(__wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key)); extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode)); extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); +void FASTCALL(__wake_up_bit(wait_queue_head_t *, void *, int)); #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) @@ -277,6 +291,7 @@ wait_queue_t *wait, int state)); void FASTCALL(finish_wait(wait_queue_head_t *q, wait_queue_t *wait)); int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key); +int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key); #define DEFINE_WAIT(name) \ wait_queue_t name = { \ @@ -287,6 +302,17 @@ }, \ } +#define DEFINE_WAIT_BIT(name, word, bit) \ + struct wait_bit_queue name = { \ + .key = __WAIT_BIT_KEY_INITIALIZER(word, bit), \ + .wait = { \ + .task = current, \ + .func = wake_bit_function, \ + .task_list = \ + LIST_HEAD_INIT(name.wait.task_list), \ + }, \ + } + #define init_wait(wait) \ do { \ wait->task = current; \ ^ permalink raw reply [flat|nested] 60+ messages in thread
* [2/4] consolidate bit waiting code patterns 2004-08-28 9:20 ` William Lee Irwin III @ 2004-08-28 9:22 ` William Lee Irwin III 2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III ` (2 more replies) 0 siblings, 3 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:22 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel On Sat, Aug 28, 2004 at 02:20:40AM -0700, William Lee Irwin III wrote: > I didn't see very many apologies in x86-64 so I wasn't entirely sure > what those would consist of; void * and some minor commentary added. > Let me know if there's something more specific I should add comments > about. Consolidate bit waiting code patterns for page waitqueues using __wait_on_bit() and __wait_on_bit_lock(). Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-28 01:20:04.105925320 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 01:23:00.542102944 -0700 @@ -250,6 +250,40 @@ } EXPORT_SYMBOL(__wake_up_bit); +int __sched __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q, + void *word, + int bit, int (*wait)(void *), unsigned mode) +{ + int ret; + + prepare_to_wait(wq, &q->wait, mode); + if (test_bit(bit, word)) { + if ((ret = (*wait)(word))) + return ret; + } + finish_wait(wq, &q->wait); + return 0; +} +EXPORT_SYMBOL(__wait_on_bit); + +int __sched __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, + void *word, int bit, + int (*wait)(void *), unsigned mode) +{ + int ret; + + while (test_and_set_bit(bit, word)) { + prepare_to_wait_exclusive(wq, &q->wait, mode); + if (test_bit(bit, word)) { + if ((ret = (*wait)(word))) + return ret; + } + } + finish_wait(wq, &q->wait); + return 0; +} +EXPORT_SYMBOL(__wait_on_bit_lock); + void __init fork_init(unsigned long mempages) { #ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR Index: mm1-2.6.9-rc1/mm/filemap.c =================================================================== --- mm1-2.6.9-rc1.orig/mm/filemap.c 2004-08-28 01:19:28.658314176 -0700 +++ mm1-2.6.9-rc1/mm/filemap.c 2004-08-28 01:23:00.551101576 -0700 @@ -132,9 +132,11 @@ } EXPORT_SYMBOL(remove_from_page_cache); -static inline int sync_page(struct page *page) +static int sync_page(void *word) { struct address_space *mapping; + struct page *page + = container_of((page_flags_t *)word, struct page, flags); /* * FIXME, fercrissake. What is this barrier here for? @@ -142,7 +144,8 @@ smp_mb(); mapping = page_mapping(page); if (mapping && mapping->a_ops && mapping->a_ops->sync_page) - return mapping->a_ops->sync_page(page); + mapping->a_ops->sync_page(page); + io_schedule(); return 0; } @@ -362,19 +365,18 @@ return &zone->wait_table[hash_ptr(page, zone->wait_table_bits)]; } +static inline void wake_up_page(struct page *page, int bit) +{ + __wake_up_bit(page_waitqueue(page), &page->flags, bit); +} + void fastcall wait_on_page_bit(struct page *page, int bit_nr) { - wait_queue_head_t *waitqueue = page_waitqueue(page); DEFINE_WAIT_BIT(wait, &page->flags, bit_nr); - prepare_to_wait(waitqueue, &wait.wait, TASK_UNINTERRUPTIBLE); - if (test_bit(bit_nr, &page->flags)) { - sync_page(page); - io_schedule(); - } - finish_wait(waitqueue, &wait.wait); + __wait_on_bit(page_waitqueue(page), &wait, wait.key.flags, + bit_nr, sync_page, TASK_UNINTERRUPTIBLE); } - EXPORT_SYMBOL(wait_on_page_bit); /** @@ -398,7 +400,7 @@ if (!TestClearPageLocked(page)) BUG(); smp_mb__after_clear_bit(); - __wake_up_bit(page_waitqueue(page), &page->flags, PG_locked); + wake_up_page(page, PG_locked); } EXPORT_SYMBOL(unlock_page); @@ -414,7 +416,7 @@ BUG(); smp_mb__after_clear_bit(); } - __wake_up_bit(page_waitqueue(page), &page->flags, PG_writeback); + wake_up_page(page, PG_writeback); } EXPORT_SYMBOL(end_page_writeback); @@ -429,19 +431,11 @@ */ void fastcall __lock_page(struct page *page) { - wait_queue_head_t *wqh = page_waitqueue(page); DEFINE_WAIT_BIT(wait, &page->flags, PG_locked); - while (TestSetPageLocked(page)) { - prepare_to_wait_exclusive(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (PageLocked(page)) { - sync_page(page); - io_schedule(); - } - } - finish_wait(wqh, &wait.wait); + __wait_on_bit_lock(page_waitqueue(page), &wait, wait.key.flags, + PG_locked, sync_page, TASK_UNINTERRUPTIBLE); } - EXPORT_SYMBOL(__lock_page); /* Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-27 23:51:01.407138992 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-28 01:23:00.554101120 -0700 @@ -139,6 +139,8 @@ extern void FASTCALL(__wake_up_locked(wait_queue_head_t *q, unsigned int mode)); extern void FASTCALL(__wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr)); void FASTCALL(__wake_up_bit(wait_queue_head_t *, void *, int)); +int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); +int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) ^ permalink raw reply [flat|nested] 60+ messages in thread
* [3/4] eliminate bh waitqueue hashtable 2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III @ 2004-08-28 9:23 ` William Lee Irwin III 2004-08-28 9:24 ` [4/4] eliminate inode " William Lee Irwin III 2004-08-28 9:43 ` [3/4] eliminate bh " Andrew Morton 2004-08-28 9:34 ` [2/4] consolidate bit waiting code patterns Andrew Morton 2004-08-28 9:39 ` Andrew Morton 2 siblings, 2 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:23 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel On Sat, Aug 28, 2004 at 02:22:10AM -0700, William Lee Irwin III wrote: > Consolidate bit waiting code patterns for page waitqueues using > __wait_on_bit() and __wait_on_bit_lock(). Eliminate the bh waitqueue hashtable using bit_waitqueue() via wait_on_bit() and wake_up_bit() to locate the waitqueue head associated with a bit. Index: mm1-2.6.9-rc1/fs/buffer.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/buffer.c 2004-08-27 23:50:07.644312184 -0700 +++ mm1-2.6.9-rc1/fs/buffer.c 2004-08-28 01:23:05.396364984 -0700 @@ -43,14 +43,6 @@ #define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) -/* - * Hashed waitqueue_head's for wait_on_buffer() - */ -#define BH_WAIT_TABLE_ORDER 7 -static struct bh_wait_queue_head { - wait_queue_head_t wqh; -} ____cacheline_aligned_in_smp bh_wait_queue_heads[1<<BH_WAIT_TABLE_ORDER]; - inline void init_buffer(struct buffer_head *bh, bh_end_io_t *handler, void *private) { @@ -58,49 +50,31 @@ bh->b_private = private; } -/* - * Return the address of the waitqueue_head to be used for this - * buffer_head - */ -wait_queue_head_t *bh_waitq_head(struct buffer_head *bh) -{ - return &bh_wait_queue_heads[hash_ptr(bh, BH_WAIT_TABLE_ORDER)].wqh; -} -EXPORT_SYMBOL(bh_waitq_head); - void wake_up_buffer(struct buffer_head *bh) { - wait_queue_head_t *wq = bh_waitq_head(bh); - smp_mb(); - __wake_up_bit(wq, &bh->b_state, BH_Lock); + wake_up_bit(&bh->b_state, BH_Lock); } EXPORT_SYMBOL(wake_up_buffer); -static void sync_buffer(struct buffer_head *bh) +static int sync_buffer(void *word) { struct block_device *bd; + struct buffer_head *bh + = container_of(word, struct buffer_head, b_state); smp_mb(); bd = bh->b_bdev; if (bd) blk_run_address_space(bd->bd_inode->i_mapping); + io_schedule(); + return 0; } void fastcall __lock_buffer(struct buffer_head *bh) { - wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - - do { - prepare_to_wait_exclusive(wqh, &wait.wait, - TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - } while (test_set_buffer_locked(bh)); - finish_wait(wqh, &wait.wait); + wait_on_bit_lock(&bh->b_state, BH_Lock, sync_buffer, + TASK_UNINTERRUPTIBLE); } EXPORT_SYMBOL(__lock_buffer); @@ -118,15 +92,7 @@ */ void __wait_on_buffer(struct buffer_head * bh) { - wait_queue_head_t *wqh = bh_waitq_head(bh); - DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); - - prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); - if (buffer_locked(bh)) { - sync_buffer(bh); - io_schedule(); - } - finish_wait(wqh, &wait.wait); + wait_on_bit(&bh->b_state, BH_Lock, sync_buffer, TASK_UNINTERRUPTIBLE); } static void @@ -3096,14 +3062,11 @@ void __init buffer_init(void) { - int i; int nrpages; bh_cachep = kmem_cache_create("buffer_head", sizeof(struct buffer_head), 0, SLAB_PANIC, init_buffer_head, NULL); - for (i = 0; i < ARRAY_SIZE(bh_wait_queue_heads); i++) - init_waitqueue_head(&bh_wait_queue_heads[i].wqh); /* * Limit the bh occupancy to 10% of ZONE_NORMAL Index: mm1-2.6.9-rc1/fs/jbd/transaction.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/jbd/transaction.c 2004-08-26 15:03:31.000000000 -0700 +++ mm1-2.6.9-rc1/fs/jbd/transaction.c 2004-08-28 01:23:05.404363768 -0700 @@ -633,21 +633,21 @@ * disk then we cannot do copy-out here. */ if (jh->b_jlist == BJ_Shadow) { - wait_queue_head_t *wqh; - DEFINE_WAIT(wait); + DEFINE_WAIT_BIT(wait, &bh->b_state, BH_Lock); + wait_queue_head_t *wqh + = bit_waitqueue(&bh->b_state, BH_Lock); JBUFFER_TRACE(jh, "on shadow: sleep"); jbd_unlock_bh_state(bh); /* commit wakes up all shadow buffers after IO */ - wqh = bh_waitq_head(bh); for ( ; ; ) { - prepare_to_wait(wqh, &wait, + prepare_to_wait(wqh, &wait.wait, TASK_UNINTERRUPTIBLE); if (jh->b_jlist != BJ_Shadow) break; schedule(); } - finish_wait(wqh, &wait); + finish_wait(wqh, &wait.wait); goto repeat; } Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-28 01:23:00.542102944 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 01:23:05.410362856 -0700 @@ -40,6 +40,7 @@ #include <linux/audit.h> #include <linux/profile.h> #include <linux/rmap.h> +#include <linux/hash.h> #include <asm/pgtable.h> #include <asm/pgalloc.h> @@ -242,6 +243,16 @@ } EXPORT_SYMBOL(wake_bit_function); +wait_queue_head_t * fastcall bit_waitqueue(void *word, int bit) +{ + const int shift = BITS_PER_LONG == 32 ? 5 : 6; + const struct zone *zone = page_zone(virt_to_page(word)); + unsigned long val = (unsigned long)word << shift | bit; + + return &zone->wait_table[hash_long(val, zone->wait_table_bits)]; +} +EXPORT_SYMBOL(bit_waitqueue); + void fastcall __wake_up_bit(wait_queue_head_t *wq, void *word, int bit) { struct wait_bit_key key = __WAIT_BIT_KEY_INITIALIZER(word, bit); Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-28 01:23:00.554101120 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-28 01:44:13.448591744 -0700 @@ -24,6 +24,7 @@ #include <linux/stddef.h> #include <linux/spinlock.h> #include <asm/system.h> +#include <asm/current.h> typedef struct __wait_queue wait_queue_t; typedef int (*wait_queue_func_t)(wait_queue_t *wait, unsigned mode, int sync, void *key); @@ -141,6 +142,22 @@ void FASTCALL(__wake_up_bit(wait_queue_head_t *, void *, int)); int FASTCALL(__wait_on_bit(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); int FASTCALL(__wait_on_bit_lock(wait_queue_head_t *, struct wait_bit_queue *, void *, int, int (*)(void *), unsigned)); +wait_queue_head_t *FASTCALL(bit_waitqueue(void *, int)); + +/** + * wake_up_bit - wake up a waiter on a bit + * @word: the word being waited on, a kernel virtual address + * @bit: the bit of the word being waited on + * + * There is a standard hashed waitqueue table for generic use. This + * is the part of the hashtable's accessor API that wakes up waiters + * on a bit. For instance, if one were to have waiters on a bitflag, + * one would call wake_up_bit() after clearing the bit. + */ +static inline void wake_up_bit(void *word, int bit) +{ + __wake_up_bit(bit_waitqueue(word, bit), word, bit); +} #define wake_up(x) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, 1, NULL) #define wake_up_nr(x, nr) __wake_up(x, TASK_UNINTERRUPTIBLE | TASK_INTERRUPTIBLE, nr, NULL) @@ -321,6 +338,54 @@ wait->func = autoremove_wake_function; \ INIT_LIST_HEAD(&wait->task_list); \ } while (0) + +/** + * wait_on_bit - wait for a bit to be cleared + * @word: the word being waited on, a kernel virtual address + * @bit: the bit of the word being waited on + * @wait: the function used to sleep, which may take special actions + * @mode: the task state to sleep in + * + * There is a standard hashed waitqueue table for generic use. This + * is the part of the hashtable's accessor API that waits on a bit. + * For instance, if one were to have waiters on a bitflag, one would + * call wait_on_bit() in threads waiting for the bit to clear. + * One uses wait_on_bit() where one is waiting for the bit to clear, + * but has no intention of setting it. + */ +static inline int wait_on_bit(void *word, int bit, + int (*wait)(void *), unsigned mode) +{ + DEFINE_WAIT_BIT(q, word, bit); + wait_queue_head_t *wqh = bit_waitqueue(word, bit); + + return __wait_on_bit(wqh, &q, word, bit, wait, mode); +} + +/** + * wait_on_bit_lock - wait for a bit to be cleared, when wanting to set it + * @word: the word being waited on, a kernel virtual address + * @bit: the bit of the word being waited on + * @wait: the function used to sleep, which may take special actions + * @mode: the task state to sleep in + * + * There is a standard hashed waitqueue table for generic use. This + * is the part of the hashtable's accessor API that waits on a bit + * when one intends to set it, for instance, trying to lock bitflags. + * For instance, if one were to have waiters trying to set bitflag + * and waiting for it to clear before setting it, one would call + * wait_on_bit() in threads waiting to be able to set the bit. + * One uses wait_on_bit_lock() where one is waiting for the bit to + * clear with the intention of setting it, and when done, clearing it. + */ +static inline int wait_on_bit_lock(void *word, int bit, + int (*wait)(void *), unsigned mode) +{ + DEFINE_WAIT_BIT(q, word, bit); + wait_queue_head_t *wqh = bit_waitqueue(word, bit); + + return __wait_on_bit_lock(wqh, &q, word, bit, wait, mode); +} #endif /* __KERNEL__ */ ^ permalink raw reply [flat|nested] 60+ messages in thread
* [4/4] eliminate inode waitqueue hashtable 2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III @ 2004-08-28 9:24 ` William Lee Irwin III 2004-08-28 9:43 ` [3/4] eliminate bh " Andrew Morton 1 sibling, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:24 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel On Sat, Aug 28, 2004 at 02:23:37AM -0700, William Lee Irwin III wrote: > Eliminate the bh waitqueue hashtable using bit_waitqueue() via > wait_on_bit() and wake_up_bit() to locate the waitqueue head associated > with a bit. Eliminate the inode waitqueue hashtable using bit_waitqueue() via wait_on_bit() and wake_up_bit() to locate the waitqueue head associated with a bit. Index: mm1-2.6.9-rc1/fs/inode.c =================================================================== --- mm1-2.6.9-rc1.orig/fs/inode.c 2004-08-26 15:04:02.000000000 -0700 +++ mm1-2.6.9-rc1/fs/inode.c 2004-08-27 22:15:43.602377440 -0700 @@ -1257,37 +1257,17 @@ #endif -/* - * Hashed waitqueues for wait_on_inode(). The table is pretty small - the - * kernel doesn't lock many inodes at the same time. - */ -#define I_WAIT_TABLE_ORDER 3 -static struct i_wait_queue_head { - wait_queue_head_t wqh; -} ____cacheline_aligned_in_smp i_wait_queue_heads[1<<I_WAIT_TABLE_ORDER]; +#define __I_LOCK 3 -/* - * Return the address of the waitqueue_head to be used for this inode - */ -static wait_queue_head_t *i_waitq_head(struct inode *inode) +static int inode_wait(void *word) { - return &i_wait_queue_heads[hash_ptr(inode, I_WAIT_TABLE_ORDER)].wqh; + schedule(); + return 0; } void __wait_on_inode(struct inode *inode) { - DECLARE_WAITQUEUE(wait, current); - wait_queue_head_t *wq = i_waitq_head(inode); - - add_wait_queue(wq, &wait); -repeat: - set_current_state(TASK_UNINTERRUPTIBLE); - if (inode->i_state & I_LOCK) { - schedule(); - goto repeat; - } - remove_wait_queue(wq, &wait); - __set_current_state(TASK_RUNNING); + wait_on_bit(&inode->i_state, __I_LOCK, inode_wait, TASK_UNINTERRUPTIBLE); } /* @@ -1305,27 +1285,23 @@ */ static void __wait_on_freeing_inode(struct inode *inode) { - DECLARE_WAITQUEUE(wait, current); - wait_queue_head_t *wq = i_waitq_head(inode); + wait_queue_head_t *wq = bit_waitqueue(&inode->i_state, __I_LOCK); + DEFINE_WAIT_BIT(wait, &inode->i_state, __I_LOCK); - add_wait_queue(wq, &wait); - set_current_state(TASK_UNINTERRUPTIBLE); + prepare_to_wait(wq, &wait.wait, TASK_UNINTERRUPTIBLE); spin_unlock(&inode_lock); schedule(); - remove_wait_queue(wq, &wait); + finish_wait(wq, &wait.wait); spin_lock(&inode_lock); } void wake_up_inode(struct inode *inode) { - wait_queue_head_t *wq = i_waitq_head(inode); - /* * Prevent speculative execution through spin_unlock(&inode_lock); */ smp_mb(); - if (waitqueue_active(wq)) - wake_up_all(wq); + wake_up_bit(&inode->i_state, __I_LOCK); } EXPORT_SYMBOL(wake_up_inode); @@ -1361,11 +1337,6 @@ void __init inode_init(unsigned long mempages) { - int i; - - for (i = 0; i < ARRAY_SIZE(i_wait_queue_heads); i++) - init_waitqueue_head(&i_wait_queue_heads[i].wqh); - /* inode slab cache */ inode_cachep = kmem_cache_create("inode_cache", sizeof(struct inode), 0, SLAB_PANIC, init_once, NULL); ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [3/4] eliminate bh waitqueue hashtable 2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III 2004-08-28 9:24 ` [4/4] eliminate inode " William Lee Irwin III @ 2004-08-28 9:43 ` Andrew Morton 1 sibling, 0 replies; 60+ messages in thread From: Andrew Morton @ 2004-08-28 9:43 UTC (permalink / raw) To: William Lee Irwin III; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: > > +static inline int wait_on_bit(void *word, int bit, > + int (*wait)(void *), unsigned mode) > +{ > + DEFINE_WAIT_BIT(q, word, bit); > + wait_queue_head_t *wqh = bit_waitqueue(word, bit); > + > + return __wait_on_bit(wqh, &q, word, bit, wait, mode); > +} It worries me a bit (sic) that we're calling the relatively expensive bit_waitqueue() even if the bit is not set. Maybe it should be static inline int wait_on_bit(...) { if (test_bit(...)) out_of_line_wait_on_bit(...); } ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [2/4] consolidate bit waiting code patterns 2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III 2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III @ 2004-08-28 9:34 ` Andrew Morton 2004-08-28 9:51 ` William Lee Irwin III 2004-08-28 9:39 ` Andrew Morton 2 siblings, 1 reply; 60+ messages in thread From: Andrew Morton @ 2004-08-28 9:34 UTC (permalink / raw) To: William Lee Irwin III; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: > > +int __sched __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, > + void *word, int bit, > + int (*wait)(void *), unsigned mode) > +{ > + int ret; > + > + while (test_and_set_bit(bit, word)) { > + prepare_to_wait_exclusive(wq, &q->wait, mode); > + if (test_bit(bit, word)) { > + if ((ret = (*wait)(word))) > + return ret; > + } > + } > + finish_wait(wq, &q->wait); > + return 0; > +} Some comments over this thing would be nice. The `wait' argument seems to be misnamed. It typically points at sync_page(), yes? Maybe it should be called `action' or `kick' or something. If (*wait)() returns non-zero then it looks to me like the callers will get confused, thinking that the page did come unlocked? If (*wait)() returns non-zero then we need to run finish_wait(), no? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [2/4] consolidate bit waiting code patterns 2004-08-28 9:34 ` [2/4] consolidate bit waiting code patterns Andrew Morton @ 2004-08-28 9:51 ` William Lee Irwin III 0 siblings, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:51 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel On Sat, Aug 28, 2004 at 02:34:36AM -0700, Andrew Morton wrote: > Some comments over this thing would be nice. > The `wait' argument seems to be misnamed. It typically points at > sync_page(), yes? Maybe it should be called `action' or `kick' or > something. > If (*wait)() returns non-zero then it looks to me like the callers will get > confused, thinking that the page did come unlocked? > If (*wait)() returns non-zero then we need to run finish_wait(), no? You're right, that should be a break; and return ret; with ret initialized to 0. Mysteriously, I never hit this even in combination testing with aio. Index: mm1-2.6.9-rc1/kernel/fork.c =================================================================== --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-28 01:23:05.410362856 -0700 +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 02:47:05.712120520 -0700 @@ -261,37 +261,40 @@ } EXPORT_SYMBOL(__wake_up_bit); +/* + * To allow interruptible waiting and asynchronous (i.e. nonblocking) + * waiting, the actions of __wait_on_bit() and __wait_on_bit_lock() are + * permitted return codes. Nonzero return codes halt waiting and return. + */ int __sched __wait_on_bit(wait_queue_head_t *wq, struct wait_bit_queue *q, void *word, - int bit, int (*wait)(void *), unsigned mode) + int bit, int (*action)(void *), unsigned mode) { - int ret; + int ret = 0; prepare_to_wait(wq, &q->wait, mode); - if (test_bit(bit, word)) { - if ((ret = (*wait)(word))) - return ret; - } + if (test_bit(bit, word)) + ret = (*action)(word); finish_wait(wq, &q->wait); - return 0; + return ret; } EXPORT_SYMBOL(__wait_on_bit); int __sched __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q, void *word, int bit, - int (*wait)(void *), unsigned mode) + int (*action)(void *), unsigned mode) { - int ret; + int ret = 0; while (test_and_set_bit(bit, word)) { prepare_to_wait_exclusive(wq, &q->wait, mode); if (test_bit(bit, word)) { - if ((ret = (*wait)(word))) - return ret; + if ((ret = (*action)(word))) + break; } } finish_wait(wq, &q->wait); - return 0; + return ret; } EXPORT_SYMBOL(__wait_on_bit_lock); Index: mm1-2.6.9-rc1/include/linux/wait.h =================================================================== --- mm1-2.6.9-rc1.orig/include/linux/wait.h 2004-08-28 01:44:13.448591744 -0700 +++ mm1-2.6.9-rc1/include/linux/wait.h 2004-08-28 02:45:22.458817408 -0700 @@ -343,7 +343,7 @@ * wait_on_bit - wait for a bit to be cleared * @word: the word being waited on, a kernel virtual address * @bit: the bit of the word being waited on - * @wait: the function used to sleep, which may take special actions + * @action: the function used to sleep, which may take special actions * @mode: the task state to sleep in * * There is a standard hashed waitqueue table for generic use. This @@ -354,19 +354,19 @@ * but has no intention of setting it. */ static inline int wait_on_bit(void *word, int bit, - int (*wait)(void *), unsigned mode) + int (*action)(void *), unsigned mode) { DEFINE_WAIT_BIT(q, word, bit); wait_queue_head_t *wqh = bit_waitqueue(word, bit); - return __wait_on_bit(wqh, &q, word, bit, wait, mode); + return __wait_on_bit(wqh, &q, word, bit, action, mode); } /** * wait_on_bit_lock - wait for a bit to be cleared, when wanting to set it * @word: the word being waited on, a kernel virtual address * @bit: the bit of the word being waited on - * @wait: the function used to sleep, which may take special actions + * @action: the function used to sleep, which may take special actions * @mode: the task state to sleep in * * There is a standard hashed waitqueue table for generic use. This @@ -379,12 +379,12 @@ * clear with the intention of setting it, and when done, clearing it. */ static inline int wait_on_bit_lock(void *word, int bit, - int (*wait)(void *), unsigned mode) + int (*action)(void *), unsigned mode) { DEFINE_WAIT_BIT(q, word, bit); wait_queue_head_t *wqh = bit_waitqueue(word, bit); - return __wait_on_bit_lock(wqh, &q, word, bit, wait, mode); + return __wait_on_bit_lock(wqh, &q, word, bit, action, mode); } #endif /* __KERNEL__ */ ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [2/4] consolidate bit waiting code patterns 2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III 2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III 2004-08-28 9:34 ` [2/4] consolidate bit waiting code patterns Andrew Morton @ 2004-08-28 9:39 ` Andrew Morton 2004-08-28 9:51 ` William Lee Irwin III 2 siblings, 1 reply; 60+ messages in thread From: Andrew Morton @ 2004-08-28 9:39 UTC (permalink / raw) To: William Lee Irwin III; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: > > --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-28 01:20:04.105925320 -0700 > +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 01:23:00.542102944 -0700 Sorry, but I think we might as well dtrt here and move all this waity code into kernel/wait.c - it's silly keeping it in fork.c. And logically, that should be patch #1 of N. ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [2/4] consolidate bit waiting code patterns 2004-08-28 9:39 ` Andrew Morton @ 2004-08-28 9:51 ` William Lee Irwin III 0 siblings, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:51 UTC (permalink / raw) To: Andrew Morton; +Cc: oleg, linux-kernel William Lee Irwin III <wli@holomorphy.com> wrote: >> --- mm1-2.6.9-rc1.orig/kernel/fork.c 2004-08-28 01:20:04.105925320 -0700 >> +++ mm1-2.6.9-rc1/kernel/fork.c 2004-08-28 01:23:00.542102944 -0700 On Sat, Aug 28, 2004 at 02:39:09AM -0700, Andrew Morton wrote: > Sorry, but I think we might as well dtrt here and move all this waity code > into kernel/wait.c - it's silly keeping it in fork.c. > And logically, that should be patch #1 of N. Okay, that and the test_bit() before calling bit_waitqueue() will take a few minutes to do. -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III 2004-08-28 5:35 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III 2004-08-28 6:17 ` [1/4] standardize bit waiting data type Andrew Morton @ 2004-08-28 9:18 ` Christoph Hellwig 2004-08-28 9:20 ` William Lee Irwin III 2 siblings, 1 reply; 60+ messages in thread From: Christoph Hellwig @ 2004-08-28 9:18 UTC (permalink / raw) To: William Lee Irwin III, Andrew Morton, Oleg Nesterov, linux-kernel Why __wkae_up_bit, not wake_up_bit? ^ permalink raw reply [flat|nested] 60+ messages in thread
* Re: [1/4] standardize bit waiting data type 2004-08-28 9:18 ` [1/4] standardize bit waiting data type Christoph Hellwig @ 2004-08-28 9:20 ` William Lee Irwin III 0 siblings, 0 replies; 60+ messages in thread From: William Lee Irwin III @ 2004-08-28 9:20 UTC (permalink / raw) To: Christoph Hellwig, Andrew Morton, Oleg Nesterov, linux-kernel On Sat, Aug 28, 2004 at 10:18:49AM +0100, Christoph Hellwig wrote: > Why __wkae_up_bit, not wake_up_bit? A wake_up_bit() meant to be used more generally is added later in the series. -- wli ^ permalink raw reply [flat|nested] 60+ messages in thread
* [patch] 2.6.9-rc1-mm1: megaraid_mbox.c compile error with gcc 3.4 2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton ` (7 preceding siblings ...) 2004-08-28 5:26 ` [0/4] standardized waitqueue hashing William Lee Irwin III @ 2004-08-28 9:06 ` Adrian Bunk 8 siblings, 0 replies; 60+ messages in thread From: Adrian Bunk @ 2004-08-28 9:06 UTC (permalink / raw) To: Andrew Morton, Atul.Mukker, Sreenivas.Bagalkote, Manoj.Jose Cc: linux-kernel, James.Bottomley, linux-scsi On Thu, Aug 26, 2004 at 01:47:45AM -0700, Andrew Morton wrote: >... > All patches: >... > bk-scsi.patch >... This results in many compile errors when using gcc 3.4 starting with the following: <-- snip --> ... CC drivers/scsi/megaraid/megaraid_mbox.o drivers/scsi/megaraid/megaraid_mbox.c: In function `megaraid_queue_command': drivers/scsi/megaraid/megaraid_mbox.c:114: sorry, unimplemented: inlining failed in call to 'megaraid_mbox_build_cmd': function body not available drivers/scsi/megaraid/megaraid_mbox.c:1410: sorry, unimplemented: called from here drivers/scsi/megaraid/megaraid_mbox.c:123: sorry, unimplemented: inlining failed in call to 'megaraid_mbox_runpendq': function body not available drivers/scsi/megaraid/megaraid_mbox.c:1413: sorry, unimplemented: called from here make[3]: *** [drivers/scsi/megaraid/megaraid_mbox.o] Error 1 <-- snip --> The patch fixes this by removing the inline's from all functions where the inline function was called before it was defined. An alterenate approach would be to reorder the file to move all inline'd functions above their first callers. diffstat output: drivers/scsi/megaraid/megaraid_mbox.c | 44 +++++++++++++------------- 1 files changed, 22 insertions(+), 22 deletions(-) Signed-off-by: Adrian Bunk <bunk@fs.tum.de> --- linux-2.6.9-rc1-mm1-full-3.4/drivers/scsi/megaraid/megaraid_mbox.c.old 2004-08-28 10:21:20.000000000 +0200 +++ linux-2.6.9-rc1-mm1-full-3.4/drivers/scsi/megaraid/megaraid_mbox.c 2004-08-28 10:31:23.000000000 +0200 @@ -110,26 +110,26 @@ static int megaraid_queue_command(struct scsi_cmnd *, void (*)(struct scsi_cmnd *)); -static inline scb_t *megaraid_mbox_build_cmd(adapter_t *, struct scsi_cmnd *, +static scb_t *megaraid_mbox_build_cmd(adapter_t *, struct scsi_cmnd *, int *); -static inline scb_t *megaraid_alloc_scb(adapter_t *, struct scsi_cmnd *); -static inline void megaraid_dealloc_scb(adapter_t *, scb_t *); -static inline void megaraid_mbox_prepare_pthru(adapter_t *, scb_t *, +static scb_t *megaraid_alloc_scb(adapter_t *, struct scsi_cmnd *); +static void megaraid_dealloc_scb(adapter_t *, scb_t *); +static void megaraid_mbox_prepare_pthru(adapter_t *, scb_t *, struct scsi_cmnd *); -static inline void megaraid_mbox_prepare_epthru(adapter_t *, scb_t *, +static void megaraid_mbox_prepare_epthru(adapter_t *, scb_t *, struct scsi_cmnd *); -static inline int megaraid_mbox_mksgl(adapter_t *, scb_t *); +static int megaraid_mbox_mksgl(adapter_t *, scb_t *); -static inline void megaraid_mbox_runpendq(adapter_t *, scb_t *); -static inline int mbox_post_cmd(adapter_t *, scb_t *); +static void megaraid_mbox_runpendq(adapter_t *, scb_t *); +static int mbox_post_cmd(adapter_t *, scb_t *); static void megaraid_mbox_dpc(unsigned long); -static inline void megaraid_mbox_sync_scb(adapter_t *, scb_t *); +static void megaraid_mbox_sync_scb(adapter_t *, scb_t *); static irqreturn_t megaraid_isr(int, void *, struct pt_regs *); -static inline int megaraid_ack_sequence(adapter_t *); +static int megaraid_ack_sequence(adapter_t *); -static inline int megaraid_busywait_mbox(mraid_device_t *); +static int megaraid_busywait_mbox(mraid_device_t *); static int megaraid_cmm_register(adapter_t *); static int megaraid_cmm_unregister(adapter_t *); @@ -1434,7 +1434,7 @@ * convert the command issued by mid-layer to format understood by megaraid * firmware. We also complete certain command without sending them to firmware */ -static inline scb_t * +static scb_t * megaraid_mbox_build_cmd(adapter_t *adapter, struct scsi_cmnd *scp, int *busy) { mraid_device_t *rdev = ADAP2RAIDDEV(adapter); @@ -1809,7 +1809,7 @@ * return the scb from the head of the free list. NULL if there are none * available **/ -static inline scb_t * +static scb_t * megaraid_alloc_scb(adapter_t *adapter, struct scsi_cmnd *scp) { struct list_head *head = &adapter->kscb_pool; @@ -1847,7 +1847,7 @@ * NOTE NOTE: Make sure the scb is not on any list before calling this * routine. **/ -static inline void +static void megaraid_dealloc_scb(adapter_t *adapter, scb_t *scb) { unsigned long flags; @@ -1873,7 +1873,7 @@ * * prepare a command for the scsi physical devices */ -static inline void +static void megaraid_mbox_prepare_pthru(adapter_t *adapter, scb_t *scb, struct scsi_cmnd *scp) { @@ -1921,7 +1921,7 @@ * prepare a command for the scsi physical devices. This rountine prepares * commands for devices which can take extended CDBs (>10 bytes) */ -static inline void +static void megaraid_mbox_prepare_epthru(adapter_t *adapter, scb_t *scb, struct scsi_cmnd *scp) { @@ -1967,7 +1967,7 @@ * * prepare the scatter-gather list */ -static inline int +static int megaraid_mbox_mksgl(adapter_t *adapter, scb_t *scb) { struct scatterlist *sgl; @@ -2046,7 +2046,7 @@ * out from the head of the pending list. If it is successfully issued, the * next SCB is at the head now. */ -static inline void +static void megaraid_mbox_runpendq(adapter_t *adapter, scb_t *scb_q) { scb_t *scb; @@ -2116,7 +2116,7 @@ * * post the command to the controller if mailbox is availble. */ -static inline int +static int mbox_post_cmd(adapter_t *adapter, scb_t *scb) { mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter); @@ -2218,7 +2218,7 @@ * * Returns: 1 if the interrupt is valid, 0 otherwise */ -static inline int +static int megaraid_ack_sequence(adapter_t *adapter) { mraid_device_t *raid_dev = ADAP2RAIDDEV(adapter); @@ -2556,7 +2556,7 @@ * * DMA sync if required. */ -static inline void +static void megaraid_mbox_sync_scb(adapter_t *adapter, scb_t *scb) { mbox_ccb_t *ccb; @@ -3069,7 +3069,7 @@ * wait until the controller's mailbox is available to accept more commands. * wait for at most 1 second */ -static inline int +static int megaraid_busywait_mbox(mraid_device_t *raid_dev) { mbox_t *mbox = raid_dev->mbox; ^ permalink raw reply [flat|nested] 60+ messages in thread
end of thread, other threads:[~2004-09-08 12:02 UTC | newest]
Thread overview: 60+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-26 8:47 2.6.9-rc1-mm1 Andrew Morton
2004-08-26 11:07 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 14:28 ` 2.6.9-rc1-mm1 Jurriaan
2004-08-26 18:25 ` 2.6.9-rc1-mm1 Thomas Davis
2004-08-26 14:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 14:45 ` 2.6.9-rc1-mm1 Felipe Alfaro Solana
2004-08-26 15:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 16:38 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 20:36 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 20:55 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-26 23:19 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-26 23:43 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 0:37 ` 2.6.9-rc1-mm1 Nuno Silva
2004-08-27 0:46 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-27 0:51 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 0:55 ` 2.6.9-rc1-mm1 Con Kolivas
2004-08-27 0:58 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-08-27 20:54 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-27 21:54 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-08-27 22:29 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-09-03 21:11 ` schedstat-2.6.8.1 [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki
2004-09-08 7:09 ` Rick Lindsley
2004-09-04 18:35 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-09-08 8:10 ` 2.6.9-rc1-mm1 Rick Lindsley
2004-09-04 23:10 ` latency.c [was: Re: 2.6.9-rc1-mm1] Rafael J. Wysocki
2004-09-08 8:12 ` Rick Lindsley
2004-09-08 12:02 ` Rafael J. Wysocki
2004-08-26 20:51 ` 2.6.9-rc1-mm1 Martin J. Bligh
2004-08-27 1:43 ` 2.6.9-rc1-mm1 Nick Piggin
2004-08-26 12:06 ` 2.6.9-rc1-mm1 Denis Vlasenko
2004-08-26 19:40 ` 2.6.9-rc1-mm1 Sam Ravnborg
2004-08-26 17:58 ` 2.6.9-rc1-mm1 (compile stats) John Cherry
2004-08-26 18:53 ` 2.6.9-rc1-mm1 - undefined references - [PATCH] Paolo Ornati
2004-08-28 8:54 ` Adrian Bunk
2004-08-28 9:45 ` Paolo Ornati
2004-08-26 22:46 ` 2.6.9-rc1-mm1 Rafael J. Wysocki
2004-08-26 22:50 ` 2.6.9-rc1-mm1 Andrew Morton
2004-08-26 23:53 ` 2.6.9-rc1-mm1 Tomasz Torcz
[not found] ` <20040827043132.GJ2793@holomorphy.com>
2004-08-27 21:42 ` 2.6.9-rc1-mm1 William Lee Irwin III
2004-08-28 5:26 ` [0/4] standardized waitqueue hashing William Lee Irwin III
2004-08-28 5:31 ` [1/4] standardize bit waiting data type William Lee Irwin III
2004-08-28 5:35 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III
2004-08-28 5:37 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III
2004-08-28 5:38 ` [4/4] eliminate inode " William Lee Irwin III
2004-08-28 6:17 ` [1/4] standardize bit waiting data type Andrew Morton
2004-08-28 6:34 ` William Lee Irwin III
2004-08-28 6:40 ` Andrew Morton
2004-08-28 6:48 ` William Lee Irwin III
2004-08-28 9:20 ` William Lee Irwin III
2004-08-28 9:22 ` [2/4] consolidate bit waiting code patterns William Lee Irwin III
2004-08-28 9:23 ` [3/4] eliminate bh waitqueue hashtable William Lee Irwin III
2004-08-28 9:24 ` [4/4] eliminate inode " William Lee Irwin III
2004-08-28 9:43 ` [3/4] eliminate bh " Andrew Morton
2004-08-28 9:34 ` [2/4] consolidate bit waiting code patterns Andrew Morton
2004-08-28 9:51 ` William Lee Irwin III
2004-08-28 9:39 ` Andrew Morton
2004-08-28 9:51 ` William Lee Irwin III
2004-08-28 9:18 ` [1/4] standardize bit waiting data type Christoph Hellwig
2004-08-28 9:20 ` William Lee Irwin III
2004-08-28 9:06 ` [patch] 2.6.9-rc1-mm1: megaraid_mbox.c compile error with gcc 3.4 Adrian Bunk
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox