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

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

?? slab.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
 */void * kmalloc (size_t size, int flags){	cache_sizes_t *csizep = cache_sizes;	for (; csizep->cs_size; csizep++) {		if (size > csizep->cs_size)			continue;		return __kmem_cache_alloc(flags & GFP_DMA ?			 csizep->cs_dmacachep : csizep->cs_cachep, flags);	}	return NULL;}/** * kmem_cache_free - Deallocate an object * @cachep: The cache the allocation was from. * @objp: The previously allocated object. * * Free an object which was previously allocated from this * cache. */void kmem_cache_free (kmem_cache_t *cachep, void *objp){	unsigned long flags;#if DEBUG	CHECK_PAGE(virt_to_page(objp));	if (cachep != GET_PAGE_CACHE(virt_to_page(objp)))		BUG();#endif	local_irq_save(flags);	__kmem_cache_free(cachep, objp);	local_irq_restore(flags);}/** * kfree - free previously allocated memory * @objp: pointer returned by kmalloc. * * Don't free memory not originally allocated by kmalloc() * or you will run into trouble. */void kfree (const void *objp){	kmem_cache_t *c;	unsigned long flags;	if (!objp)		return;	local_irq_save(flags);	CHECK_PAGE(virt_to_page(objp));	c = GET_PAGE_CACHE(virt_to_page(objp));	__kmem_cache_free(c, (void*)objp);	local_irq_restore(flags);}kmem_cache_t * kmem_find_general_cachep (size_t size, int gfpflags){	cache_sizes_t *csizep = cache_sizes;	/* This function could be moved to the header file, and	 * made inline so consumers can quickly determine what	 * cache pointer they require.	 */	for ( ; csizep->cs_size; csizep++) {		if (size > csizep->cs_size)			continue;		break;	}	return (gfpflags & GFP_DMA) ? csizep->cs_dmacachep : csizep->cs_cachep;}#ifdef CONFIG_SMP/* called with cache_chain_sem acquired.  */static int kmem_tune_cpucache (kmem_cache_t* cachep, int limit, int batchcount){	ccupdate_struct_t new;	int i;	/*	 * These are admin-provided, so we are more graceful.	 */	if (limit < 0)		return -EINVAL;	if (batchcount < 0)		return -EINVAL;	if (batchcount > limit)		return -EINVAL;	if (limit != 0 && !batchcount)		return -EINVAL;	memset(&new.new,0,sizeof(new.new));	if (limit) {		for (i = 0; i< smp_num_cpus; i++) {			cpucache_t* ccnew;			ccnew = kmalloc(sizeof(void*)*limit+					sizeof(cpucache_t), GFP_KERNEL);			if (!ccnew)				goto oom;			ccnew->limit = limit;			ccnew->avail = 0;			new.new[cpu_logical_map(i)] = ccnew;		}	}	new.cachep = cachep;	spin_lock_irq(&cachep->spinlock);	cachep->batchcount = batchcount;	spin_unlock_irq(&cachep->spinlock);	smp_call_function_all_cpus(do_ccupdate_local, (void *)&new);	for (i = 0; i < smp_num_cpus; i++) {		cpucache_t* ccold = new.new[cpu_logical_map(i)];		if (!ccold)			continue;		local_irq_disable();		free_block(cachep, cc_entry(ccold), ccold->avail);		local_irq_enable();		kfree(ccold);	}	return 0;oom:	for (i--; i >= 0; i--)		kfree(new.new[cpu_logical_map(i)]);	return -ENOMEM;}static void enable_cpucache (kmem_cache_t *cachep){	int err;	int limit;	/* FIXME: optimize */	if (cachep->objsize > PAGE_SIZE)		return;	if (cachep->objsize > 1024)		limit = 60;	else if (cachep->objsize > 256)		limit = 124;	else		limit = 252;	err = kmem_tune_cpucache(cachep, limit, limit/2);	if (err)		printk(KERN_ERR "enable_cpucache failed for %s, error %d.\n",					cachep->name, -err);}static void enable_all_cpucaches (void){	struct list_head* p;	down(&cache_chain_sem);	p = &cache_cache.next;	do {		kmem_cache_t* cachep = list_entry(p, kmem_cache_t, next);		enable_cpucache(cachep);		p = cachep->next.next;	} while (p != &cache_cache.next);	up(&cache_chain_sem);}#endif/** * kmem_cache_reap - Reclaim memory from caches. * @gfp_mask: the type of memory required. * * Called from do_try_to_free_pages() and __alloc_pages() */int kmem_cache_reap (int gfp_mask){	slab_t *slabp;	kmem_cache_t *searchp;	kmem_cache_t *best_cachep;	unsigned int best_pages;	unsigned int best_len;	unsigned int scan;	int ret = 0;	if (gfp_mask & __GFP_WAIT)		down(&cache_chain_sem);	else		if (down_trylock(&cache_chain_sem))			return 0;	scan = REAP_SCANLEN;	best_len = 0;	best_pages = 0;	best_cachep = NULL;	searchp = clock_searchp;	do {		unsigned int pages;		struct list_head* p;		unsigned int full_free;		/* It's safe to test this without holding the cache-lock. */		if (searchp->flags & SLAB_NO_REAP)			goto next;		spin_lock_irq(&searchp->spinlock);		if (searchp->growing)			goto next_unlock;		if (searchp->dflags & DFLGS_GROWN) {			searchp->dflags &= ~DFLGS_GROWN;			goto next_unlock;		}#ifdef CONFIG_SMP		{			cpucache_t *cc = cc_data(searchp);			if (cc && cc->avail) {				__free_block(searchp, cc_entry(cc), cc->avail);				cc->avail = 0;			}		}#endif		full_free = 0;		p = searchp->slabs_free.next;		while (p != &searchp->slabs_free) {			slabp = list_entry(p, slab_t, list);#if DEBUG			if (slabp->inuse)				BUG();#endif			full_free++;			p = p->next;		}		/*		 * Try to avoid slabs with constructors and/or		 * more than one page per slab (as it can be difficult		 * to get high orders from gfp()).		 */		pages = full_free * (1<<searchp->gfporder);		if (searchp->ctor)			pages = (pages*4+1)/5;		if (searchp->gfporder)			pages = (pages*4+1)/5;		if (pages > best_pages) {			best_cachep = searchp;			best_len = full_free;			best_pages = pages;			if (pages >= REAP_PERFECT) {				clock_searchp = list_entry(searchp->next.next,							kmem_cache_t,next);				goto perfect;			}		}next_unlock:		spin_unlock_irq(&searchp->spinlock);next:		searchp = list_entry(searchp->next.next,kmem_cache_t,next);	} while (--scan && searchp != clock_searchp);	clock_searchp = searchp;	if (!best_cachep)		/* couldn't find anything to reap */		goto out;	spin_lock_irq(&best_cachep->spinlock);perfect:	/* free only 50% of the free slabs */	best_len = (best_len + 1)/2;	for (scan = 0; scan < best_len; scan++) {		struct list_head *p;		if (best_cachep->growing)			break;		p = best_cachep->slabs_free.prev;		if (p == &best_cachep->slabs_free)			break;		slabp = list_entry(p,slab_t,list);#if DEBUG		if (slabp->inuse)			BUG();#endif		list_del(&slabp->list);		STATS_INC_REAPED(best_cachep);		/* Safe to drop the lock. The slab is no longer linked to the		 * cache.		 */		spin_unlock_irq(&best_cachep->spinlock);		kmem_slab_destroy(best_cachep, slabp);		spin_lock_irq(&best_cachep->spinlock);	}	spin_unlock_irq(&best_cachep->spinlock);	ret = scan * (1 << best_cachep->gfporder);out:	up(&cache_chain_sem);	return ret;}#ifdef CONFIG_PROC_FS/* /proc/slabinfo *	cache-name num-active-objs total-objs *	obj-size num-active-slabs total-slabs *	num-pages-per-slab */#define FIXUP(t)				\	do {					\		if (len <= off) {		\			off -= len;		\			len = 0;		\		} else {			\			if (len-off > count)	\				goto t;		\		}				\	} while (0)static int proc_getdata (char*page, char**start, off_t off, int count){	struct list_head *p;	int len = 0;	/* Output format version, so at least we can change it without _too_	 * many complaints.	 */	len += sprintf(page+len, "slabinfo - version: 1.1"#if STATS				" (statistics)"#endif#ifdef CONFIG_SMP				" (SMP)"#endif				"\n");	FIXUP(got_data);	down(&cache_chain_sem);	p = &cache_cache.next;	do {		kmem_cache_t	*cachep;		struct list_head *q;		slab_t		*slabp;		unsigned long	active_objs;		unsigned long	num_objs;		unsigned long	active_slabs = 0;		unsigned long	num_slabs;		cachep = list_entry(p, kmem_cache_t, next);		spin_lock_irq(&cachep->spinlock);		active_objs = 0;		num_slabs = 0;		list_for_each(q,&cachep->slabs_full) {			slabp = list_entry(q, slab_t, list);			if (slabp->inuse != cachep->num)				BUG();			active_objs += cachep->num;			active_slabs++;		}		list_for_each(q,&cachep->slabs_partial) {			slabp = list_entry(q, slab_t, list);			if (slabp->inuse == cachep->num || !slabp->inuse)				BUG();			active_objs += slabp->inuse;			active_slabs++;		}		list_for_each(q,&cachep->slabs_free) {			slabp = list_entry(q, slab_t, list);			if (slabp->inuse)				BUG();			num_slabs++;		}		num_slabs+=active_slabs;		num_objs = num_slabs*cachep->num;		len += sprintf(page+len, "%-17s %6lu %6lu %6u %4lu %4lu %4u",			cachep->name, active_objs, num_objs, cachep->objsize,			active_slabs, num_slabs, (1<<cachep->gfporder));#if STATS		{			unsigned long errors = cachep->errors;			unsigned long high = cachep->high_mark;			unsigned long grown = cachep->grown;			unsigned long reaped = cachep->reaped;			unsigned long allocs = cachep->num_allocations;			len += sprintf(page+len, " : %6lu %7lu %5lu %4lu %4lu",					high, allocs, grown, reaped, errors);		}#endif#ifdef CONFIG_SMP		{			cpucache_t *cc = cc_data(cachep);			unsigned int batchcount = cachep->batchcount;			unsigned int limit;			if (cc)				limit = cc->limit;			else				limit = 0;			len += sprintf(page+len, " : %4u %4u",					limit, batchcount);		}#endif#if STATS && defined(CONFIG_SMP)		{			unsigned long allochit = atomic_read(&cachep->allochit);			unsigned long allocmiss = atomic_read(&cachep->allocmiss);			unsigned long freehit = atomic_read(&cachep->freehit);			unsigned long freemiss = atomic_read(&cachep->freemiss);			len += sprintf(page+len, " : %6lu %6lu %6lu %6lu",					allochit, allocmiss, freehit, freemiss);		}#endif		len += sprintf(page+len,"\n");		spin_unlock_irq(&cachep->spinlock);		FIXUP(got_data_up);		p = cachep->next.next;	} while (p != &cache_cache.next);got_data_up:	up(&cache_chain_sem);got_data:	*start = page+off;	return len;}/** * slabinfo_read_proc - generates /proc/slabinfo * @page: scratch area, one page long * @start: pointer to the pointer to the output buffer * @off: offset within /proc/slabinfo the caller is interested in * @count: requested len in bytes * @eof: eof marker * @data: unused * * The contents of the buffer are * cache-name * num-active-objs * total-objs * object size * num-active-slabs * total-slabs * num-pages-per-slab * + further values on SMP and with statistics enabled */int slabinfo_read_proc (char *page, char **start, off_t off,				 int count, int *eof, void *data){	int len = proc_getdata(page, start, off, count);	len -= (*start-page);	if (len <= count)		*eof = 1;	if (len>count) len = count;	if (len<0) len = 0;	return len;}#define MAX_SLABINFO_WRITE 128/** * slabinfo_write_proc - SMP tuning for the slab allocator * @file: unused * @buffer: user buffer * @count: data len * @data: unused */int slabinfo_write_proc (struct file *file, const char *buffer,				unsigned long count, void *data){#ifdef CONFIG_SMP	char kbuf[MAX_SLABINFO_WRITE+1], *tmp;	int limit, batchcount, res;	struct list_head *p;		if (count > MAX_SLABINFO_WRITE)		return -EINVAL;	if (copy_from_user(&kbuf, buffer, count))		return -EFAULT;	kbuf[MAX_SLABINFO_WRITE] = '\0'; 	tmp = strchr(kbuf, ' ');	if (!tmp)		return -EINVAL;	*tmp = '\0';	tmp++;	limit = simple_strtol(tmp, &tmp, 10);	while (*tmp == ' ')		tmp++;	batchcount = simple_strtol(tmp, &tmp, 10);	/* Find the cache in the chain of caches. */	down(&cache_chain_sem);	res = -EINVAL;	list_for_each(p,&cache_chain) {		kmem_cache_t *cachep = list_entry(p, kmem_cache_t, next);		if (!strcmp(cachep->name, kbuf)) {			res = kmem_tune_cpucache(cachep, limit, batchcount);			break;		}	}	up(&cache_chain_sem);	if (res >= 0)		res = count;	return res;#else	return -EINVAL;#endif}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合欧美在线视频区| 日韩精品国产精品| gogogo免费视频观看亚洲一| 久久久久久久久久美女| 国产.欧美.日韩| 国产精品不卡在线| 在线观看网站黄不卡| 亚洲第一精品在线| 欧美xxxx老人做受| 国产成人在线电影| 一区二区三区在线播| 51久久夜色精品国产麻豆| 久久激情综合网| 国产午夜精品美女毛片视频| 成人美女在线视频| 亚洲成在人线在线播放| 精品国偷自产国产一区| 成人毛片视频在线观看| 亚洲一区二区偷拍精品| 日韩视频在线永久播放| 成人高清在线视频| 日韩av一区二| 国产精品系列在线| 欧美日韩午夜精品| 国产精品一品二品| 一区二区三区在线不卡| www久久精品| 欧美综合天天夜夜久久| 蜜桃精品视频在线| 亚洲色图另类专区| 欧美v亚洲v综合ⅴ国产v| 99久久久免费精品国产一区二区| 午夜电影网一区| 国产精品网站在线播放| 欧美日韩一区二区在线观看| 国精产品一区一区三区mba桃花| 亚洲欧美日韩一区二区| 精品入口麻豆88视频| 色综合久久久久网| 国产精品一区二区三区99| 亚洲成人精品影院| 国产精品麻豆一区二区| 日韩午夜在线观看视频| 日本韩国欧美在线| 国产成人亚洲精品狼色在线 | 99天天综合性| 国产在线视频一区二区| 婷婷六月综合亚洲| 亚洲精品成人少妇| 国产精品丝袜久久久久久app| 欧美一级片在线看| 欧美视频一区二区三区| 99视频一区二区三区| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美精品在线视频| 99精品桃花视频在线观看| 国产美女av一区二区三区| 三级在线观看一区二区| 一区二区视频免费在线观看| 国产精品欧美一级免费| 欧美精品一区二区久久婷婷| 欧美一卡二卡在线| 欧美日韩极品在线观看一区| 在线观看亚洲精品视频| 91丝袜高跟美女视频| 丁香激情综合国产| 国产精品69毛片高清亚洲| 国产在线精品一区在线观看麻豆| 天天综合色天天综合| 亚洲一二三专区| 亚洲一级不卡视频| 一区二区久久久| 亚洲欧美一区二区三区久本道91| 国产精品伦理在线| 最新欧美精品一区二区三区| 国产欧美日韩麻豆91| 国产精品午夜在线观看| 国产精品嫩草影院av蜜臀| 国产日产欧产精品推荐色| 国产亚洲欧美在线| 国产日韩精品一区二区浪潮av| 国产亚洲精品免费| 欧美国产欧美亚州国产日韩mv天天看完整 | 色88888久久久久久影院野外| k8久久久一区二区三区 | 在线一区二区三区四区| 色天天综合久久久久综合片| 91美女片黄在线观看| 色美美综合视频| 欧美自拍偷拍一区| 欧美在线观看禁18| 欧美一级一区二区| 精品剧情v国产在线观看在线| 亚洲精品一线二线三线| 欧美激情一区二区| 亚洲码国产岛国毛片在线| 亚洲国产aⅴ成人精品无吗| 五月婷婷久久丁香| 裸体一区二区三区| 成熟亚洲日本毛茸茸凸凹| 91蜜桃传媒精品久久久一区二区| 色噜噜久久综合| 欧美福利电影网| 久久一二三国产| 中文字幕一区二区三区乱码在线| 亚洲欧美另类小说视频| 免费成人你懂的| 懂色av一区二区三区免费观看| 色偷偷久久人人79超碰人人澡| 制服丝袜亚洲精品中文字幕| 久久综合国产精品| 亚洲精品伦理在线| 麻豆精品视频在线| 成人av在线播放网址| 欧美日韩一二三区| 精品国一区二区三区| 自拍av一区二区三区| 日韩高清不卡一区二区三区| 国产精品一级片| 欧美性猛片xxxx免费看久爱| 日韩欧美在线影院| 最新热久久免费视频| 看片的网站亚洲| 色综合中文字幕国产 | 欧美午夜在线一二页| 精品国产一区二区三区忘忧草| 中文字幕一区二区三中文字幕| 婷婷国产在线综合| zzijzzij亚洲日本少妇熟睡| 欧美高清激情brazzers| 国产精品天美传媒沈樵| 久久精品国产精品亚洲红杏| 色婷婷av一区二区| 国产91露脸合集magnet| 波多野结衣中文字幕一区| 日韩欧美亚洲国产另类| 一区二区高清在线| 成人久久视频在线观看| 精品免费99久久| 亚洲第一狼人社区| 一本一道久久a久久精品 | 国产精品成人免费| 国产精品一区专区| 日韩一区二区麻豆国产| 一区二区三区在线播| 国产a精品视频| 欧美成人精品1314www| 亚洲福利一二三区| 色综合久久综合中文综合网| 中文字幕欧美日韩一区| 国产一区不卡在线| 精品久久五月天| 麻豆91小视频| 欧美电影精品一区二区| 日韩成人免费在线| 51午夜精品国产| 偷偷要91色婷婷| 欧美精品免费视频| 图片区小说区区亚洲影院| 欧美色偷偷大香| 亚洲线精品一区二区三区八戒| 91久久奴性调教| 一区二区三区在线视频观看| 一本到高清视频免费精品| 亚洲婷婷在线视频| 91免费观看国产| 亚洲免费在线观看| 色婷婷亚洲一区二区三区| 亚洲色图欧美在线| 欧亚一区二区三区| 香蕉影视欧美成人| 在线播放日韩导航| 日av在线不卡| 精品欧美一区二区久久| 激情丁香综合五月| 国产欧美一区二区精品性色| 成人在线综合网| 国产精品久久久久久亚洲伦| 91麻豆免费观看| 夜夜嗨av一区二区三区四季av| 在线观看三级视频欧美| 天天色天天爱天天射综合| 69p69国产精品| 久久99久国产精品黄毛片色诱| 精品国产一区二区在线观看| 亚洲三级久久久| 精品中文字幕一区二区小辣椒| 久久网站热最新地址| 国产乱码精品一区二区三区忘忧草| 国产视频一区不卡| 99久久婷婷国产| 一区二区在线观看视频在线观看| 欧美揉bbbbb揉bbbbb| 亚洲欧美激情小说另类| 欧美肥妇bbw| 国产精品18久久久久| 国产欧美日韩精品一区| 在线观看91视频| 日本少妇一区二区| 久久久噜噜噜久噜久久综合|