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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? trace.c

?? 一段基于linux的電源管理的源代碼
?? C
字號(hào):
/* * drivers/dpm/trace.c  Dynamic Power Management Tracing * * 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 program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Copyright (C) 2002, International Business Machines Corporation * All Rights Reserved * * Bishop Brock * IBM Research, Austin Center for Low-Power Computing * bcbrock@us.ibm.com * October, 2002 * *//*  DPM event tracing is a configuration option.  Tracing DPM events incurs a  non-trivial overhead in the DPM system which may impact critical latencies in  certain cases.  This tracing facility is for debugging and development  _only_, and has known "bugs" that would effect production use.  Traces are collected and stored in a fixed-length circular buffer.  Each  traced event creates an entry in this buffer, as long as the event type is  allowed by the global dpm_trace_allow mask.  Reading /proc/driver/dpm/trace  displays the traces.  Bugs:  In-memory trace structures may contain pointers to DPM components which may  have already been freed at the time that traces are displayed. In a system  where DPM objects are created and deleted often (as opposed to just once at  initialization) this might lead to a system crash.  Tracing is halted when traces are displayed by the /proc interface (rather  than e.g., locking DPM during the interval).  If sombody comes along and  restarts tracing during this period then things could get out of sync.  There is no concept of exclusive ownership of the trace buffer or the tracing  subsystem.   The /proc interface only returns one PAGE of formatted trace data.*/#include <linux/dpm.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <asm/semaphore.h>#include <asm/uaccess.h>#define DPM_TRACEBUF_LEN 1048	/* Must be > 1! */#define DPM_TRACE_PARAMS    3/* A classic circular buffer, 'empty' when the read-pointer is equal to the   write-pointer. On overflow we silently overwrite the oldest entries. */struct dpm_trace {	unsigned event;		/* Event type */	pid_t pid;		/* PID of process making request */	dpm_md_time_t time;	/* Timestamp */	unsigned long params[DPM_TRACE_PARAMS]; /* Event-specific params */};static struct dpm_trace dpm_tracebuf[DPM_TRACEBUF_LEN];static volatile unsigned rp = 0;static volatile unsigned wp = 0;static int dpm_trace_enabled = 0;static unsigned dpm_trace_allow = 0;static int dpm_trace_halted = 0;static spinlock_t dpm_trace_lock = SPIN_LOCK_UNLOCKED;static DECLARE_MUTEX(dpm_trace_sem);static struct dpm_trace *bump_rp(void){	struct dpm_trace *t = &dpm_tracebuf[rp];	if (rp == wp)		return NULL;	if (++rp >= DPM_TRACEBUF_LEN)		rp = 0;	return t;}static struct dpm_trace *bump_wp(void){	struct dpm_trace *t = &dpm_tracebuf[wp];	if (++wp >= DPM_TRACEBUF_LEN)		wp = 0;	if (rp == wp)		bump_rp();	return t;}static struct dpm_trace *unbump_wp(void){	if (rp == wp)		return NULL;	if (wp == 0)		wp = DPM_TRACEBUF_LEN - 1;	else		wp--;	return &dpm_tracebuf[wp];}voiddpm_trace(unsigned event, ...){	struct dpm_trace *t;	unsigned long flags;	va_list list;	int i;	if (!dpm_enabled)		return;	spin_lock_irqsave(dpm_trace_lock, flags);	if (dpm_trace_halted || !dpm_trace_enabled || 	    !(event & dpm_trace_allow)) {		spin_unlock_irqrestore(dpm_trace_lock, flags);		return;	}	t = bump_wp();	t->event = event;	t->pid = current->pid;	t->time = dpm_md_time();	i = 0;	va_start(list, event);	switch (event) {		/* Three args */	case DPM_TRACE_SET_TASK_STATE: /* pid, task_state, ret */		t->params[i++] = va_arg(list, unsigned long);				/* Two args */	case DPM_TRACE_SET_POLICY: /* name, ret */		t->params[i++] = va_arg(list, unsigned long);				/* One arg */	case DPM_TRACE_SET_OS:	/* state */	case DPM_TRACE_SET_OPT_ASYNC: /* opt */	case DPM_TRACE_SET_OPT_SYNC: /* opt */	case DPM_TRACE_UNLOCK:	/* needs_resync */		t->params[i++] = va_arg(list, unsigned long);		/* No args */	case DPM_TRACE_RESYNC:	case DPM_TRACE_START:	case DPM_TRACE_STOP:		break;	default:		printk(KERN_ERR "dpm_trace: ?? 0x%08x ??\n", event);		break;	}	va_end(list);	spin_unlock_irqrestore(dpm_trace_lock, flags);}voiddpm_trace_start(unsigned events){	struct dpm_trace *t;	unsigned long flags;	spin_lock_irqsave(dpm_trace_lock, flags);	dpm_trace_allow = events;	if (!dpm_trace_halted && (dpm_trace_allow & DPM_TRACE_START)) {		t = bump_wp();		t->event = DPM_TRACE_START;		t->pid = current->pid;		t->time = dpm_md_time();		t->params[0] = (unsigned long)events;	}	dpm_trace_enabled = 1;	spin_unlock_irqrestore(dpm_trace_lock, flags);}  voiddpm_trace_stop(void){	struct dpm_trace *t;	unsigned long flags;	spin_lock_irqsave(dpm_trace_lock, flags);	if (!dpm_trace_halted && (dpm_trace_allow & DPM_TRACE_STOP)) {		t = bump_wp();		t->event = DPM_TRACE_STOP;		t->pid = current->pid;		t->time = dpm_md_time();		t->params[0] = 0;	}	dpm_trace_enabled = 0;	spin_unlock_irqrestore(dpm_trace_lock, flags);}  voiddpm_trace_reset(void){	unsigned long flags;	spin_lock_irqsave(dpm_trace_lock, flags);	dpm_trace_enabled = 0;	wp = rp = 0;	spin_unlock_irqrestore(dpm_trace_lock, flags);}  static void_dpm_trace_halt(int i){	unsigned long flags;	spin_lock_irqsave(dpm_trace_lock, flags);	dpm_trace_halted = i;	spin_unlock_irqrestore(dpm_trace_lock, flags);}#define dpm_trace_halt() _dpm_trace_halt(1)#define dpm_trace_resume() _dpm_trace_halt(0)	/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * /proc/driver/dpm/trace (Read/Write) * * Read:   * * Display recent trace activity.  Trace entries are listed from the most * recent entry to the least recent entry. The format is: * * t_offset, pid: event * * Where t_offset is the 32-bit time offset from the previous entry, pid is * current->pid when the change was made, and the information for each event is * event-specific. * * Write:  * * Issue DPM tracing commands: * * reset         : Call dpm_trace_reset() * start <mask>  : Call dpm_trace_start(mask) - No mask == DPM_TRACE_ALL * stop          : Call dpm_trace_stop * filter <mask> : Set a mask to be used as a filter for the read proc.  The *                 default is DPM_TRACE_ALL.  The filter stays in effect until *                 changed by this call. *++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/#ifdef CONFIG_PROC_FSstatic unsigned dpm_read_proc_filter = DPM_TRACE_ALL;intread_proc_dpm_trace(char *page, char **start, off_t offset, 		    int count, int *eof, void *data){	int len = 0, max = PAGE_SIZE - (2 * DPM_NAME_SIZE);	unsigned save_rp, save_wp;	struct dpm_trace *t;	struct dpm_opt *opt;	dpm_md_time_t now, t_offset;	if (down_interruptible(&dpm_trace_sem))		return -ERESTARTSYS;	dpm_trace_halt();	if (wp == rp) {		len += sprintf(page + len, "Trace buffer is empty\n");		dpm_trace_resume();		up(&dpm_trace_sem);		*eof = 1;		return len;	}	save_rp = rp;	save_wp = wp;	if (!dpm_enabled)		len += sprintf(page + len, "DPM is currently disabled\n");	now = dpm_md_time();	len += sprintf(page + len, "Time now is 0x%08x%08x (%d Hz)\n",		       (u32)((now >> 32) & 0xffffffffU),		       (u32)(now & 0xffffffffU),		       		       DPM_MD_HZ);	while ((t = unbump_wp()) != NULL) {				if (!(t->event & dpm_read_proc_filter))			continue;		t_offset = now - t->time;		now = t->time;		if (t_offset != (u32)t_offset) {			len += sprintf(page + len, 				       "Now = 0x%08x%08x\n", 				       (u32)((now >> 32) & 0xffffffffU),				       (u32)(now & 0xffffffffU));			t_offset = 0;		}		len += sprintf(page + len, "%10u, %6d: ",			       (u32)t_offset, t->pid);		switch (t->event) {		case DPM_TRACE_SET_OPT_ASYNC:			len += sprintf(page + len, "set_opt_async: ");			if (t->params[0]) {				opt = (struct dpm_opt *)t->params[0];				len += sprintf(page + len, "%s", opt->name);			} else				len += sprintf(page + len, "No change");			break;		case DPM_TRACE_SET_OPT_SYNC:			len += sprintf(page + len, "set_opt_sync: ");			if (t->params[0]) {				opt = (struct dpm_opt *)(t->params[0]);				len += sprintf(page + len, "%s", opt->name);			} else				len += sprintf(page + len, "No change");			break;		case DPM_TRACE_RESYNC:			len += sprintf(page + len, "resync");			break;		case DPM_TRACE_UNLOCK:			len += sprintf(page + len, "unlock%s",				       t->params[0] ? ", resync needed" : "");			break;					case DPM_TRACE_SET_OS:			len += sprintf(page + len, "set_os(%s)",				       t->params[0] == DPM_NO_STATE ?				       "NO STATE" : 				       dpm_state_names[t->params[0]]);			break;		case DPM_TRACE_SET_POLICY:			len += sprintf(page + len, "set_policy(%s)",				       (char *)(t->params[0]));			if (t->params[1])				len += sprintf(page + len, ", failed (%d)",					       (int)(t->params[1]));			break;		case DPM_TRACE_SET_TASK_STATE:			len += sprintf(page + len, "set_task_state(%d, %d)",				       (int)(t->params[0]), 				       (int)(t->params[1]));			if (t->params[2])				len += sprintf(page + len, ", failed (%d)",					       (int)(t->params[2]));			break;		case DPM_TRACE_START:			len += sprintf(page + len, "Start tracing");			break;		case DPM_TRACE_STOP:			len += sprintf(page + len, "Stop tracing");			break;		default:			len += sprintf(page + len, "?? Event 0x%08x ??",				       t->event);			break;		}		len += sprintf(page + len, "\n");		if (len > max)			break;	}	if (t != NULL)		len += sprintf(page + len, "More ...\n");	rp = save_rp;	wp = save_wp;	dpm_trace_resume();	up(&dpm_trace_sem);	*eof = 1;	return len;}int write_proc_dpm_trace(struct file *file, const char *buffer,		     unsigned long count, void *data){	char *buf, *tok, *s;	char *whitespace = " \t\r\n";	int ret, do_filter = 0;	unsigned mask;	if (current->uid != 0)		return -EACCES;	if (count == 0)		return 0;	if (!(buf = kmalloc(count + 1, GFP_KERNEL)))		return -ENOMEM;	if (copy_from_user(buf, buffer, count)) {		kfree(buf);		return -EFAULT;	}	buf[count] = '\0';	s = buf + strspn(buf, whitespace);	tok = strsep(&s, whitespace);		if (strcmp(tok, "reset") == 0) {		dpm_trace_reset();	} else if (strcmp(tok, "stop") == 0) {		dpm_trace_stop();	} else if ((strcmp(tok, "start") == 0) ||		   (do_filter = (strcmp(tok, "filter") == 0))) {		s = s + strspn(s, whitespace);		tok = strsep(&s, whitespace);		if (*tok == '\0')			mask = DPM_TRACE_ALL;		else			mask = simple_strtol(tok, NULL, 0);		if (do_filter)			dpm_read_proc_filter = mask;		else			dpm_trace_start(mask);	} else {		ret = -EINVAL;	}	kfree(buf);	if (ret == 0)		return count;	else 		return ret;}#endif /* CONFIG_PROC_FS */  /* * Local variables: * c-basic-offset: 8 * End: */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级二级三级| 日韩欧美一区二区不卡| 日韩电影在线免费| 美国三级日本三级久久99| 日韩电影免费在线| 麻豆成人91精品二区三区| 久久99国内精品| 99精品黄色片免费大全| 91福利国产成人精品照片| 欧美裸体bbwbbwbbw| 精品国产自在久精品国产| 国产精品青草综合久久久久99| 国产精品久久777777| 日韩电影在线一区二区| 国产盗摄女厕一区二区三区| 在线观看免费成人| 久久精品无码一区二区三区| 亚洲国产日产av| 国产成人福利片| 欧美精品一区二区三区蜜臀 | 亚洲午夜国产一区99re久久| 久久99国产精品麻豆| 欧美性受xxxx黑人xyx| 国产欧美精品国产国产专区| 美女视频网站久久| 欧美日韩精品一二三区| 国产精品视频免费| 婷婷久久综合九色国产成人| 色婷婷一区二区| 国产精品久久久久久久久动漫 | 欧美亚洲一区二区在线观看| 久久综合九色欧美综合狠狠| 欧美成人精品福利| 91精品国产91久久久久久最新毛片 | 国产精品一区二区三区四区| 91精品一区二区三区在线观看| 亚洲一区二区三区在线| 91丝袜高跟美女视频| 亚洲乱码国产乱码精品精98午夜 | 国产91丝袜在线观看| 国产校园另类小说区| 岛国av在线一区| 综合久久综合久久| 日本韩国精品在线| 麻豆一区二区99久久久久| 久久久一区二区三区捆绑**| 高潮精品一区videoshd| 亚洲最新视频在线播放| 精品捆绑美女sm三区| 不卡一二三区首页| 日韩电影一区二区三区| 国产精品区一区二区三| 欧美精品一二三区| 成熟亚洲日本毛茸茸凸凹| 午夜精品久久久久久不卡8050| 精品欧美黑人一区二区三区| 99国产精品国产精品毛片| 天天综合色天天综合色h| 中文字幕一区二区三区不卡在线 | 欧美午夜片在线观看| 狠狠色狠狠色综合系列| 丝袜诱惑制服诱惑色一区在线观看 | 国产欧美日韩不卡| 欧美大尺度电影在线| 欧美三级电影网站| 在线免费观看日本一区| 成人av在线网| 91亚洲男人天堂| 99re6这里只有精品视频在线观看| 国产在线精品一区二区三区不卡| 亚洲午夜影视影院在线观看| 亚洲人成小说网站色在线| 国产无人区一区二区三区| 精品久久久久av影院| 欧美变态口味重另类| 91精品国产一区二区| 精品蜜桃在线看| 久久午夜国产精品| 国产精品视频第一区| 亚洲欧美在线视频观看| 亚洲综合激情另类小说区| 一区二区三区精密机械公司| 午夜精品福利在线| 日韩激情一二三区| 国产成人午夜精品5599| 色乱码一区二区三区88| 精品理论电影在线观看| 国产精品福利影院| 美女国产一区二区三区| 99久久综合狠狠综合久久| 欧美性极品少妇| 青青草国产成人av片免费| 亚洲成人免费视频| 国产综合久久久久久鬼色| 91影院在线观看| 国产欧美日产一区| 日本欧美韩国一区三区| 91免费看`日韩一区二区| 91精品国产一区二区三区蜜臀| 一色桃子久久精品亚洲| 麻豆91在线看| 精品嫩草影院久久| 美女mm1313爽爽久久久蜜臀| 欧美视频精品在线观看| 亚洲婷婷综合久久一本伊一区| 国内外成人在线| 日韩视频在线你懂得| 亚州成人在线电影| 欧美日韩一区高清| 亚洲gay无套男同| 91精品国产一区二区| 日本中文字幕不卡| 亚洲精品一区二区精华| 久久黄色级2电影| 精品国产乱码91久久久久久网站| 日韩成人免费电影| 国产视频在线观看一区二区三区| 精品午夜一区二区三区在线观看| 欧美一区二区三区喷汁尤物| 麻豆国产91在线播放| 久久先锋影音av| 色综合久久99| 经典三级视频一区| 国产精品国产自产拍高清av | 亚洲婷婷综合久久一本伊一区| 成人综合在线视频| 日韩中文字幕一区二区三区| 精品国产一区a| 91久久精品一区二区三| 精品一区二区三区视频| 国产精品国产精品国产专区不片| 欧美日韩国产首页在线观看| 黑人巨大精品欧美黑白配亚洲| 国产精品免费丝袜| 日韩一区二区在线看| 日本高清视频一区二区| 国产精品12区| 秋霞午夜av一区二区三区| 中文字幕va一区二区三区| 欧美大片在线观看一区二区| 一本色道久久综合精品竹菊| 国产成人免费在线观看| 久久99精品国产麻豆婷婷洗澡| 夜色激情一区二区| 亚洲伦理在线免费看| 亚洲欧美中日韩| 18涩涩午夜精品.www| 成人欧美一区二区三区在线播放| 欧美一二三四区在线| 制服丝袜亚洲精品中文字幕| 欧美喷水一区二区| 欧美日韩国产综合久久| 欧美日韩国产一级二级| 8x8x8国产精品| 日韩一区二区在线免费观看| 日韩欧美电影一二三| 日韩欧美的一区| 亚洲欧洲日产国码二区| 亚洲乱码一区二区三区在线观看| 亚洲电影第三页| 精品一区精品二区高清| 不卡av在线网| 欧美精品色综合| 欧美精彩视频一区二区三区| 亚洲靠逼com| 韩国av一区二区三区四区 | 欧美一区二区三区人| 国产精品美女久久久久aⅴ | 国产精品一区二区三区99| 欧美日韩国产经典色站一区二区三区| 成人理论电影网| 日韩精品一区二区三区四区视频| 国产日韩欧美一区二区三区综合| 亚洲三级在线观看| 狠狠色丁香婷综合久久| 欧美美女bb生活片| 亚洲欧美日韩久久| 国产精品一区久久久久| 日韩片之四级片| 美女www一区二区| 欧美日韩国产精品自在自线| 亚洲免费在线观看视频| 成人在线视频首页| 国产欧美久久久精品影院 | 欧美videofree性高清杂交| 亚洲欧美一区二区久久| 91在线观看视频| 中文字幕久久午夜不卡| 国产91精品一区二区麻豆亚洲| 日韩美一区二区三区| 久久精品免费观看| 久久综合狠狠综合久久综合88 | av资源网一区| 亚洲人成人一区二区在线观看| 成人晚上爱看视频| 国产精品电影院| 欧美日韩一区二区三区在线| 一区二区三区四区精品在线视频| 欧美色图片你懂的| 精品一区二区三区免费|