@@ -1548,3 +1548,72 @@ int prepare_vmas(struct pstree_item *t, struct task_restore_args *ta)
1548
1548
1549
1549
return prepare_vma_ios (t , ta );
1550
1550
}
1551
+
1552
+ int collect_madv_guards (pid_t pid , struct vm_area_list * vma_area_list )
1553
+ {
1554
+ int pagemap_fd = -1 ;
1555
+ struct page_region * regs = NULL ;
1556
+ long regs_len = 0 ;
1557
+ int i , ret = -1 ;
1558
+
1559
+ struct pm_scan_arg args = {
1560
+ .size = sizeof (struct pm_scan_arg ),
1561
+ .flags = 0 ,
1562
+ .start = 0 ,
1563
+ .end = kdat .task_size ,
1564
+ .walk_end = 0 ,
1565
+ .vec_len = 1000 , /* this should be enough for most cases */
1566
+ .max_pages = 0 ,
1567
+ .category_mask = PAGE_IS_GUARD ,
1568
+ .return_mask = PAGE_IS_GUARD ,
1569
+ };
1570
+
1571
+ if (!kdat .has_pagemap_scan_guard_pages ) {
1572
+ ret = 0 ;
1573
+ goto out ;
1574
+ }
1575
+
1576
+ pagemap_fd = open_proc (pid , "pagemap" );
1577
+ if (pagemap_fd < 0 )
1578
+ goto out ;
1579
+
1580
+ regs = xmalloc (args .vec_len * sizeof (struct page_region ));
1581
+ if (!regs )
1582
+ goto out ;
1583
+ args .vec = (long )regs ;
1584
+
1585
+ do {
1586
+ /* start from where we finished the last time */
1587
+ args .start = args .walk_end ;
1588
+ regs_len = ioctl (pagemap_fd , PAGEMAP_SCAN , & args );
1589
+ if (regs_len == -1 ) {
1590
+ pr_perror ("PAGEMAP_SCAN" );
1591
+ goto out ;
1592
+ }
1593
+
1594
+ for (i = 0 ; i < regs_len ; i ++ ) {
1595
+ struct vma_area * vma ;
1596
+
1597
+ BUG_ON (!(regs [i ].categories & PAGE_IS_GUARD ));
1598
+
1599
+ vma = alloc_vma_area ();
1600
+ if (!vma )
1601
+ goto out ;
1602
+
1603
+ vma -> e -> start = regs [i ].start ;
1604
+ vma -> e -> end = regs [i ].end ;
1605
+ vma -> e -> status = VMA_AREA_GUARD ;
1606
+
1607
+ list_add_tail (& vma -> list , & vma_area_list -> h );
1608
+ vma_area_list -> nr ++ ;
1609
+ }
1610
+ } while (args .walk_end != kdat .task_size );
1611
+
1612
+ ret = 0 ;
1613
+
1614
+ out :
1615
+ xfree (regs );
1616
+ if (pagemap_fd >= 0 )
1617
+ close (pagemap_fd );
1618
+ return ret ;
1619
+ }
0 commit comments