On Tue, 18 Oct 2022 at 12:36, Muhammad Usama Anjum usama.anjum@collabora.com wrote: [...]
I've included the masks which the CRIU developers have specified. max_out_page is another new optional variable which is needed to terminate the operation without visiting all the pages after finding the max_out_page number of desired pages. There is no way to terminate the operation without this variable.
How does the interface looks now? Please comment.
/* PAGEMAP IOCTL */ #define PAGEMAP_GET _IOWR('f', 16, struct pagemap_sd_args) #define PAGEMAP_CLEAR _IOWR('f', 17, struct pagemap_sd_args) #define PAGEMAP_GET_AND_CLEAR _IOWR('f', 18, struct pagemap_sd_args)
Why are three IOCTLs needed? Could CLEAR be a flag (like the PAGEMAP_NO_REUSED_REGIONS) or 'cmask' and GET be implied when vec != NULL?
/* Bits are set in the bitmap of the page_region and masks in pagemap_sd_args */ #define PAGE_IS_SD 1 << 0 #define PAGE_IS_FILE 1 << 1 #define PAGE_IS_PRESENT 1 << 2 #define PAGE_IS_SWAPED 1 << 3
/**
- struct page_region - Page region with bitmap flags
- @start: Start of the region
- @len: Length of the region
- bitmap: Bits sets for the region
*/ struct page_region { __u64 start; __u64 len; __u64 bitmap; };
Could you explain what units start and len are using? Are they bytes or pages (what size)?
/**
- struct pagemap_sd_args - Soft-dirty IOCTL argument
Nit: it's not soft-dirty-specific anymore. Maybe "pagemap_scan_args"?
- @start: Starting address
- @len: Length of the region
- @vec: Output page_region struct array
- @vec_len: Length of the page_region struct array
- @max_out_page: Optional max output pages (It must be less than
vec_len if specified)
Why is it required to be less than vec_len? vec_len effectively specifies max number of ranges to find, and this new additional field counts pages, I suppose? BTW, if we count pages, then what size of them? Maybe using bytes (matching start/len fields) would be more consistent?
- @flags: Special flags for the IOCTL
- @rmask: Special flags for the IOCTL
- @amask: Special flags for the IOCTL
- @emask: Special flags for the IOCTL
- @__reserved: Reserved member to preserve data alignment. Must be 0.
*/ struct pagemap_sd_args { __u64 __user start; __u64 len; __u64 __user vec; // page_region __u64 vec_len; // sizeof(page_region) __u32 flags; // special flags __u32 rmask; __u32 amask; __u32 emask; __u32 max_out_page; __u32 __reserved; };
/* Special flags */ #define PAGEMAP_NO_REUSED_REGIONS 0x1
What does this flag do?
Best Regards Michał Mirosław