Add a migrate_vma_*() self test for mmap(MAP_SHARED) to verify that !vma_anonymous() ranges won't be migrated.
Unified · Split
| @@ -941,6 +941,41 @@ TEST_F(hmm, migrate_fault) · 940 unmodified lines | |||
| 941 | hmm_buffer_free(buffer); | 941 | hmm_buffer_free(buffer); |
| 942 | } | 942 | } |
| 943 | 943 | ||
| 944 | /* | ||
| 945 | * Migrate anonymous shared memory to device private memory. | ||
| 946 | */ | ||
| 947 | TEST_F(hmm, migrate_shared) | ||
| 948 | { | ||
| 949 | struct hmm_buffer *buffer; | ||
| 950 | unsigned long npages; | ||
| 951 | unsigned long size; | ||
| 952 | int ret; | ||
| 953 | |||
| 954 | npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift; | ||
| 955 | ASSERT_NE(npages, 0); | ||
| 956 | size = npages << self->page_shift; | ||
| 957 | |||
| 958 | buffer = malloc(sizeof(*buffer)); | ||
| 959 | ASSERT_NE(buffer, NULL); | ||
| 960 | |||
| 961 | buffer->fd = -1; | ||
| 962 | buffer->size = size; | ||
| 963 | buffer->mirror = malloc(size); | ||
| 964 | ASSERT_NE(buffer->mirror, NULL); | ||
| 965 | |||
| 966 | buffer->ptr = mmap(NULL, size, | ||
| 967 | PROT_READ | PROT_WRITE, | ||
| 968 | MAP_SHARED | MAP_ANONYMOUS, | ||
| 969 | buffer->fd, 0); | ||
| 970 | ASSERT_NE(buffer->ptr, MAP_FAILED); | ||
| 971 | |||
| 972 | /* Migrate memory to device. */ | ||
| 973 | ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_MIGRATE, buffer, npages); | ||
| 974 | ASSERT_EQ(ret, -ENOENT); | ||
| 975 | |||
| 976 | hmm_buffer_free(buffer); | ||
| 977 | } | ||
| 978 | |||
| 944 | /* | 979 | /* |
| 945 | * Try to migrate various memory types to device private memory. | 980 | * Try to migrate various memory types to device private memory. |
| 946 | */ | 981 | */ |