7
7
8
8
#define pr_fmt (fmt ) "damon-va: " fmt
9
9
10
+ #include <asm-generic/mman-common.h>
10
11
#include <linux/damon.h>
11
12
#include <linux/hugetlb.h>
12
13
#include <linux/mm.h>
@@ -658,6 +659,60 @@ bool damon_va_target_valid(void *target)
658
659
return false;
659
660
}
660
661
662
+ #ifndef CONFIG_ADVISE_SYSCALLS
663
+ static int damos_madvise (struct damon_target * target , struct damon_region * r ,
664
+ int behavior )
665
+ {
666
+ return - EINVAL ;
667
+ }
668
+ #else
669
+ static int damos_madvise (struct damon_target * target , struct damon_region * r ,
670
+ int behavior )
671
+ {
672
+ struct mm_struct * mm ;
673
+ int ret = - ENOMEM ;
674
+
675
+ mm = damon_get_mm (target );
676
+ if (!mm )
677
+ goto out ;
678
+
679
+ ret = do_madvise (mm , PAGE_ALIGN (r -> ar .start ),
680
+ PAGE_ALIGN (r -> ar .end - r -> ar .start ), behavior );
681
+ mmput (mm );
682
+ out :
683
+ return ret ;
684
+ }
685
+ #endif /* CONFIG_ADVISE_SYSCALLS */
686
+
687
+ int damon_va_apply_scheme (struct damon_ctx * ctx , struct damon_target * t ,
688
+ struct damon_region * r , struct damos * scheme )
689
+ {
690
+ int madv_action ;
691
+
692
+ switch (scheme -> action ) {
693
+ case DAMOS_WILLNEED :
694
+ madv_action = MADV_WILLNEED ;
695
+ break ;
696
+ case DAMOS_COLD :
697
+ madv_action = MADV_COLD ;
698
+ break ;
699
+ case DAMOS_PAGEOUT :
700
+ madv_action = MADV_PAGEOUT ;
701
+ break ;
702
+ case DAMOS_HUGEPAGE :
703
+ madv_action = MADV_HUGEPAGE ;
704
+ break ;
705
+ case DAMOS_NOHUGEPAGE :
706
+ madv_action = MADV_NOHUGEPAGE ;
707
+ break ;
708
+ default :
709
+ pr_warn ("Wrong action %d\n" , scheme -> action );
710
+ return - EINVAL ;
711
+ }
712
+
713
+ return damos_madvise (t , r , madv_action );
714
+ }
715
+
661
716
void damon_va_set_primitives (struct damon_ctx * ctx )
662
717
{
663
718
ctx -> primitive .init = damon_va_init ;
@@ -667,6 +722,7 @@ void damon_va_set_primitives(struct damon_ctx *ctx)
667
722
ctx -> primitive .reset_aggregated = NULL ;
668
723
ctx -> primitive .target_valid = damon_va_target_valid ;
669
724
ctx -> primitive .cleanup = NULL ;
725
+ ctx -> primitive .apply_scheme = damon_va_apply_scheme ;
670
726
}
671
727
672
728
#include "vaddr-test.h"
0 commit comments