troubleshooting dragonfly after compiling kernel
Pratyush Kshirsagar
pratyush.kshirsagar at gmail.com
Thu Sep 2 11:32:56 PDT 2010
Alex Hornung <ahornung <at> gmail.com> writes:
>
> > I just added few fields int the structure vm_object, added some code to
vm_page.c
> > Added couple of functions to the vm_map.h and vm_map.c
> > Just to display proportional rss with the rss.
> > Also, added a field in struct kern_info and make changes to m_dragonfly.c
> > I checked any error in the code with lint and gcc on all the files i made
> > changes to.
>
> This is not enough information. Please send a patch for review or
> something, because right now this is pure guesswork. Also it would be
> of advantage if you rebased your work onto something more recent than
> 2.4.1.
>
> Cheers,
> Alex
>
>
Following the output of git diff, please have a look :
diff --git a/sys/kern/kern_kinfo.c b/sys/kern/kern_kinfo.c
index c8d0578..ecad09e 100644
--- a/sys/kern/kern_kinfo.c
+++ b/sys/kern/kern_kinfo.c
@@ -147,6 +147,7 @@ fill_kinfo_proc(struct proc *p, struct kinfo_proc *kp)
if (p->p_vmspace) {
kp->kp_vm_map_size = p->p_vmspace->vm_map.size;
kp->kp_vm_rssize = vmspace_resident_count(p->p_vmspace);
+ kp->kp_vm_prssize = vmspace_president_count(p->p_vmspace);
kp->kp_vm_swrss = p->p_vmspace->vm_swrss;
kp->kp_vm_tsize = p->p_vmspace->vm_tsize;
kp->kp_vm_dsize = p->p_vmspace->vm_dsize;
diff --git a/sys/sys/kinfo.h b/sys/sys/kinfo.h
index dc0242b..00b17aa 100644
--- a/sys/sys/kinfo.h
+++ b/sys/sys/kinfo.h
@@ -188,6 +188,7 @@ struct kinfo_proc {
vm_size_t kp_vm_map_size; /* vmmap virtual size */
segsz_t kp_vm_rssize; /* resident set size */
+ segsz_t kp_vm_prssize; /* proportional rss */
segsz_t kp_vm_swrss; /* rss before last swap */
segsz_t kp_vm_tsize; /* text size */
segsz_t kp_vm_dsize; /* data size */
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c
index a326037..4eb9026 100644
--- a/sys/vm/vm_map.c
+++ b/sys/vm/vm_map.c
@@ -3657,3 +3657,20 @@ DB_SHOW_COMMAND(procvm, procvm)
}
#endif /* DDB */
+
+long vmap_resident_count(vm_map_t v)
+{
+ vm_map_entry_t entry;
+ vm_map_object_t *mobj;
+ vm_object_t obj;
+ long pres = 0;
+ entry = &(v->header);
+ while(entry->next != NULL){
+ mobj = &entry->object;
+ if(mobj->vm_object != NULL) {
+ obj = mobj->vm_object;
+ pres = pres + (long) (obj->agg_pv_list_count / obj->resident_page_count);
+ }
+ }
+ return pres;
+}
diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h
index dc9b8e9..b07edeb 100644
--- a/sys/vm/vm_map.h
+++ b/sys/vm/vm_map.h
@@ -395,6 +395,14 @@ vmspace_resident_count(struct vmspace *vmspace)
return pmap_resident_count(vmspace_pmap(vmspace));
}
+long vmap_resident_count(vm_map_t);
+
+static __inline long
+vmspace_president_count(struct vmspace *vmspace)
+{
+ return vmap_resident_count(&vmspace->vm_map);
+}
+
/*
* Number of kernel maps and entries to statically allocate, required
* during boot to bootstrap the VM system.
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index e71b452..0212edd 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -154,6 +154,7 @@ _vm_object_allocate(objtype_t type, vm_size_t size,
vm_object_t object)
vm_object_set_flag(object, OBJ_ONEMAPPING);
object->paging_in_progress = 0;
object->resident_page_count = 0;
+ object->agg_pv_list_count = 0;
object->shadow_count = 0;
object->pg_color = next_index;
if ( size > (PQ_L2_SIZE / 3 + PQ_PRIME1))
diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h
index 7bccfd6..7db55d4 100644
--- a/sys/vm/vm_object.h
+++ b/sys/vm/vm_object.h
@@ -143,6 +143,7 @@ struct vm_object {
u_short pg_color; /* color of first page in obj */
u_short paging_in_progress; /* Paging (in or out) so don't collapse or destroy */
int resident_page_count; /* number of resident pages */
+ int agg_pv_list_count; /* aggregate pv_list count for all pages */
struct vm_object *backing_object; /* object that I'm a shadow of */
vm_ooffset_t backing_object_offset;/* Offset in backing object */
TAILQ_ENTRY(vm_object) pager_object_list; /* list of all objects of this pager
type */
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 717522b..c481618 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -374,6 +374,11 @@ vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t
pindex)
* show that the object has one more resident page.
*/
object->resident_page_count++;
+
+ /*
+ * Add the pv_list count of the page
+ */
+ object->agg_pv_list_count = object->agg_pv_list_count + m->md.pv_list_count;
/*
* Since we are inserting a new and possibly dirty page,
@@ -417,6 +422,7 @@ vm_page_remove(vm_page_t m)
*/
vm_page_rb_tree_RB_REMOVE(&object->rb_memq, m);
object->resident_page_count--;
+ object->agg_pv_list_count = object->agg_pv_list_count - m->md.pv_list_count;
object->generation++;
m->object = NULL;
More information about the Kernel
mailing list