Commit 8fdc7070 authored by Pavel Emelyanov's avatar Pavel Emelyanov

vma: Helper, that checks whether vma is dumped via parasite

Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent b71f9e80
...@@ -62,6 +62,37 @@ ...@@ -62,6 +62,37 @@
static char loc_buf[PAGE_SIZE]; static char loc_buf[PAGE_SIZE];
static int pidns_proc = -1; static int pidns_proc = -1;
bool privately_dump_vma(struct vma_area *vma)
{
/*
* The special areas are not dumped.
*/
if (!(vma->vma.status & VMA_AREA_REGULAR))
return false;
/* No dumps for file-shared mappings */
if (vma->vma.status & VMA_FILE_SHARED)
return false;
/* No dumps for SYSV IPC mappings */
if (vma->vma.status & VMA_AREA_SYSVIPC)
return false;
if (vma_area_is(vma, VMA_ANON_SHARED))
return false;
if (!vma_area_is(vma, VMA_ANON_PRIVATE) &&
!vma_area_is(vma, VMA_FILE_PRIVATE)) {
pr_warn("Unexpected VMA area found\n");
return false;
}
if (vma->vma.end > TASK_SIZE)
return false;
return true;
}
void free_mappings(struct vm_area_list *vma_area_list) void free_mappings(struct vm_area_list *vma_area_list)
{ {
struct vma_area *vma_area, *p; struct vma_area *vma_area, *p;
......
...@@ -225,6 +225,7 @@ struct vm_area_list { ...@@ -225,6 +225,7 @@ struct vm_area_list {
int collect_mappings(pid_t pid, struct vm_area_list *vma_area_list); int collect_mappings(pid_t pid, struct vm_area_list *vma_area_list);
void free_mappings(struct vm_area_list *vma_area_list); void free_mappings(struct vm_area_list *vma_area_list);
bool privately_dump_vma(struct vma_area *vma);
struct vma_area { struct vma_area {
struct list_head list; struct list_head list;
......
...@@ -511,33 +511,9 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct vm_area_list *vm ...@@ -511,33 +511,9 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct vm_area_list *vm
parasite_dumppages = parasite_args(ctl, struct parasite_dump_pages_args); parasite_dumppages = parasite_args(ctl, struct parasite_dump_pages_args);
list_for_each_entry(vma_area, &vma_area_list->h, list) { list_for_each_entry(vma_area, &vma_area_list->h, list) {
/*
* The special areas are not dumped.
*/
if (!(vma_area->vma.status & VMA_AREA_REGULAR))
continue;
/* No dumps for file-shared mappings */
if (vma_area->vma.status & VMA_FILE_SHARED)
continue;
/* No dumps for SYSV IPC mappings */
if (vma_area->vma.status & VMA_AREA_SYSVIPC)
continue;
if (vma_area_is(vma_area, VMA_ANON_SHARED))
continue;
parasite_dumppages->vma_entry = vma_area->vma; parasite_dumppages->vma_entry = vma_area->vma;
if (!vma_area_is(vma_area, VMA_ANON_PRIVATE) && if (!privately_dump_vma(vma_area))
!vma_area_is(vma_area, VMA_FILE_PRIVATE)) {
pr_warn("Unexpected VMA area found\n");
continue;
}
if (vma_area->vma.end > TASK_SIZE)
continue; continue;
ret = parasite_execute(PARASITE_CMD_DUMPPAGES, ctl); ret = parasite_execute(PARASITE_CMD_DUMPPAGES, ctl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment