clear_range_l1, clear_range_middle: Fix handling contiguous PTE

Change-Id: I2609c94d7f9342fe25aa9a5cfc208375274d46fa
This commit is contained in:
Masamichi Takagi
2018-12-13 16:54:05 +09:00
committed by Dominique Martinet
parent c1270cdf6d
commit 641d9f1b39
5 changed files with 97 additions and 98 deletions

View File

@@ -20,6 +20,7 @@
#include <errno.h>
#include <list.h>
#include <pager.h>
#include <page.h>
enum {
/* for memobj.flags */
@@ -153,4 +154,31 @@ int hugefileobj_create(struct memobj *obj, size_t len, off_t off,
int *pgshiftp, uintptr_t virt_addr);
void hugefileobj_cleanup(void);
static inline int is_flushable(struct page *page, struct memobj *memobj)
{
/* Only memory with backing store needs flush */
if (!page || !page_is_in_memobj(page))
return 0;
/* memobj could be NULL when calling ihk_mc_pt_clear_range()
* for range with memobj with pages.
* We don't call .flush_page for /dev/shm/ map.
*/
if (!memobj || (memobj->flags & (MF_ZEROFILL | MF_PRIVATE)))
return 0;
return 1;
}
static inline int is_freeable(struct memobj *memobj)
{
/* XPMEM attachment isn't freeable because it's an additional
* map to the first map of the exposed area.
*/
if (memobj && (memobj->flags & MF_XPMEM))
return 0;
return 1;
}
#endif /* HEADER_MEMOBJ_H */

View File

@@ -1000,6 +1000,7 @@ int free_process_memory_range(struct process_vm *vm, struct vm_range *range)
if (range->memobj) {
memobj_ref(range->memobj);
}
if (range->memobj && range->memobj->flags & MF_HUGETLBFS) {
error = ihk_mc_pt_clear_range(vm->address_space->page_table,
vm, (void *)start, (void *)end);

View File

@@ -266,17 +266,19 @@ static void shmobj_destroy(struct shmobj *obj)
__FUNCTION__, page->phys);
}
/* Other call sites of page_unmap are:
* (1) MADV_REMOVE --> ... --> ihk_mc_pt_free_range()
* (2) munmap --> ... --> free_process_memory_range()
*/
if (page_unmap(page)) {
size_t free_pgsize = 1UL << obj->pgshift;
size_t free_size = 1UL << obj->pgshift;
ihk_mc_free_pages_user(page_va, npages);
/* Track change in page->count for shmobj.
* It is decremented in here or shmobj_invalidate()
* or clear_range().
*/
dkprintf("%lx-,%s: calling memory_stat_rss_sub(),phys=%lx,size=%ld,pgsize=%ld\n",
phys, __func__, phys, 1UL << obj->pgshift,
1UL << obj->pgshift);
memory_stat_rss_sub(1UL << obj->pgshift,
1UL << obj->pgshift);
phys, __func__, phys, free_size,
free_pgsize);
memory_stat_rss_sub(free_size, free_pgsize);
kfree(page);
}
#if 0