Index: linux-2.6-git-2.6.31-bisect2/fs/read_write.c =================================================================== --- linux-2.6-git-2.6.31-bisect2.orig/fs/read_write.c +++ linux-2.6-git-2.6.31-bisect2/fs/read_write.c @@ -249,25 +249,37 @@ static void wait_on_retry_sync_kiocb(str __set_current_state(TASK_RUNNING); } +unsigned long perf_count_do_sync_read_calls_aio_read = 0; +unsigned long perf_tsum_do_sync_read_calls_aio_read = 0; +unsigned long perf_count_do_sync_read_calls_wait_on_sync_kiocb = 0; +unsigned long perf_tsum_do_sync_read_calls_wait_on_sync_kiocb = 0; ssize_t do_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos) { struct iovec iov = { .iov_base = buf, .iov_len = len }; struct kiocb kiocb; ssize_t ret; + ktime_t tv64_pre; init_sync_kiocb(&kiocb, filp); kiocb.ki_pos = *ppos; kiocb.ki_left = len; for (;;) { + perf_count_do_sync_read_calls_aio_read++; + tv64_pre = ktime_get(); ret = filp->f_op->aio_read(&kiocb, &iov, 1, kiocb.ki_pos); + perf_tsum_do_sync_read_calls_aio_read += ktime_sub(ktime_get(),tv64_pre).tv64; if (ret != -EIOCBRETRY) break; wait_on_retry_sync_kiocb(&kiocb); } - if (-EIOCBQUEUED == ret) + if (-EIOCBQUEUED == ret) { + perf_count_do_sync_read_calls_wait_on_sync_kiocb++; + tv64_pre = ktime_get(); ret = wait_on_sync_kiocb(&kiocb); + perf_tsum_do_sync_read_calls_wait_on_sync_kiocb += ktime_sub(ktime_get(),tv64_pre).tv64; + } *ppos = kiocb.ki_pos; return ret; } Index: linux-2.6-git-2.6.31-bisect2/kernel/sysctl.c =================================================================== --- linux-2.6-git-2.6.31-bisect2.orig/kernel/sysctl.c +++ linux-2.6-git-2.6.31-bisect2/kernel/sysctl.c @@ -257,6 +257,10 @@ extern unsigned long perf_count_pages_di extern unsigned long perf_count_failed_pages_direct_reclaim; extern unsigned long perf_count_do_generic_file_read_calls_page_cache_alloc_cold; extern unsigned long perf_tsum_do_generic_file_read_calls_page_cache_alloc_cold; +extern unsigned long perf_count_do_sync_read_calls_aio_read; +extern unsigned long perf_tsum_do_sync_read_calls_aio_read; +extern unsigned long perf_count_do_sync_read_calls_wait_on_sync_kiocb; +extern unsigned long perf_tsum_do_sync_read_calls_wait_on_sync_kiocb; static struct ctl_table perf_table[] = { { .ctl_name = CTL_UNNUMBERED, @@ -297,6 +301,38 @@ static struct ctl_table perf_table[] = { .maxlen = sizeof(unsigned long), .mode = 0666, .proc_handler = &proc_doulongvec_minmax, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "perf_count_do_sync_read_calls_aio_read", + .data = &perf_count_do_sync_read_calls_aio_read, + .maxlen = sizeof(unsigned long), + .mode = 0666, + .proc_handler = &proc_doulongvec_minmax, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "perf_tsum_do_sync_read_calls_aio_read", + .data = &perf_tsum_do_sync_read_calls_aio_read, + .maxlen = sizeof(unsigned long), + .mode = 0666, + .proc_handler = &proc_doulongvec_minmax, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "perf_count_do_sync_read_calls_wait_on_sync_kiocb", + .data = &perf_count_do_sync_read_calls_wait_on_sync_kiocb, + .maxlen = sizeof(unsigned long), + .mode = 0666, + .proc_handler = &proc_doulongvec_minmax, + }, + { + .ctl_name = CTL_UNNUMBERED, + .procname = "perf_tsum_do_sync_read_calls_wait_on_sync_kiocb", + .data = &perf_tsum_do_sync_read_calls_wait_on_sync_kiocb, + .maxlen = sizeof(unsigned long), + .mode = 0666, + .proc_handler = &proc_doulongvec_minmax, }, { .ctl_name = 0 } };