public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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, &param);
+	sys_sched_setscheduler(current->pid, SCHED_RR, &param);
 
 	atomic_set(&stopmachine_thread_ack, 0);


^ permalink raw reply	[flat|nested] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ messages in thread

* 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ messages in thread

* RE: 2.6.9-rc1-mm1
@ 2004-08-28 14:14 Sid Boyce
  2004-08-28 15:22 ` 2.6.9-rc1-mm1 Hugh Dickins
  0 siblings, 1 reply; 62+ messages in thread
From: Sid Boyce @ 2004-08-28 14:14 UTC (permalink / raw)
  To: linux-kernel

My previous post details the problem with KDE I had on 2.6.9-rc1, 
2.6.9-rc1-mm1 fixed that.
I get hangs with 2.6.9-rc1-mm1 if ACPI or APM are enabled. I haven't 
tried console=ttyS1 to see if there is an oops, but from previous 
experiences also posted, they are probably being generated.
One other problem is that trying to rebuild a 2.6.9-rc1-mm1 kernel under 
2.6.9-rc1-mm1 fails, once as shown below and once elsewhere in fs/. I 
have to boot 2.6.8-rc4-mm1 in order to build 2.6.9-rc1-mm1. Asus A7N8X-E 
nForce2 chipset, Version: ASUS A7N8X-E Deluxe ACPI BIOS Rev 1011, SuSE 
9.1. Upgrading to 1012 shortly.
fs/.tmp_open.o: could not read symbols: File truncated
make[1]: *** [fs/open.o] Error 1
make: *** [fs] Error 2
barrabas:/usr/src/linux-2.6.9-rc1-mm1 # l fs/.tmp_open.o
-rw-r--r--  1 root root 114688 2004-08-27 01:01 fs/.tmp_open.o
Regards
Sid.

-- 
Sid Boyce .... Hamradio G3VBV and keen Flyer
=====LINUX ONLY USED HERE=====


^ permalink raw reply	[flat|nested] 62+ messages in thread

* RE: 2.6.9-rc1-mm1
  2004-08-28 14:14 2.6.9-rc1-mm1 Sid Boyce
@ 2004-08-28 15:22 ` Hugh Dickins
  0 siblings, 0 replies; 62+ messages in thread
From: Hugh Dickins @ 2004-08-28 15:22 UTC (permalink / raw)
  To: Sid Boyce; +Cc: linux-kernel

On Sat, 28 Aug 2004, Sid Boyce wrote:
> I get hangs with 2.6.9-rc1-mm1 if ACPI or APM are enabled. I haven't 
> tried console=ttyS1 to see if there is an oops, but from previous 
> experiences also posted, they are probably being generated.

I don't know.

> One other problem is that trying to rebuild a 2.6.9-rc1-mm1 kernel under 
> 2.6.9-rc1-mm1 fails, once as shown below and once elsewhere in fs/. I 
> have to boot 2.6.8-rc4-mm1 in order to build 2.6.9-rc1-mm1. Asus A7N8X-E 
> nForce2 chipset, Version: ASUS A7N8X-E Deluxe ACPI BIOS Rev 1011, SuSE 
> 9.1. Upgrading to 1012 shortly.
> fs/.tmp_open.o: could not read symbols: File truncated
> make[1]: *** [fs/open.o] Error 1
> make: *** [fs] Error 2
> barrabas:/usr/src/linux-2.6.9-rc1-mm1 # l fs/.tmp_open.o
> -rw-r--r--  1 root root 114688 2004-08-27 01:01 fs/.tmp_open.o

You probably want the patch I posted yesterday in "data loss" thread
(expect we'll end up choosing a competing patch, but this does fine).

Hugh

--- 2.6.9-rc1-mm1/mm/filemap.c	2004-08-26 12:09:50.000000000 +0100
+++ linux/mm/filemap.c	2004-08-27 14:35:32.113359872 +0100
@@ -722,10 +722,7 @@ void do_generic_mapping_read(struct addr
 	offset = *ppos & ~PAGE_CACHE_MASK;
 
 	isize = i_size_read(inode);
-	if (!isize)
-		goto out;
-
-	end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
+	end_index = isize >> PAGE_CACHE_SHIFT;
 
 	for (;;) {
 		struct page *page;
@@ -733,6 +730,11 @@ void do_generic_mapping_read(struct addr
 
 		if (index > end_index)
 			goto out;
+		if (index == end_index) {
+			nr = isize & ~PAGE_CACHE_MASK;
+			if (nr <= offset)
+				goto out;
+		}
 
 		cond_resched();
 		page_cache_readahead(mapping, &ra, filp, index);
@@ -831,8 +833,8 @@ readpage:
 		 * another truncate extends the file - this is desired though).
 		 */
 		isize = i_size_read(inode);
-		end_index = (isize - 1) >> PAGE_CACHE_SHIFT;
-		if (unlikely(!isize || index > end_index)) {
+		end_index = isize >> PAGE_CACHE_SHIFT;
+		if (unlikely(index > end_index)) {
 			page_cache_release(page);
 			goto out;
 		}


^ permalink raw reply	[flat|nested] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ 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; 62+ 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] 62+ messages in thread

end of thread, other threads:[~2004-09-08 12:02 UTC | newest]

Thread overview: 62+ 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
  -- strict thread matches above, loose matches on Subject: below --
2004-08-28 14:14 2.6.9-rc1-mm1 Sid Boyce
2004-08-28 15:22 ` 2.6.9-rc1-mm1 Hugh Dickins

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox