Changes since 12/7/05

- removed __attribute((unused)) qualifiers from timespec vars (dave hansen)
- use existing timestamping function do_posix_clock_monotonic_gettime() (jay 
lan)

Changes since 11/14/05

- use nanosecond resolution, adjusted wall clock time for timestamps
  instead of sched_clock (akpm, andi, marcelo)
- collect stats only if delay accounting enabled (parag)
- collect delays for only swapin page faults instead of all page faults.

11/14/05: First post


delayacct-swapin.patch

Record time spent by a task waiting for its pages to be swapped in.
This statistic can help in adjusting the rss limits of
tasks (process), especially relative to each other, when the system is
under memory pressure.

Signed-off-by: Shailabh Nagar <[EMAIL PROTECTED]>

 include/linux/delayacct.h |    3 +++
 include/linux/sched.h     |    2 ++
 kernel/delayacct.c        |   15 +++++++++++++++
 mm/memory.c               |   16 +++++++++-------
 4 files changed, 29 insertions(+), 7 deletions(-)

Index: linux-2.6.15-rc7/include/linux/delayacct.h
===================================================================
--- linux-2.6.15-rc7.orig/include/linux/delayacct.h
+++ linux-2.6.15-rc7/include/linux/delayacct.h
@@ -20,11 +20,14 @@
 extern int delayacct_on;       /* Delay accounting turned on/off */
 extern void delayacct_tsk_init(struct task_struct *tsk);
 extern void delayacct_blkio(struct timespec *start, struct timespec *end);
+extern void delayacct_swapin(struct timespec *start, struct timespec *end);
 #else
 static inline void delayacct_tsk_init(struct task_struct *tsk)
 {}
 static inline void delayacct_blkio(struct timespec *start, struct timespec 
*end)
 {}
+static inline void delayacct_swapin(struct timespec *start, struct timespec 
*end)
+{}

 #endif /* CONFIG_TASK_DELAY_ACCT */
 #endif /* _LINUX_TASKDELAYS_H */
Index: linux-2.6.15-rc7/include/linux/sched.h
===================================================================
--- linux-2.6.15-rc7.orig/include/linux/sched.h
+++ linux-2.6.15-rc7/include/linux/sched.h
@@ -548,6 +548,8 @@ struct task_delay_info {
        /* Add stats in pairs: uint64_t delay, uint32_t count */
        uint64_t blkio_delay;   /* wait for sync block io completion */
        uint32_t blkio_count;
+       uint64_t swapin_delay;  /* wait for pages to be swapped in */
+       uint32_t swapin_count;
 };
 #endif

Index: linux-2.6.15-rc7/mm/memory.c
===================================================================
--- linux-2.6.15-rc7.orig/mm/memory.c
+++ linux-2.6.15-rc7/mm/memory.c
@@ -2171,16 +2171,15 @@ static inline int handle_pte_fault(struc

        old_entry = entry = *pte;
        if (!pte_present(entry)) {
-               if (pte_none(entry)) {
-                       int ret;
-                       struct timespec start, end;
+               int ret;
+               struct timespec start, end;

+               do_posix_clock_monotonic_gettime(&start);
+               if (pte_none(entry)) {
                        if (!vma->vm_ops || !vma->vm_ops->nopage)
                                return do_anonymous_page(mm, vma, address,
                                        pte, pmd, write_access);

-                       if (vma->vm_file)
-                               do_posix_clock_monotonic_gettime(&start);
                        ret = do_no_page(mm, vma, address,
                                         pte, pmd, write_access);
                        if (vma->vm_file) {
@@ -2192,8 +2191,11 @@ static inline int handle_pte_fault(struc
                if (pte_file(entry))
                        return do_file_page(mm, vma, address,
                                        pte, pmd, write_access, entry);
-               return do_swap_page(mm, vma, address,
-                                       pte, pmd, write_access, entry);
+               ret = do_swap_page(mm, vma, address,
+                                  pte, pmd, write_access, entry);
+               do_posix_clock_monotonic_gettime(&end);
+               delayacct_swapin(&start, &end);
+               return ret;
        }

        ptl = pte_lockptr(mm, pmd);
Index: linux-2.6.15-rc7/kernel/delayacct.c
===================================================================
--- linux-2.6.15-rc7.orig/kernel/delayacct.c
+++ linux-2.6.15-rc7/kernel/delayacct.c
@@ -50,3 +50,18 @@ inline void delayacct_blkio(struct times
        current->delays.blkio_count++;
        spin_unlock(&current->delays.lock);
 }
+
+inline void delayacct_swapin(struct timespec *start, struct timespec *end)
+{
+       unsigned long long delay;
+
+       if (!delayacct_on)
+               return;
+
+       delay = timespec_diff_ns(start, end);
+
+       spin_lock(&current->delays.lock);
+       current->delays.swapin_delay += delay;
+       current->delays.swapin_count++;
+       spin_unlock(&current->delays.lock);
+}


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech

Reply via email to