diff options
Diffstat (limited to 'mm/ksm.c')
| -rw-r--r-- | mm/ksm.c | 17 | 
1 files changed, 7 insertions, 10 deletions
@@ -296,7 +296,7 @@ static bool ksm_use_zero_pages __read_mostly;  static bool ksm_smart_scan = true;  /* The number of zero pages which is placed by KSM */ -unsigned long ksm_zero_pages; +atomic_long_t ksm_zero_pages = ATOMIC_LONG_INIT(0);  /* The number of pages that have been skipped due to "smart scanning" */  static unsigned long ksm_pages_skipped; @@ -1429,8 +1429,7 @@ static int replace_page(struct vm_area_struct *vma, struct page *page,  		 * the dirty bit in zero page's PTE is set.  		 */  		newpte = pte_mkdirty(pte_mkspecial(pfn_pte(page_to_pfn(kpage), vma->vm_page_prot))); -		ksm_zero_pages++; -		mm->ksm_zero_pages++; +		ksm_map_zero_page(mm);  		/*  		 * We're replacing an anonymous page with a zero page, which is  		 * not anonymous. We need to do proper accounting otherwise we @@ -2754,18 +2753,16 @@ static void ksm_do_scan(unsigned int scan_npages)  {  	struct ksm_rmap_item *rmap_item;  	struct page *page; -	unsigned int npages = scan_npages; -	while (npages-- && likely(!freezing(current))) { +	while (scan_npages-- && likely(!freezing(current))) {  		cond_resched();  		rmap_item = scan_get_next_rmap_item(&page);  		if (!rmap_item)  			return;  		cmp_and_merge_page(page, rmap_item);  		put_page(page); +		ksm_pages_scanned++;  	} - -	ksm_pages_scanned += scan_npages - npages;  }  static int ksmd_should_run(void) @@ -3376,7 +3373,7 @@ static void wait_while_offlining(void)  #ifdef CONFIG_PROC_FS  long ksm_process_profit(struct mm_struct *mm)  { -	return (long)(mm->ksm_merging_pages + mm->ksm_zero_pages) * PAGE_SIZE - +	return (long)(mm->ksm_merging_pages + mm_ksm_zero_pages(mm)) * PAGE_SIZE -  		mm->ksm_rmap_items * sizeof(struct ksm_rmap_item);  }  #endif /* CONFIG_PROC_FS */ @@ -3665,7 +3662,7 @@ KSM_ATTR_RO(pages_skipped);  static ssize_t ksm_zero_pages_show(struct kobject *kobj,  				struct kobj_attribute *attr, char *buf)  { -	return sysfs_emit(buf, "%ld\n", ksm_zero_pages); +	return sysfs_emit(buf, "%ld\n", atomic_long_read(&ksm_zero_pages));  }  KSM_ATTR_RO(ksm_zero_pages); @@ -3674,7 +3671,7 @@ static ssize_t general_profit_show(struct kobject *kobj,  {  	long general_profit; -	general_profit = (ksm_pages_sharing + ksm_zero_pages) * PAGE_SIZE - +	general_profit = (ksm_pages_sharing + atomic_long_read(&ksm_zero_pages)) * PAGE_SIZE -  				ksm_rmap_items * sizeof(struct ksm_rmap_item);  	return sysfs_emit(buf, "%ld\n", general_profit);  | 
