clear_range_l1, clear_range_middle: Fix handling contiguous PTE
Change-Id: I2609c94d7f9342fe25aa9a5cfc208375274d46fa
This commit is contained in:
committed by
Dominique Martinet
parent
c1270cdf6d
commit
641d9f1b39
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user