Author: jhb
Date: Mon Jan 29 23:43:04 2018
New Revision: 328571
URL: https://svnweb.freebsd.org/changeset/base/328571

Log:
  MFC 327561:
  Report offset relative to the backing object for kinfo_vmentry structures.
  
  For the pathname reported in kinfo_vmentry structures (kve_path), the
  sysctl handlers walk the object chain to find the bottom-most VM object.
  This permits a COW mapping of a file with dirty pages to report the
  pathname of the originally mapped file.  Do the same for the object
  offset (kve_offset) computing a cumulative offset during the same object
  walk so that the reported offset is relative to the reported pathname.
  
  Note that ptrace(PT_VM_ENTRY) already returns a cumulative offset
  rather than the raw offset of the VM map entry.
  
  Note also that this does not affect procstat -v output (even structured
  output) since that output does not include the kve_offset field.
  
  Sponsored by: DARPA / AFRL

Modified:
  stable/10/sys/kern/kern_proc.c
Directory Properties:
  stable/10/   (props changed)

Changes in other areas also in this revision:
Modified:
  stable/11/sys/kern/kern_proc.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/10/sys/kern/kern_proc.c
==============================================================================
--- stable/10/sys/kern/kern_proc.c      Mon Jan 29 23:36:05 2018        
(r328570)
+++ stable/10/sys/kern/kern_proc.c      Mon Jan 29 23:43:04 2018        
(r328571)
@@ -2061,8 +2061,10 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
                }
 
                for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
-                       if (tobj != obj)
+                       if (tobj != obj) {
                                VM_OBJECT_RLOCK(tobj);
+                               kve->kve_offset += tobj->backing_object_offset;
+                       }
                        if (lobj != obj)
                                VM_OBJECT_RUNLOCK(lobj);
                        lobj = tobj;
@@ -2070,7 +2072,7 @@ sysctl_kern_proc_ovmmap(SYSCTL_HANDLER_ARGS)
 
                kve->kve_start = (void*)entry->start;
                kve->kve_end = (void*)entry->end;
-               kve->kve_offset = (off_t)entry->offset;
+               kve->kve_offset += (off_t)entry->offset;
 
                if (entry->protection & VM_PROT_READ)
                        kve->kve_protection |= KVME_PROT_READ;
@@ -2284,6 +2286,7 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, s
                        for (tobj = obj; tobj != NULL;
                            tobj = tobj->backing_object) {
                                VM_OBJECT_RLOCK(tobj);
+                               kve->kve_offset += tobj->backing_object_offset;
                                lobj = tobj;
                        }
                        if (obj->backing_object == NULL)
@@ -2302,7 +2305,7 @@ kern_proc_vmmap_out(struct proc *p, struct sbuf *sb, s
 
                kve->kve_start = entry->start;
                kve->kve_end = entry->end;
-               kve->kve_offset = entry->offset;
+               kve->kve_offset += entry->offset;
 
                if (entry->protection & VM_PROT_READ)
                        kve->kve_protection |= KVME_PROT_READ;
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to