mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-21 09:10:10 +00:00
shmid contains a file id for file mappings. It's required to determine, which VMA-s are cowed. The parent maps a VMA and saves premmaped address. Then child trys to determing, which VMA-s must be inhereted from parent, for that it compares addresses, flags and file id. We don't want to transfer vma_area-s in restorer, so when a VMA entry is copied in restorer memory, the premmaped address is save in shmid. Signed-off-by: Andrey Vagin <avagin@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
53 lines
1.5 KiB
C
53 lines
1.5 KiB
C
#ifndef __CR_VMA_H__
|
|
#define __CR_VMA_H__
|
|
|
|
#include "list.h"
|
|
#include "protobuf/vma.pb-c.h"
|
|
|
|
struct vm_area_list {
|
|
struct list_head h;
|
|
unsigned nr;
|
|
unsigned long priv_size; /* nr of pages in private VMAs */
|
|
unsigned long longest; /* nr of pages in longest VMA */
|
|
};
|
|
|
|
#define VM_AREA_LIST(name) struct vm_area_list name = { .h = LIST_HEAD_INIT(name.h), .nr = 0, }
|
|
|
|
struct vma_area {
|
|
struct list_head list;
|
|
VmaEntry vma;
|
|
|
|
union {
|
|
int vm_file_fd;
|
|
int vm_socket_id;
|
|
};
|
|
unsigned long *page_bitmap; /* existent pages */
|
|
unsigned long *ppage_bitmap; /* parent's existent pages */
|
|
|
|
unsigned long premmaped_addr;
|
|
};
|
|
|
|
extern int collect_mappings(pid_t pid, struct vm_area_list *vma_area_list);
|
|
extern void free_mappings(struct vm_area_list *vma_area_list);
|
|
extern bool privately_dump_vma(struct vma_area *vma);
|
|
|
|
#define vma_area_is(vma_area, s) vma_entry_is(&((vma_area)->vma), s)
|
|
#define vma_area_len(vma_area) vma_entry_len(&((vma_area)->vma))
|
|
#define vma_entry_is(vma, s) (((vma)->status & (s)) == (s))
|
|
#define vma_entry_len(vma) ((vma)->end - (vma)->start)
|
|
|
|
/*
|
|
* vma_premmaped_start() can be used only in restorer.
|
|
* In other cases vma_area->premmaped_addr must be used.
|
|
* This hack is required, because vma_area isn't tranfered in restorer and
|
|
* shmid is used to determing which vma-s are cowed.
|
|
*/
|
|
#define vma_premmaped_start(vma) ((vma)->shmid)
|
|
|
|
static inline int in_vma_area(struct vma_area *vma, unsigned long addr)
|
|
{
|
|
return addr >= (unsigned long)vma->vma.start &&
|
|
addr < (unsigned long)vma->vma.end;
|
|
}
|
|
|
|
#endif /* __CR_VMA_H__ */
|