Commit ebae2651 authored by Fyodor Bocharov's avatar Fyodor Bocharov Committed by Pavel Emelyanov

shmem: pass anonymous shmem pagemap to add_shmem_area

So we would be able to analyze pagemap bits for each
anonymous shmem page and decide on its dirtiness and usage
by dumpee process.
Signed-off-by: 's avatarFyodor Bocharov <fbocharov@yandex.ru>
Signed-off-by: 's avatarEugene Batalov <eabatalov89@gmail.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 200ead9a
...@@ -470,8 +470,6 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat, ...@@ -470,8 +470,6 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
ret = 0; ret = 0;
else if (vma_entry_is(vma, VMA_AREA_SYSVIPC)) else if (vma_entry_is(vma, VMA_AREA_SYSVIPC))
ret = check_sysvipc_map_dump(pid, vma); ret = check_sysvipc_map_dump(pid, vma);
else if (vma_entry_is(vma, VMA_ANON_SHARED))
ret = add_shmem_area(pid, vma);
else if (vma_entry_is(vma, VMA_AREA_SOCKET)) else if (vma_entry_is(vma, VMA_AREA_SOCKET))
ret = dump_socket_map(vma_area); ret = dump_socket_map(vma_area);
else else
......
#ifndef __CR_SHMEM_H__ #ifndef __CR_SHMEM_H__
#define __CR_SHMEM_H__ #define __CR_SHMEM_H__
#include "asm/int.h"
#include "lock.h" #include "lock.h"
#include "images/vma.pb-c.h" #include "images/vma.pb-c.h"
...@@ -10,7 +11,7 @@ struct vma_area; ...@@ -10,7 +11,7 @@ struct vma_area;
extern int collect_shmem(int pid, struct vma_area *vma); extern int collect_shmem(int pid, struct vma_area *vma);
extern int collect_sysv_shmem(unsigned long shmid, unsigned long size); extern int collect_sysv_shmem(unsigned long shmid, unsigned long size);
extern int cr_dump_shmem(void); extern int cr_dump_shmem(void);
extern int add_shmem_area(pid_t pid, VmaEntry *vma); extern int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map);
extern int fixup_sysv_shmems(void); extern int fixup_sysv_shmems(void);
#define SYSV_SHMEM_SKIP_FD (0x7fffffff) #define SYSV_SHMEM_SKIP_FD (0x7fffffff)
......
...@@ -268,6 +268,7 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl, ...@@ -268,6 +268,7 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
struct page_xfer xfer = { .parent = NULL }; struct page_xfer xfer = { .parent = NULL };
int ret = -1; int ret = -1;
unsigned cpp_flags = 0; unsigned cpp_flags = 0;
unsigned long pmc_size;
pr_info("\n"); pr_info("\n");
pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid.real); pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid.real);
...@@ -282,8 +283,10 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl, ...@@ -282,8 +283,10 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
* Step 0 -- prepare * Step 0 -- prepare
*/ */
pmc_size = max(vma_area_list->priv_longest,
vma_area_list->shared_longest);
if (pmc_init(&pmc, ctl->pid.real, &vma_area_list->h, if (pmc_init(&pmc, ctl->pid.real, &vma_area_list->h,
vma_area_list->priv_longest * PAGE_SIZE)) pmc_size * PAGE_SIZE))
return -1; return -1;
ret = -1; ret = -1;
...@@ -316,7 +319,8 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl, ...@@ -316,7 +319,8 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
u64 off = 0; u64 off = 0;
u64 *map; u64 *map;
if (!vma_area_is_private(vma_area, kdat.task_size)) if (!vma_area_is_private(vma_area, kdat.task_size) &&
!vma_area_is(vma_area, VMA_ANON_SHARED))
continue; continue;
if (vma_entry_is(vma_area->e, VMA_AREA_AIORING)) { if (vma_entry_is(vma_area->e, VMA_AREA_AIORING)) {
if (delayed_dump) if (delayed_dump)
...@@ -327,8 +331,12 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl, ...@@ -327,8 +331,12 @@ static int __parasite_dump_pages_seized(struct parasite_ctl *ctl,
map = pmc_get_map(&pmc, vma_area); map = pmc_get_map(&pmc, vma_area);
if (!map) if (!map)
goto out_xfer; goto out_xfer;
if (vma_area_is(vma_area, VMA_ANON_SHARED))
ret = add_shmem_area(ctl->pid.real, vma_area->e, map);
else {
again: again:
ret = generate_iovs(vma_area, pp, map, &off, has_parent); ret = generate_iovs(vma_area, pp, map, &off,
has_parent);
if (ret == -EAGAIN) { if (ret == -EAGAIN) {
BUG_ON(delayed_dump); BUG_ON(delayed_dump);
...@@ -341,6 +349,7 @@ again: ...@@ -341,6 +349,7 @@ again:
if (ret < 0) if (ret < 0)
goto out_xfer; goto out_xfer;
} }
}
ret = dump_pages(pp, ctl, args, delayed_dump ? NULL : &xfer); ret = dump_pages(pp, ctl, args, delayed_dump ? NULL : &xfer);
if (ret) if (ret)
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "page-xfer.h" #include "page-xfer.h"
#include "rst-malloc.h" #include "rst-malloc.h"
#include "vma.h" #include "vma.h"
#include "mem.h"
#include "config.h" #include "config.h"
#include "syscall-codes.h" #include "syscall-codes.h"
...@@ -484,10 +485,11 @@ err: ...@@ -484,10 +485,11 @@ err:
return -1; return -1;
} }
int add_shmem_area(pid_t pid, VmaEntry *vma) int add_shmem_area(pid_t pid, VmaEntry *vma, u64 *map)
{ {
struct shmem_info *si; struct shmem_info *si;
unsigned long size = vma->pgoff + (vma->end - vma->start); unsigned long size = vma->pgoff + (vma->end - vma->start);
(void)map;
si = shmem_find(vma->shmid); si = shmem_find(vma->shmid);
if (si) { if (si) {
......
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