亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hugetlb.c

?? 最新最穩定的Linux內存管理模塊源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * Generic hugetlb support. * (C) William Irwin, April 2004 */#include <linux/gfp.h>#include <linux/list.h>#include <linux/init.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/seq_file.h>#include <linux/sysctl.h>#include <linux/highmem.h>#include <linux/mmu_notifier.h>#include <linux/nodemask.h>#include <linux/pagemap.h>#include <linux/mempolicy.h>#include <linux/cpuset.h>#include <linux/mutex.h>#include <linux/bootmem.h>#include <linux/sysfs.h>#include <asm/page.h>#include <asm/pgtable.h>#include <asm/io.h>#include <linux/hugetlb.h>#include "internal.h"const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL;static gfp_t htlb_alloc_mask = GFP_HIGHUSER;unsigned long hugepages_treat_as_movable;static int max_hstate;unsigned int default_hstate_idx;struct hstate hstates[HUGE_MAX_HSTATE];__initdata LIST_HEAD(huge_boot_pages);/* for command line parsing */static struct hstate * __initdata parsed_hstate;static unsigned long __initdata default_hstate_max_huge_pages;static unsigned long __initdata default_hstate_size;#define for_each_hstate(h) \	for ((h) = hstates; (h) < &hstates[max_hstate]; (h)++)/* * Protects updates to hugepage_freelists, nr_huge_pages, and free_huge_pages */static DEFINE_SPINLOCK(hugetlb_lock);/* * Region tracking -- allows tracking of reservations and instantiated pages *                    across the pages in a mapping. * * The region data structures are protected by a combination of the mmap_sem * and the hugetlb_instantion_mutex.  To access or modify a region the caller * must either hold the mmap_sem for write, or the mmap_sem for read and * the hugetlb_instantiation mutex: * * 	down_write(&mm->mmap_sem); * or * 	down_read(&mm->mmap_sem); * 	mutex_lock(&hugetlb_instantiation_mutex); */struct file_region {	struct list_head link;	long from;	long to;};static long region_add(struct list_head *head, long f, long t){	struct file_region *rg, *nrg, *trg;	/* Locate the region we are either in or before. */	list_for_each_entry(rg, head, link)		if (f <= rg->to)			break;	/* Round our left edge to the current segment if it encloses us. */	if (f > rg->from)		f = rg->from;	/* Check for and consume any regions we now overlap with. */	nrg = rg;	list_for_each_entry_safe(rg, trg, rg->link.prev, link) {		if (&rg->link == head)			break;		if (rg->from > t)			break;		/* If this area reaches higher then extend our area to		 * include it completely.  If this is not the first area		 * which we intend to reuse, free it. */		if (rg->to > t)			t = rg->to;		if (rg != nrg) {			list_del(&rg->link);			kfree(rg);		}	}	nrg->from = f;	nrg->to = t;	return 0;}static long region_chg(struct list_head *head, long f, long t){	struct file_region *rg, *nrg;	long chg = 0;	/* Locate the region we are before or in. */	list_for_each_entry(rg, head, link)		if (f <= rg->to)			break;	/* If we are below the current region then a new region is required.	 * Subtle, allocate a new region at the position but make it zero	 * size such that we can guarantee to record the reservation. */	if (&rg->link == head || t < rg->from) {		nrg = kmalloc(sizeof(*nrg), GFP_KERNEL);		if (!nrg)			return -ENOMEM;		nrg->from = f;		nrg->to   = f;		INIT_LIST_HEAD(&nrg->link);		list_add(&nrg->link, rg->link.prev);		return t - f;	}	/* Round our left edge to the current segment if it encloses us. */	if (f > rg->from)		f = rg->from;	chg = t - f;	/* Check for and consume any regions we now overlap with. */	list_for_each_entry(rg, rg->link.prev, link) {		if (&rg->link == head)			break;		if (rg->from > t)			return chg;		/* We overlap with this area, if it extends futher than		 * us then we must extend ourselves.  Account for its		 * existing reservation. */		if (rg->to > t) {			chg += rg->to - t;			t = rg->to;		}		chg -= rg->to - rg->from;	}	return chg;}static long region_truncate(struct list_head *head, long end){	struct file_region *rg, *trg;	long chg = 0;	/* Locate the region we are either in or before. */	list_for_each_entry(rg, head, link)		if (end <= rg->to)			break;	if (&rg->link == head)		return 0;	/* If we are in the middle of a region then adjust it. */	if (end > rg->from) {		chg = rg->to - end;		rg->to = end;		rg = list_entry(rg->link.next, typeof(*rg), link);	}	/* Drop any remaining regions. */	list_for_each_entry_safe(rg, trg, rg->link.prev, link) {		if (&rg->link == head)			break;		chg += rg->to - rg->from;		list_del(&rg->link);		kfree(rg);	}	return chg;}static long region_count(struct list_head *head, long f, long t){	struct file_region *rg;	long chg = 0;	/* Locate each segment we overlap with, and count that overlap. */	list_for_each_entry(rg, head, link) {		int seg_from;		int seg_to;		if (rg->to <= f)			continue;		if (rg->from >= t)			break;		seg_from = max(rg->from, f);		seg_to = min(rg->to, t);		chg += seg_to - seg_from;	}	return chg;}/* * Convert the address within this vma to the page offset within * the mapping, in pagecache page units; huge pages here. */static pgoff_t vma_hugecache_offset(struct hstate *h,			struct vm_area_struct *vma, unsigned long address){	return ((address - vma->vm_start) >> huge_page_shift(h)) +			(vma->vm_pgoff >> huge_page_order(h));}/* * Return the size of the pages allocated when backing a VMA. In the majority * cases this will be same size as used by the page table entries. */unsigned long vma_kernel_pagesize(struct vm_area_struct *vma){	struct hstate *hstate;	if (!is_vm_hugetlb_page(vma))		return PAGE_SIZE;	hstate = hstate_vma(vma);	return 1UL << (hstate->order + PAGE_SHIFT);}/* * Return the page size being used by the MMU to back a VMA. In the majority * of cases, the page size used by the kernel matches the MMU size. On * architectures where it differs, an architecture-specific version of this * function is required. */#ifndef vma_mmu_pagesizeunsigned long vma_mmu_pagesize(struct vm_area_struct *vma){	return vma_kernel_pagesize(vma);}#endif/* * Flags for MAP_PRIVATE reservations.  These are stored in the bottom * bits of the reservation map pointer, which are always clear due to * alignment. */#define HPAGE_RESV_OWNER    (1UL << 0)#define HPAGE_RESV_UNMAPPED (1UL << 1)#define HPAGE_RESV_MASK (HPAGE_RESV_OWNER | HPAGE_RESV_UNMAPPED)/* * These helpers are used to track how many pages are reserved for * faults in a MAP_PRIVATE mapping. Only the process that called mmap() * is guaranteed to have their future faults succeed. * * With the exception of reset_vma_resv_huge_pages() which is called at fork(), * the reserve counters are updated with the hugetlb_lock held. It is safe * to reset the VMA at fork() time as it is not in use yet and there is no * chance of the global counters getting corrupted as a result of the values. * * The private mapping reservation is represented in a subtly different * manner to a shared mapping.  A shared mapping has a region map associated * with the underlying file, this region map represents the backing file * pages which have ever had a reservation assigned which this persists even * after the page is instantiated.  A private mapping has a region map * associated with the original mmap which is attached to all VMAs which * reference it, this region map represents those offsets which have consumed * reservation ie. where pages have been instantiated. */static unsigned long get_vma_private_data(struct vm_area_struct *vma){	return (unsigned long)vma->vm_private_data;}static void set_vma_private_data(struct vm_area_struct *vma,							unsigned long value){	vma->vm_private_data = (void *)value;}struct resv_map {	struct kref refs;	struct list_head regions;};static struct resv_map *resv_map_alloc(void){	struct resv_map *resv_map = kmalloc(sizeof(*resv_map), GFP_KERNEL);	if (!resv_map)		return NULL;	kref_init(&resv_map->refs);	INIT_LIST_HEAD(&resv_map->regions);	return resv_map;}static void resv_map_release(struct kref *ref){	struct resv_map *resv_map = container_of(ref, struct resv_map, refs);	/* Clear out any active regions before we release the map. */	region_truncate(&resv_map->regions, 0);	kfree(resv_map);}static struct resv_map *vma_resv_map(struct vm_area_struct *vma){	VM_BUG_ON(!is_vm_hugetlb_page(vma));	if (!(vma->vm_flags & VM_SHARED))		return (struct resv_map *)(get_vma_private_data(vma) &							~HPAGE_RESV_MASK);	return NULL;}static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map){	VM_BUG_ON(!is_vm_hugetlb_page(vma));	VM_BUG_ON(vma->vm_flags & VM_SHARED);	set_vma_private_data(vma, (get_vma_private_data(vma) &				HPAGE_RESV_MASK) | (unsigned long)map);}static void set_vma_resv_flags(struct vm_area_struct *vma, unsigned long flags){	VM_BUG_ON(!is_vm_hugetlb_page(vma));	VM_BUG_ON(vma->vm_flags & VM_SHARED);	set_vma_private_data(vma, get_vma_private_data(vma) | flags);}static int is_vma_resv_set(struct vm_area_struct *vma, unsigned long flag){	VM_BUG_ON(!is_vm_hugetlb_page(vma));	return (get_vma_private_data(vma) & flag) != 0;}/* Decrement the reserved pages in the hugepage pool by one */static void decrement_hugepage_resv_vma(struct hstate *h,			struct vm_area_struct *vma){	if (vma->vm_flags & VM_NORESERVE)		return;	if (vma->vm_flags & VM_SHARED) {		/* Shared mappings always use reserves */		h->resv_huge_pages--;	} else if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) {		/*		 * Only the process that called mmap() has reserves for		 * private mappings.		 */		h->resv_huge_pages--;	}}/* Reset counters to 0 and clear all HPAGE_RESV_* flags */void reset_vma_resv_huge_pages(struct vm_area_struct *vma){	VM_BUG_ON(!is_vm_hugetlb_page(vma));	if (!(vma->vm_flags & VM_SHARED))		vma->vm_private_data = (void *)0;}/* Returns true if the VMA has associated reserve pages */static int vma_has_reserves(struct vm_area_struct *vma){	if (vma->vm_flags & VM_SHARED)		return 1;	if (is_vma_resv_set(vma, HPAGE_RESV_OWNER))		return 1;	return 0;}static void clear_gigantic_page(struct page *page,			unsigned long addr, unsigned long sz){	int i;	struct page *p = page;	might_sleep();	for (i = 0; i < sz/PAGE_SIZE; i++, p = mem_map_next(p, page, i)) {		cond_resched();		clear_user_highpage(p, addr + i * PAGE_SIZE);	}}static void clear_huge_page(struct page *page,			unsigned long addr, unsigned long sz){	int i;	if (unlikely(sz > MAX_ORDER_NR_PAGES)) {		clear_gigantic_page(page, addr, sz);		return;	}	might_sleep();	for (i = 0; i < sz/PAGE_SIZE; i++) {		cond_resched();		clear_user_highpage(page + i, addr + i * PAGE_SIZE);	}}static void copy_gigantic_page(struct page *dst, struct page *src,			   unsigned long addr, struct vm_area_struct *vma){	int i;	struct hstate *h = hstate_vma(vma);	struct page *dst_base = dst;	struct page *src_base = src;	might_sleep();	for (i = 0; i < pages_per_huge_page(h); ) {		cond_resched();		copy_user_highpage(dst, src, addr + i*PAGE_SIZE, vma);		i++;		dst = mem_map_next(dst, dst_base, i);		src = mem_map_next(src, src_base, i);	}}static void copy_huge_page(struct page *dst, struct page *src,			   unsigned long addr, struct vm_area_struct *vma){	int i;	struct hstate *h = hstate_vma(vma);	if (unlikely(pages_per_huge_page(h) > MAX_ORDER_NR_PAGES)) {		copy_gigantic_page(dst, src, addr, vma);		return;	}	might_sleep();	for (i = 0; i < pages_per_huge_page(h); i++) {		cond_resched();		copy_user_highpage(dst + i, src + i, addr + i*PAGE_SIZE, vma);	}}static void enqueue_huge_page(struct hstate *h, struct page *page){	int nid = page_to_nid(page);	list_add(&page->lru, &h->hugepage_freelists[nid]);	h->free_huge_pages++;	h->free_huge_pages_node[nid]++;}static struct page *dequeue_huge_page(struct hstate *h){	int nid;	struct page *page = NULL;	for (nid = 0; nid < MAX_NUMNODES; ++nid) {		if (!list_empty(&h->hugepage_freelists[nid])) {			page = list_entry(h->hugepage_freelists[nid].next,					  struct page, lru);			list_del(&page->lru);			h->free_huge_pages--;			h->free_huge_pages_node[nid]--;			break;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
1024国产精品| 国产福利91精品一区二区三区| 91免费看视频| 中文字幕精品一区二区三区精品| 国产成人在线色| 久久九九全国免费| 不卡在线视频中文字幕| 一区二区三区中文字幕电影| 在线观看网站黄不卡| 五月婷婷综合激情| 日韩欧美三级在线| 成人午夜视频免费看| 亚洲男人的天堂一区二区| 欧美在线小视频| 免费高清视频精品| 久久久国产午夜精品| 99久久精品免费看国产| 亚洲国产一区视频| 欧美电影免费观看高清完整版在线观看| 精品一区精品二区高清| 欧美韩日一区二区三区| 色天使色偷偷av一区二区| 日韩av网站免费在线| 精品国产乱码久久久久久老虎| 成人av小说网| 亚洲第一在线综合网站| 精品国产伦理网| 91免费观看国产| 久久er99热精品一区二区| 国产精品三级电影| 欧美高清视频不卡网| 国产精品中文字幕一区二区三区| 亚洲人成网站在线| 欧美大片国产精品| 色综合色综合色综合| 韩国成人在线视频| 一区二区日韩av| 久久蜜臀精品av| 欧美人动与zoxxxx乱| 99亚偷拍自图区亚洲| 蜜桃av一区二区三区电影| 国产精品白丝在线| 精品精品国产高清a毛片牛牛| 99v久久综合狠狠综合久久| 久久国产乱子精品免费女| 亚洲日本va午夜在线电影| ww亚洲ww在线观看国产| 欧美亚洲动漫精品| 成人三级在线视频| 九色porny丨国产精品| 午夜精品在线视频一区| 中文字幕一区二区三区精华液| 日韩欧美一区二区免费| 色婷婷综合久久久中文一区二区| 国产一区二区三区四区在线观看| 午夜av一区二区三区| ...av二区三区久久精品| 久久婷婷国产综合精品青草 | 欧美高清精品3d| 99精品热视频| 国产精品一区一区三区| 毛片av中文字幕一区二区| 一区二区三区中文在线| 欧美激情一区二区三区蜜桃视频| 精品国产sm最大网站免费看| 欧美日韩国产首页| 色婷婷综合久色| 色爱区综合激月婷婷| av毛片久久久久**hd| 国产成人精品免费看| 国产精品一区二区不卡| 国产精品影视天天线| 麻豆精品新av中文字幕| 蜜臀av性久久久久蜜臀aⅴ| 天天影视色香欲综合网老头| 亚洲国产综合色| 亚洲成国产人片在线观看| 亚洲尤物视频在线| 亚洲成人综合在线| 亚洲成a人v欧美综合天堂 | 日本电影亚洲天堂一区| 91蜜桃在线观看| 一本色道久久加勒比精品| 91天堂素人约啪| 一本一本大道香蕉久在线精品| 91麻豆免费视频| 日本久久电影网| 欧美图区在线视频| 在线不卡a资源高清| 欧美一区二区私人影院日本| 日韩一二三区不卡| 亚洲精品在线电影| 欧美极品美女视频| 亚洲天堂网中文字| 亚洲一二三四在线| 免费成人在线观看| 国产精品综合在线视频| 成人爱爱电影网址| 在线影院国内精品| 91精品欧美一区二区三区综合在| 日韩免费电影网站| 中文字幕精品三区| 亚洲第一福利视频在线| 久久se这里有精品| aaa国产一区| 欧洲日韩一区二区三区| 日韩视频不卡中文| 国产精品天美传媒沈樵| 一区二区三区在线影院| 久久99久久精品欧美| 国产成人av电影在线播放| 色婷婷激情久久| 日韩午夜在线影院| 国产精品国产a级| 午夜电影一区二区| 国产乱码精品一区二区三区忘忧草| 国产福利91精品| 欧美色图激情小说| 久久综合九色综合97_久久久| 亚洲视频一二三区| 日本欧美韩国一区三区| 成人黄色一级视频| 欧美欧美午夜aⅴ在线观看| 国产偷国产偷亚洲高清人白洁| 一区二区三区久久| 国产一区二区三区免费看 | 精品电影一区二区| 18欧美乱大交hd1984| 麻豆精品新av中文字幕| 色婷婷久久一区二区三区麻豆| 日韩精品在线一区二区| 一区二区三区四区乱视频| 精品一区二区三区视频| 欧美综合视频在线观看| 欧美经典一区二区三区| 日韩影院免费视频| 99九九99九九九视频精品| 欧美成人女星排名| 亚洲午夜免费视频| 成人黄色在线看| 2024国产精品视频| 天天综合色天天综合色h| 白白色亚洲国产精品| 精品欧美一区二区久久| 亚洲bt欧美bt精品| 成人短视频下载| 久久久久国产一区二区三区四区| 午夜精品久久久久久久蜜桃app| 成人妖精视频yjsp地址| 亚洲精品一区二区三区四区高清| 亚洲国产日韩一级| 91免费观看在线| 亚洲图片激情小说| 99久久精品国产网站| 欧美激情综合五月色丁香小说| 韩国成人在线视频| 日韩欧美一区二区免费| 日韩精品久久久久久| 在线免费亚洲电影| 亚洲另类在线一区| 99精品热视频| 中文字幕在线不卡视频| 成人国产在线观看| 中文字幕第一区综合| 国产91高潮流白浆在线麻豆| 久久一夜天堂av一区二区三区| 麻豆精品久久精品色综合| 在线播放日韩导航| 日韩精品一二区| 69久久夜色精品国产69蝌蚪网| 亚洲国产视频一区二区| 欧美中文一区二区三区| 亚洲成av人片一区二区梦乃| 欧美色综合久久| 天堂影院一区二区| 日韩一区二区三区免费看| 麻豆精品久久久| 久久免费午夜影院| 成人理论电影网| 亚洲女性喷水在线观看一区| 91福利视频久久久久| 午夜精品在线看| 日韩欧美二区三区| 狠狠色丁香婷综合久久| 国产精品视频观看| 色综合久久综合网| 午夜久久电影网| 精品成人在线观看| 成人久久18免费网站麻豆| 亚洲日本韩国一区| 666欧美在线视频| 久久aⅴ国产欧美74aaa| 国产欧美中文在线| 91麻豆免费看| 青青草精品视频| 久久久久久久久久久久电影| 成人精品一区二区三区中文字幕| 成人免费在线视频| 欧美精品丝袜中出| 国产一区二区美女诱惑|