The patch titled io-accounting: remove current io accounting has been added to the -mm tree. Its filename is io-accounting-remove-current-io-accounting.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: io-accounting: remove current io accounting From: Andrew Morton <akpm@xxxxxxxx> The present per-task IO accounting is unusable. It simply counts the number of bytes passed into read() and write(). So if a process reads 1MB from an already-cached file, it is accused of having performed 1MB of I/O, which is hopelessly wrong. This patchset removes the old IO accounting and replaces it with new accounting which tries to be more accurate. We account for three things: reads: attempt to count the number of bytes which this process really did cause to be fetched from the storage layer writes: attempt to count the number of bytes which this process caused to be sent to the storage layer. The big inaccuracy here is truncate. If a process writes 1MB to a file and then deletes the file, it will in fact perform no writeout. But it will have been accounted as having caused 1MB of write. So... cancelled_writes: account the number of bytes which this process caused to not happen, by truncating pagecache. We _could_ just subtract this from the process's `write' accounting. But that means that some processes would be reported to have done negative amounts of write IO, which is silly. So we just report the raw number and punt this decision up to userspace. There are some open questions: - What the heck's going on with userspace? The example getdelays.c appears to exercise no more than a fraction of the taskstats interface. How do I get at my numbers? - Missing accounting of filesystem metadata reads - Filesystems which implement private a_ops.readpages might need work. - What to do about things like NFS? It will probably presently account _some_ IO, but it'll be wrong. This patch: Remove the old IO accounting, but leave the fields in the taskstats structure in-place, but zeroed. Cc: Jay Lan <jlan@xxxxxxx> Cc: Shailabh Nagar <nagar@xxxxxxxxxxxxxx> Cc: Balbir Singh <balbir@xxxxxxxxxx> Cc: Chris Sturtivant <csturtiv@xxxxxxx> Cc: Tony Ernst <tee@xxxxxxx> Cc: Guillaume Thouvenin <guillaume.thouvenin@xxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- fs/read_write.c | 18 ++---------------- include/linux/sched.h | 4 ++-- kernel/fork.c | 2 -- kernel/tsacct.c | 4 ++-- 4 files changed, 6 insertions(+), 22 deletions(-) diff -puN fs/read_write.c~io-accounting-remove-current-io-accounting fs/read_write.c --- a/fs/read_write.c~io-accounting-remove-current-io-accounting +++ a/fs/read_write.c @@ -272,10 +272,8 @@ ssize_t vfs_read(struct file *file, char ret = file->f_op->read(file, buf, count, pos); else ret = do_sync_read(file, buf, count, pos); - if (ret > 0) { + if (ret > 0) fsnotify_access(file->f_dentry); - current->rchar += ret; - } current->syscr++; } } @@ -330,10 +328,8 @@ ssize_t vfs_write(struct file *file, con ret = file->f_op->write(file, buf, count, pos); else ret = do_sync_write(file, buf, count, pos); - if (ret > 0) { + if (ret > 0) fsnotify_modify(file->f_dentry); - current->wchar += ret; - } current->syscw++; } } @@ -675,9 +671,6 @@ sys_readv(unsigned long fd, const struct file_pos_write(file, pos); fput_light(file, fput_needed); } - - if (ret > 0) - current->rchar += ret; current->syscr++; return ret; } @@ -696,9 +689,6 @@ sys_writev(unsigned long fd, const struc file_pos_write(file, pos); fput_light(file, fput_needed); } - - if (ret > 0) - current->wchar += ret; current->syscw++; return ret; } @@ -780,10 +770,6 @@ static ssize_t do_sendfile(int out_fd, i retval = in_file->f_op->sendfile(in_file, ppos, count, file_send_actor, out_file); - if (retval > 0) { - current->rchar += retval; - current->wchar += retval; - } current->syscr++; current->syscw++; diff -puN include/linux/sched.h~io-accounting-remove-current-io-accounting include/linux/sched.h --- a/include/linux/sched.h~io-accounting-remove-current-io-accounting +++ a/include/linux/sched.h @@ -1002,8 +1002,8 @@ struct task_struct { * to a stack based synchronous wait) if its doing sync IO. */ wait_queue_t *io_wait; -/* i/o counters(bytes read/written, #syscalls */ - u64 rchar, wchar, syscr, syscw; + u64 syscr; /* number of read syscalls */ + u64 syscw; /* number of write syscalls */ #if defined(CONFIG_TASK_XACCT) u64 acct_rss_mem1; /* accumulated rss usage */ u64 acct_vm_mem1; /* accumulated virtual memory usage */ diff -puN kernel/fork.c~io-accounting-remove-current-io-accounting kernel/fork.c --- a/kernel/fork.c~io-accounting-remove-current-io-accounting +++ a/kernel/fork.c @@ -1051,8 +1051,6 @@ static struct task_struct *copy_process( p->utime = cputime_zero; p->stime = cputime_zero; p->sched_time = 0; - p->rchar = 0; /* I/O counter: bytes read */ - p->wchar = 0; /* I/O counter: bytes written */ p->syscr = 0; /* I/O counter: read syscalls */ p->syscw = 0; /* I/O counter: write syscalls */ acct_clear_integrals(p); diff -puN kernel/tsacct.c~io-accounting-remove-current-io-accounting kernel/tsacct.c --- a/kernel/tsacct.c~io-accounting-remove-current-io-accounting +++ a/kernel/tsacct.c @@ -92,8 +92,8 @@ void xacct_add_tsk(struct taskstats *sta stats->hiwater_vm = mm->hiwater_vm * PAGE_SIZE / KB; mmput(mm); } - stats->read_char = p->rchar; - stats->write_char = p->wchar; + stats->read_char = 0; + stats->write_char = 0; stats->read_syscalls = p->syscr; stats->write_syscalls = p->syscw; } _ Patches currently in -mm which might be from akpm@xxxxxxxx are origin.patch git-acpi.patch video-sysfs-support-take-2-add-dev-argument-for-backlight_device_register.patch acpi-asus-s3-resume-fix.patch sony_apci-resume.patch video-sysfs-support-take-2-add-dev-argument-for-backlight_device_register-sony_acpi-fix.patch git-cpufreq-prep.patch git-cpufreq.patch git-powerpc.patch fix-gregkh-driver-sound-device.patch git-dvb.patch git-dvb-fixup.patch git-gfs2-nmw.patch git-ia64.patch git-input.patch git-input-fixup.patch git-libata-all.patch via-pata-controller-xfer-fixes-fix.patch git-mtd.patch git-netdev-all.patch git-netdev-all-fixup.patch libphy-dont-do-that.patch update-smc91x-driver-with-arm-versatile-board-info.patch drivers-net-ns83820c-add-paramter-to-disable-auto.patch git-net.patch net-uninline-skb_put.patch ioat-warning-fix.patch tidy-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch fix-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch fix-2-gregkh-pci-pci-check-szhi-when-sz-is-0-when-64-bit-iomem-bigger-than-4g.patch git-scsi-misc.patch drivers-scsi-mca_53c9xc-save_flags-cli-removal.patch nokia-e70-is-an-unusual-device.patch git-watchdog.patch pre-x86_64-mm-i386-reloc-abssym.patch post-x86_64-mm-i386-reloc-abssym.patch touchkit-ps-2-touchscreen-driver.patch get-rid-of-zone_table.patch new-scheme-to-preempt-swap-token-tidy.patch balance_pdgat-cleanup.patch add-numa-node-information-to-struct-device-tidy.patch node-aware-skb-allocation-fix-for-device-tree-changes.patch radix-tree-rcu-lockless-readside.patch acx1xx-wireless-driver.patch security-introduce-file-caps-tweaks.patch security-introduce-file-caps-warning-fix.patch swsusp-add-resume_offset-command-line-parameter-rev-2.patch add-include-linux-freezerh-and-move-definitions-from-ueagle-fix.patch cciss-set-sector_size-to-2048-for-performance-tidy.patch deprecate-smbfs-in-favour-of-cifs.patch edac-new-opteron-athlon64-memory-controller-driver.patch kbuild-dont-put-temp-files-in-the-source-tree.patch lockdep-annotate-nfs-nfsd-in-kernel-sockets-tidy.patch drivers-add-lcd-support-3-Kconfig-fix.patch probe_kernel_address-needs-to-do-set_fs.patch slab-use-probe_kernel_address.patch lockdep-spin_lock_irqsave_nested-fix.patch lockdep-spin_lock_irqsave_nested-fix-2.patch aio-use-prepare_to_wait.patch exar-quad-port-serial-fix.patch vfs_getattr-remove-dead-code.patch ext3-uninline-large-functions.patch ext4-uninline-large-functions.patch uninline-module_put.patch sleep-profiling-fixes.patch sleep-profiling-fix.patch debug-workqueue-locking-sanity-fix.patch pcengines-wrap-led-support-fix.patch driver-base-memoryc-remove-warnings-of.patch remove-kernel-syscalls-x86_64-fix.patch protect-ext2-ioctl-modifying-append_only-immutable-etc-with-i_mutex.patch remove-hash_highmem.patch elf-fix-kcore-note-size-calculation-fix.patch reiserfs-add-missing-d-cache-flushing-tweak.patch io-accounting-remove-current-io-accounting.patch io-accounting-core-statistics.patch clean-up-__set_page_dirty_nobuffers.patch io-accounting-write-accounting.patch io-accounting-write-cancel-accounting.patch io-accounting-read-accounting.patch io-accounting-direct-io.patch io-accounting-report-in-procfs.patch cleanup-taskstatsh.patch io-accounting-via-taskstats.patch getdelays-various-fixes.patch ext2-reservations.patch ext2-reservations-fix-42.patch ext2-reservations-fix-ext2_new_blocks-type.patch ext2-reservations-fix-ext2_new_block-type.patch pktcdvd-bio-write-congestion-using-blk_congestion_wait-fix.patch bug-test-1.patch fsstack-introduce-fsstack_copy_attrinode_-tidy.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-fix.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-vs-git-cryptodev.patch log2-implement-a-general-integer-log2-facility-in-the-kernel-ppc-fix.patch add-process_session-helper-routine-deprecate-old-field-tidy.patch add-process_session-helper-routine-deprecate-old-field-fix-warnings.patch add-process_session-helper-routine-deprecate-old-field-fix-warnings-2.patch mxser-session-warning-fix.patch tty-switch-to-ktermios-and-new-framework-warning-fix.patch tty-switch-to-ktermios-bluetooth-fix.patch tty_ioctl-use-termios-for-the-old-structure-and-termios2-fix.patch char-istallion-correct-fail-paths-fix.patch drivers-isdn-handcrafted-min-max-macro-removal-fix.patch fault-injection-capabilities-infrastructure-tidy.patch fault-injection-capabilities-infrastructure-tweaks.patch fault-injection-Kconfig-cleanup.patch fault-injection-stacktrace-filtering-kconfig-fix.patch kernel-schedc-whitespace-cleanups-more.patch swap_prefetch-vs-zoned-counters.patch add-include-linux-freezerh-and-move-definitions-from-prefetch.patch readahead-minmax_ra_pages.patch readahead-sysctl-parameters.patch make-copy_from_user_inatomic-not-zero-the-tail-on-i386-vs-reiser4.patch resier4-add-include-linux-freezerh-and-move-definitions-from.patch make-kmem_cache_destroy-return-void-reiser4.patch reiser4-hardirq-include-fix.patch reiser4-run-truncate_inode_pages-in-reiser4_delete_inode.patch reiser4-get_sb_dev-fix.patch reiser4-vs-zoned-allocator.patch reiser4-temp-fix.patch hpt3xx-rework-rate-filtering-tidy.patch video-get-the-default-mode-from-the-right-database-fb-modedb-uses-wrong-default_mode-fix.patch various-fbdev-files-mark-structs-fix.patch md-allow-reads-that-have-bypassed-the-cache-to-be-retried-on-failure-fix.patch statistics-infrastructure-fix-buffer-overflow-in-histogram-with-linear-tidy.patch extend-notifier_call_chain-to-count-nr_calls-made.patch define-and-use-new-eventscpu_lock_acquire-and-cpu_lock_release-fix.patch gtod-persistent-clock-support-i386.patch updated-hrtimers-state-tracking.patch updated-i386-convert-to-clock-event-devices.patch updated-i386-convert-to-clock-event-devices-fix.patch updated-gtod-mark-tsc-unusable-for-highres-timers.patch round_jiffies-infrastructure-fix.patch clocksource-small-cleanup-2-fix.patch kevent_user_wait-retval-fix.patch kevent-v23-socket-notifications-fix-again.patch kevent-timer-notifications-fix.patch nr_blockdev_pages-in_interrupt-warning.patch device-suspend-debug.patch mutex-subsystem-synchro-test-module-fix.patch slab-leaks3-default-y.patch x86-kmap_atomic-debugging.patch restore-rogue-readahead-printk.patch put_bh-debug.patch e1000-printk-warning-fixes.patch acpi_format_exception-debug.patch jmicron-warning-fix.patch squash-ipc-warnings.patch squash-udf-warnings.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html