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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? imaxoff.c

?? Linux2.4.20針對三星公司的s3c2410開發(fā)板的內(nèi)核改造。
?? C
字號:
/* * FILE NAME imaxoff.c * * BRIEF MODULE DESCRIPTION * This file implements the tracking of the places where interrupts * are turned off. * * Author: David Singleton  *	MontaVista Software, Inc. *      support@mvista.com * * Copyright 2001 MontaVista Software Inc. * *  This program is free software; you can redistribute  it and/or modify it *  under  the terms of  the GNU General  Public License as published by the *  Free Software Foundation;  either version 2 of the  License, or (at your *  option) any later version. * *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  You should have received a copy of the  GNU General Public License along *  with this program; if not, write  to the Free Software Foundation, Inc., *  675 Mass Ave, Cambridge, MA 02139, USA. */#include <asm/system.h>#include <linux/time.h>#include <linux/proc_fs.h>#include <linux/init.h>#include <linux/ilatency.h>#include <asm/preem_latency.h>unsigned ticks_per_usec;static const char *cli_file;static unsigned cli_line_no;static unsigned cli_ticks;static int latency_debug = 0;interrupt_latency_log_t latency = {	0,	"worst case interrupt hold off",	0,	0,	0,	1,	0xffffffff,	0,	0,	0,	0,	0,	0,	0,	0,	0};/* * on PPC and MIPs we branch-link here from ret_from_exception to * catch interrupts coming back on.  We also just log the fact that * interrupts are coming back on, we don't actually turn them on, thus * the third parameter, just_logging.  */void __noinstrumentintr_ret_from_exception(){	intr_sti(__BASE_FILE__, __LINE__, 1);}/*  * If this is the outer most cli we log it.  If it's a nested cli,  * that is trying to turn interupts off and they are already off * we don't note the time or call to cli. * To keep our accounting straight, we set latency.sync to 1 in * this routine and to zero in intr_sti().  This helps us keep * track that we have noted the cli for this sti.  We want to * keep cli()/sti() pairs matched.  If you have any doubt, read the code * at the file and line numbers reported in /proc/imaxoff.  If they * are the right cli/sti pairs then there is yet another hole in * the instrumentation where the kernel is turning interrupts on * and off and we've missed it. */void __noinstrument intr_cli(const char *cli_fname, unsigned cli_lineno){	unsigned flag;	__save_flags(flag); 	__intr_cli();	/* if we are not logging or we have an error, do nothing */	if (latency.logging == OFF) {		return;	}		/*  	 * If interrupts were already disabled then we don't 	 * need to log it . . this is a nested interrupt. We	 * want the outer pair of cli/sti.	 */	if (!INTERRUPTS_ENABLED(flag)) {		latency.skip_cli++;		return;	}	/* debug */	if (latency.sync == 1) {		latency.cli_error++;	}	latency.sync = 1;	latency.iret_count = 0;	/* Read the Time Stamp Counter */	cli_file = cli_fname;	cli_line_no = cli_lineno;	readclock(cli_ticks);	return;}/* * We want to make sure we have the sti that corresponds to the cli * caught above.  To do this we make sure the sync count is 1, as set * by intr_cli().  Originally iret_count was meant to catch returns * to userland.  If we'd caught an sti() in the kernel and somehow * we went back to userland before this sti() was called the cli/sti * pair is bogus.  I don't think iret_count ever worked.  I've kept it * for historical reasons and perhaps someday I can make it work. * The just_logging parameter is for those situations where we know * we are going to be turning interrupts back on in return from * exception. We grab the information for logging only but don't  * do the __sti we let the original code path do it.  An example is the * do_IRQ path for ARM.  We know the exception handler will turn it * back on, but it's such a nest of handlers that it's easier to just * log it in do_IRQ and leave the exception handlers alone.  We do * instrument the exception handlers for PPC and MIPs, they have simple * branch-link instructions so we can make the call just before * interrupts are turned back on. */#define MAXINT	0x7fffffffvoid __noinstrument intr_sti(const char *fname, unsigned lineno,			     int just_logging){	unsigned long flag;	unsigned long sti_ticks = 0;	unsigned usecs;	unsigned long old_lowest;	int i, index;	__save_flags(flag);	/* 	 * logging is turned off in the boot path until we have registered	 * with /proc.	 */	if (latency.logging == OFF) {		goto out;	}	/* 	 * If interrupts are already on we don't have to log this call.	 */	if (INTERRUPTS_ENABLED(flag)) {		latency.skip_sti++;		goto out;	}	/*	 * Sync gets set to 1 by intr_cli.  If it's not one then we don't	 * have the right cli/sti pair.	 */	if (latency.sync != 1) {		latency.sti_error++;		goto out;	}	/*	 * If iret_count is not zero we've gone to user land and this is	 * not a valid cli/sti pair.  I pointed out that no one sets this,	 * but the originator had no comment . . 	 */	if (latency.iret_count != 0) {		latency.sti_break_error++;		goto out;	}	readclock(sti_ticks);	latency.sync = 0;	/*	 * reading the clock is platform dependent and clock_to_usecs	 * is setup by each platform as well usually in asm/preem_latency.h.  	 * get the time and log all the time for this cli/sti pair.	 */	usecs = clock_to_usecs(clock_diff(cli_ticks, sti_ticks));	inthoff_logentry(usecs);	latency.total_ints++;	/*	 * find the lowest hold off time and substitute the lowest with 	 * the new entry, iff the new entry is lower.	 * We don't keep multiple entries for the same offending	 * file and line pair.  Only one entry for printk, for example.	 * But we want the highest hold off time shown for all	 * occurances of printk . . . 	 */	old_lowest = MAXINT;	for (index = i = 0; i < NUM_LOG_ENTRIES; i++) {		if (old_lowest > latency.log[i].interrupts_off) {			old_lowest = latency.log[i].interrupts_off;			index = i;			}		if ((lineno == latency.log[i].sti_line) &&		    (cli_line_no == latency.log[i].cli_line) &&		    (fname[0] == latency.log[i].sti_file[0]) &&      		    (cli_file[0] == latency.log[i].cli_file[0])) {    			if (usecs > latency.log[i].interrupts_off)				latency.log[i].interrupts_off = usecs;			latency.log[i].multiples++;			goto out;		}	}	if ((usecs < old_lowest) && (old_lowest != MAXINT)) {		goto out;	}	latency.log[index].interrupts_off = usecs;	latency.log[index].sti_file = fname;	latency.log[index].sti_line = lineno;	latency.log[index].sti_ticks = sti_ticks;	latency.log[index].cli_file = cli_file;	latency.log[index].cli_line = cli_line_no;	latency.log[index].cli_ticks = cli_ticks;	latency.log[index].multiples++;	/*	 * We have a couple of places where we instrument	 * the code to inform us that interrupt are coming	 * back on, without actually turning them one,	 * like in arm/kernel/irq.c.  We just log it and	 * let the original code turn the interrupts back on.	 */out:	if (!just_logging)		__intr_sti();}void __noinstrument intr_restore_flags(const char *fname,				       unsigned lineno, unsigned x){	unsigned long flag;	__save_flags(flag);	if (latency.logging == OFF) {		__intr_restore_flags(x);		return;	}	if (!INTERRUPTS_ENABLED(flag) && INTERRUPTS_ENABLED(x)) {		latency.restore_sti++;		intr_sti(fname, lineno, 0);	}	if (INTERRUPTS_ENABLED(flag) && !INTERRUPTS_ENABLED(x)) {		latency.restore_cli++;		intr_cli(fname, lineno);	}	__intr_restore_flags(x);}static ssize_t __noinstrumentimaxoff_write_proc(struct file * file, const char * buf, size_t count,		   loff_t *ppos){	extern unsigned long total_ilat_samples;	extern unsigned long bucketlog[BUCKETS];        total_ilat_samples = 0;	memset(&bucketlog, 0, sizeof(unsigned long) * BUCKETS);	memset(&latency, 0, sizeof(interrupt_latency_log_t));	latency.logging = ON;	return count;}   static int g_read_completed = 0;static int __noinstrument imaxoff_read_proc(	char *page_buffer,	char **my_first_byte,	off_t virtual_start,	int length,	int *eof,	void *data){	int my_buffer_offset = 0;	char * const my_base = page_buffer;	int i;	if (virtual_start == 0) {		/* 		 * Just been opened so display the header information 		 * also stop logging  BUGBUG: stop logging while we are 		 * reading, initialize the index numbers in the log array		 */		g_read_completed = 0;		my_buffer_offset += sprintf(my_base + my_buffer_offset,		   "Maximum Interrupt Hold Off Times and Callers\n");	} else if (g_read_completed == (NUM_LOG_ENTRIES + latency_debug)) {		 *eof = 1;		 return 0;	}	if (latency_debug) {		my_buffer_offset += sprintf(my_base + my_buffer_offset,		     "iret_count %u sync %u skip_sti %u skip_cli %u\n"		     "sti_error %u cli_error %u sti_break_error %u "		     "restore_sti %u restore_cli %u\n",		     latency.iret_count, latency.sync, latency.skip_sti,		     latency.skip_cli, latency.sti_error, latency.cli_error,		     latency.sti_break_error, latency.restore_sti,		     latency.restore_cli);		g_read_completed++;	}	for (i = 0; i < NUM_LOG_ENTRIES; i++) {		my_buffer_offset += sprintf(my_base + my_buffer_offset,		    "%d) %u us interrupts off\n\tcli call in file %s"		    " (%d times)\n"		    "\tcli call at line %5u\t\n\tsti call in file %s\n"		    "\tsti call at line %5u\n"		    "\tcli timer count %10u\n\tsti timer count %10u\n", 		    i, latency.log[i].interrupts_off,		    latency.log[i].cli_file, latency.log[i].multiples,		    latency.log[i].cli_line, latency.log[i].sti_file, 		    latency.log[i].sti_line, latency.log[i].cli_ticks, 		    latency.log[i].sti_ticks);		g_read_completed++;	}	*my_first_byte = page_buffer;	return  my_buffer_offset;}int __noinstrument __initholdoffs_init(void){        struct proc_dir_entry *entry;#ifdef CONFIG_SMP	printk("Interrupt holdoff times are not supported on SMP systems.\n");	latency.logging = OFF;#else#ifdef CONFIG_PROC_FS	entry = create_proc_read_entry("imaxoff", 0, 0, imaxoff_read_proc, 0);	if (entry)		entry->write_proc = (write_proc_t *)imaxoff_write_proc;#endif /* CONFIG_PROC_FS */	readclock_init();	if (ticks_per_usec) {		printk("Interrupt holdoff maximums being captured.\n");		latency.logging = ON;	} else {		printk("Interrupt Latency timer is NOT on! No data will be collected\n");	}#endif /* ! CONFIG_SMP */	return 0;}__initcall(holdoffs_init);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品资源在线| 国产精品久久久久久久久搜平片 | 欧美日韩精品专区| 亚洲国产婷婷综合在线精品| 欧美三级电影网站| 日本不卡不码高清免费观看| 精品99999| av成人免费在线观看| 亚洲男帅同性gay1069| 欧美剧情片在线观看| 久久精品国产亚洲a| 国产精品久久久久一区 | 欧美日韩在线直播| 香蕉加勒比综合久久| 欧美精品一区视频| 91在线一区二区| 三级久久三级久久| 国产欧美日韩三区| 国产精品美女久久久久久2018 | 久久综合久久99| 91在线视频免费91| 视频在线观看一区| 国产色综合一区| 欧美日韩亚洲不卡| 国产激情视频一区二区三区欧美| 亚洲婷婷在线视频| 欧美sm极限捆绑bd| 在线观看视频欧美| 丁香一区二区三区| 蜜桃视频一区二区三区| 国产精品萝li| 欧美大片在线观看| 欧日韩精品视频| 国产精品一区免费视频| 调教+趴+乳夹+国产+精品| 国产精品水嫩水嫩| 日韩欧美国产午夜精品| 欧美自拍偷拍一区| 国产伦精品一区二区三区在线观看| 亚洲一级二级三级| 中文字幕亚洲欧美在线不卡| 日韩一区二区三区在线视频| 色av成人天堂桃色av| 国产成人免费9x9x人网站视频| 亚洲成人免费电影| 国产精品乱码久久久久久| 精品久久久久99| 制服丝袜日韩国产| 色综合久久中文字幕综合网 | 99精品视频中文字幕| 另类成人小视频在线| 亚洲国产毛片aaaaa无费看| 国产精品国产三级国产aⅴ无密码| 欧美成人国产一区二区| 欧美久久久久久蜜桃| 91成人国产精品| 99久久er热在这里只有精品66| 国内精品自线一区二区三区视频| 香蕉av福利精品导航| 亚洲日本va午夜在线影院| 日本一区二区高清| 久久久综合九色合综国产精品| 欧美剧情电影在线观看完整版免费励志电影 | 色婷婷国产精品| 成人免费视频视频| 成人一级片网址| 丰满少妇久久久久久久| 国产黄人亚洲片| 国产精品一区二区三区网站| 国产在线国偷精品产拍免费yy | 豆国产96在线|亚洲| 韩国视频一区二区| 国产美女精品一区二区三区| 国内成+人亚洲+欧美+综合在线| 久久66热偷产精品| 久久国产综合精品| 久久国产精品99久久人人澡| 美女免费视频一区二区| 免费看日韩a级影片| 久久福利视频一区二区| 国产一区二区三区四区五区美女 | 日韩一区二区在线观看视频播放| 欧美美女直播网站| 欧美人牲a欧美精品| 91精品国产一区二区三区香蕉| 欧美精品乱码久久久久久按摩| 欧美精品自拍偷拍| 日韩欧美久久久| 国产亚洲精品免费| 亚洲男人的天堂av| 亚洲成人三级小说| 麻豆国产精品一区二区三区| 国产精品一二一区| 91网站在线播放| 欧美色欧美亚洲另类二区| 欧美一区二区久久| 国产人成一区二区三区影院| 中文字幕在线观看一区| 日本aⅴ亚洲精品中文乱码| 国产精品一区久久久久| 国产伦理精品不卡| 久久综合久色欧美综合狠狠| 色一情一乱一乱一91av| 欧美日韩小视频| 久久女同精品一区二区| 日韩理论片一区二区| 亚洲五码中文字幕| 激情综合色播激情啊| www.日韩在线| 欧美猛男男办公室激情| 久久久久免费观看| 亚洲韩国精品一区| 国产自产v一区二区三区c| 91亚洲精品乱码久久久久久蜜桃| 欧美日韩高清一区二区| 久久疯狂做爰流白浆xx| 99精品国产91久久久久久| 欧美一区二区三区四区久久| 国产精品网站导航| 水蜜桃久久夜色精品一区的特点| 国产成人免费9x9x人网站视频| 日本高清不卡视频| 国产午夜精品久久久久久免费视| 亚洲精品国产a| 国产综合久久久久久鬼色| 欧美性受xxxx黑人xyx性爽| 国产视频一区二区在线| 日本sm残虐另类| 一本到三区不卡视频| 久久综合久久99| 偷偷要91色婷婷| 91视视频在线直接观看在线看网页在线看| 91精品国产日韩91久久久久久| 国产精品理论片在线观看| 美洲天堂一区二卡三卡四卡视频| 91视频一区二区三区| 久久免费国产精品| 天天操天天综合网| 色婷婷亚洲综合| 国产精品国产馆在线真实露脸 | 亚洲精品第一国产综合野| 粉嫩欧美一区二区三区高清影视| 欧美一区二区精品| 日韩激情视频网站| 欧美视频在线不卡| 亚洲摸摸操操av| av在线一区二区三区| 国产精品系列在线| 国产成人精品www牛牛影视| 亚洲精品一区二区三区蜜桃下载| 日韩精品高清不卡| 欧美精品 日韩| 亚洲成人一区二区| 欧美日韩一区不卡| 亚洲成人自拍偷拍| 欧美三级在线视频| 亚洲福利一二三区| 欧美系列亚洲系列| 亚洲韩国一区二区三区| 欧美午夜视频网站| 亚洲国产成人精品视频| 在线观看国产日韩| 一区二区三区免费| 欧美午夜精品久久久久久超碰| 亚洲乱码国产乱码精品精的特点 | 日本一不卡视频| 91精品国产综合久久精品app| 亚洲大型综合色站| 欧美色国产精品| 日韩专区欧美专区| 精品久久国产97色综合| 国产一区二区三区免费看 | 国产精品私房写真福利视频| 国产a级毛片一区| 综合欧美一区二区三区| 一本久道中文字幕精品亚洲嫩| 一区二区三区四区亚洲| 欧美三级电影网站| 久久se这里有精品| 欧美高清在线精品一区| 一本到不卡精品视频在线观看| 91在线观看高清| 一卡二卡三卡日韩欧美| 91精品国产色综合久久不卡蜜臀 | 亚洲欧美激情一区二区| 欧美亚洲动漫精品| 免费美女久久99| 国产女同互慰高潮91漫画| 91亚洲永久精品| 日韩国产成人精品| 久久久精品国产免大香伊| 91免费看视频| 三级精品在线观看| 国产欧美一区视频| 日本国产一区二区| 久久精品国产久精国产| 国产精品美女一区二区三区| 欧美亚洲一区二区在线观看| 毛片不卡一区二区| 国产精品白丝在线|