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

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

?? smp.c

?? ARM 嵌入式 系統 設計與實例開發 實驗教材 二源碼
?? C
字號:
/* * SMP Support * * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> * Copyright (C) 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com> * * Lots of stuff stolen from arch/alpha/kernel/smp.c * * 01/05/16 Rohit Seth <rohit.seth@intel.com>  IA64-SMP functions. Reorganized * the existing code (on the lines of x86 port). * 00/09/11 David Mosberger <davidm@hpl.hp.com> Do loops_per_jiffy * calibration on each CPU. * 00/08/23 Asit Mallick <asit.k.mallick@intel.com> fixed logical processor id * 00/03/31 Rohit Seth <rohit.seth@intel.com>	Fixes for Bootstrap Processor * & cpu_online_map now gets done here (instead of setup.c) * 99/10/05 davidm	Update to bring it in sync with new command-line processing *  scheme. * 10/13/00 Goutham Rao <goutham.rao@intel.com> Updated smp_call_function and *		smp_call_function_single to resend IPI on timeouts */#define __KERNEL_SYSCALLS__#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/init.h>#include <linux/interrupt.h>#include <linux/smp.h>#include <linux/kernel_stat.h>#include <linux/mm.h>#include <linux/delay.h>#include <linux/cache.h>#include <asm/atomic.h>#include <asm/bitops.h>#include <asm/current.h>#include <asm/delay.h>#include <asm/efi.h>#include <asm/machvec.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/page.h>#include <asm/pgalloc.h>#include <asm/pgtable.h>#include <asm/processor.h>#include <asm/ptrace.h>#include <asm/sal.h>#include <asm/system.h>#include <asm/unistd.h>#include <asm/mca.h>/* The 'big kernel lock' */spinlock_t kernel_flag __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;/* * Structure and data for smp_call_function(). This is designed to minimise static memory * requirements. It also looks cleaner. */static spinlock_t call_lock = SPIN_LOCK_UNLOCKED;struct call_data_struct {	void (*func) (void *info);	void *info;	long wait;	atomic_t started;	atomic_t finished;};static volatile struct call_data_struct *call_data;#define IPI_CALL_FUNC		0#define IPI_CPU_STOP		1static voidstop_this_cpu (void){	extern void cpu_halt (void);	/*	 * Remove this CPU:	 */	clear_bit(smp_processor_id(), &cpu_online_map);	max_xtp();	__cli();	cpu_halt();}voidhandle_IPI (int irq, void *dev_id, struct pt_regs *regs){	int this_cpu = smp_processor_id();	unsigned long *pending_ipis = &local_cpu_data->ipi_operation;	unsigned long ops;	/* Count this now; we may make a call that never returns. */	local_cpu_data->ipi_count++;	mb();	/* Order interrupt and bit testing. */	while ((ops = xchg(pending_ipis, 0)) != 0) {	  mb();	/* Order bit clearing and data access. */	  do {		unsigned long which;		which = ffz(~ops);		ops &= ~(1 << which);		switch (which) {		case IPI_CALL_FUNC:			{				struct call_data_struct *data;				void (*func)(void *info);				void *info;				int wait;				/* release the 'pointer lock' */				data = (struct call_data_struct *) call_data;				func = data->func;				info = data->info;				wait = data->wait;				mb();				atomic_inc(&data->started);				/* At this point the structure may be gone unless wait is true.  */				(*func)(info);				/* Notify the sending CPU that the task is done.  */				mb();				if (wait)					atomic_inc(&data->finished);			}			break;		case IPI_CPU_STOP:			stop_this_cpu();			break;		default:			printk(KERN_CRIT "Unknown IPI on CPU %d: %lu\n", this_cpu, which);			break;		} /* Switch */	  } while (ops);	  mb();	/* Order data access and bit testing. */	}}static inline voidsend_IPI_single (int dest_cpu, int op){	set_bit(op, &cpu_data(dest_cpu)->ipi_operation);	platform_send_ipi(dest_cpu, IA64_IPI_VECTOR, IA64_IPI_DM_INT, 0);}static inline voidsend_IPI_allbutself (int op){	int i;	for (i = 0; i < smp_num_cpus; i++) {		if (i != smp_processor_id())			send_IPI_single(i, op);	}}static inline voidsend_IPI_all (int op){	int i;	for (i = 0; i < smp_num_cpus; i++)		send_IPI_single(i, op);}static inline voidsend_IPI_self (int op){	send_IPI_single(smp_processor_id(), op);}voidsmp_send_reschedule (int cpu){	platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0);}voidsmp_flush_tlb_all (void){	smp_call_function ((void (*)(void *))__flush_tlb_all,0,1,1);	__flush_tlb_all();}/* * Run a function on another CPU *  <func>	The function to run. This must be fast and non-blocking. *  <info>	An arbitrary pointer to pass to the function. *  <nonatomic>	Currently unused. *  <wait>	If true, wait until function has completed on other CPUs. *  [RETURNS]   0 on success, else a negative status code. * * Does not return until the remote CPU is nearly ready to execute <func> * or is or has executed. */intsmp_call_function_single (int cpuid, void (*func) (void *info), void *info, int nonatomic,			  int wait){	struct call_data_struct data;	int cpus = 1;	if (cpuid == smp_processor_id()) {		printk(__FUNCTION__" trying to call self\n");		return -EBUSY;	}	data.func = func;	data.info = info;	atomic_set(&data.started, 0);	data.wait = wait;	if (wait)		atomic_set(&data.finished, 0);	spin_lock_bh(&call_lock);	call_data = &data;	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */  	send_IPI_single(cpuid, IPI_CALL_FUNC);	/* Wait for response */	while (atomic_read(&data.started) != cpus)		barrier();	if (wait)		while (atomic_read(&data.finished) != cpus)			barrier();	call_data = NULL;	spin_unlock_bh(&call_lock);	return 0;}/* * this function sends a 'generic call function' IPI to all other CPUs * in the system. *//* *  [SUMMARY]	Run a function on all other CPUs. *  <func>	The function to run. This must be fast and non-blocking. *  <info>	An arbitrary pointer to pass to the function. *  <nonatomic>	currently unused. *  <wait>	If true, wait (atomically) until function has completed on other CPUs. *  [RETURNS]   0 on success, else a negative status code. * * Does not return until remote CPUs are nearly ready to execute <func> or are or have * executed. * * You must not call this function with disabled interrupts or from a hardware interrupt * handler, you may call it from a bottom half handler. */intsmp_call_function (void (*func) (void *info), void *info, int nonatomic, int wait){	struct call_data_struct data;	int cpus = smp_num_cpus-1;	if (!cpus)		return 0;	data.func = func;	data.info = info;	atomic_set(&data.started, 0);	data.wait = wait;	if (wait)		atomic_set(&data.finished, 0);	spin_lock_bh(&call_lock);	call_data = &data;	mb();	/* ensure store to call_data precedes setting of IPI_CALL_FUNC */	send_IPI_allbutself(IPI_CALL_FUNC);	/* Wait for response */	while (atomic_read(&data.started) != cpus)		barrier();	if (wait)		while (atomic_read(&data.finished) != cpus)			barrier();	call_data = NULL;	spin_unlock_bh(&call_lock);	return 0;}voidsmp_do_timer (struct pt_regs *regs){	int user = user_mode(regs);	if (--local_cpu_data->prof_counter <= 0) {		local_cpu_data->prof_counter = local_cpu_data->prof_multiplier;		update_process_times(user);	}}/* * this function calls the 'stop' function on all other CPUs in the system. */voidsmp_send_stop (void){	send_IPI_allbutself(IPI_CPU_STOP);	smp_num_cpus = 1;}int __initsetup_profiling_timer (unsigned int multiplier){	return -EINVAL;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品主播直播| 日韩理论片网站| 亚洲一区二区三区免费视频| 99久久精品国产一区二区三区 | 国产精品毛片久久久久久| 亚洲国产精品久久人人爱蜜臀| 91黄色免费看| 综合网在线视频| 成人激情小说乱人伦| 国产日韩欧美精品综合| 成人动漫一区二区在线| 久久久不卡影院| 国产精品美女视频| 成人免费看视频| 国产日产欧产精品推荐色 | 久久爱另类一区二区小说| 欧美体内she精高潮| 亚洲精品国产品国语在线app| 欧美日韩国产片| 亚洲精品老司机| 91日韩一区二区三区| 午夜视黄欧洲亚洲| 久久久久久久av麻豆果冻| 成人午夜免费视频| 亚洲香肠在线观看| 欧美岛国在线观看| 成人性生交大片免费看视频在线 | 在线观看三级视频欧美| 天堂va蜜桃一区二区三区漫画版| 欧美肥妇free| 成人一级片在线观看| 亚洲一区在线视频| 国产精品久久久久毛片软件| 欧美日韩久久久一区| 国产激情视频一区二区三区欧美 | 日韩精品中文字幕在线不卡尤物| 欧美中文字幕亚洲一区二区va在线| 亚洲自拍与偷拍| 日本一区二区免费在线| 欧美日韩一区国产| 国产精品小仙女| 久久激情五月激情| 亚洲成av人片一区二区梦乃| 欧美激情一区在线观看| ww亚洲ww在线观看国产| 6080亚洲精品一区二区| 色八戒一区二区三区| 不卡的看片网站| 青青草伊人久久| 日产国产欧美视频一区精品| 日韩vs国产vs欧美| 日韩制服丝袜av| 亚洲一区二区三区精品在线| 一级特黄大欧美久久久| 国产精品久久久久婷婷| 欧美极品美女视频| 中文字幕一区三区| 亚洲日本电影在线| 中文字幕一区三区| 国产亚洲va综合人人澡精品| 26uuu精品一区二区三区四区在线| 精品国产一区二区三区久久影院| 欧美酷刑日本凌虐凌虐| 精品视频在线免费| 欧美视频第二页| 777午夜精品免费视频| 精品国产乱码久久久久久久| 久久精品在线观看| 亚洲视频在线一区二区| 午夜伊人狠狠久久| 久久er精品视频| 不卡视频一二三| 日韩欧美一级片| 国产精品成人免费| 日本中文在线一区| 成人高清视频在线观看| 色香蕉成人二区免费| 欧美丝袜第三区| 久久亚洲精华国产精华液| **网站欧美大片在线观看| 日韩高清一级片| 91在线播放网址| 精品久久久久久久久久久久包黑料| 中文字幕va一区二区三区| 亚洲三级免费观看| 麻豆91在线播放免费| 在线不卡一区二区| 亚洲香肠在线观看| 丁香啪啪综合成人亚洲小说| 欧美日韩一区二区三区视频| 欧美videossexotv100| 亚洲电影一级片| 欧美最新大片在线看| 精品女同一区二区| 一区二区三区在线不卡| 天天综合日日夜夜精品| 97久久人人超碰| 中文无字幕一区二区三区 | 日韩电影在线一区| 欧美亚洲愉拍一区二区| 欧美va亚洲va| 国产精品资源在线观看| 久久欧美一区二区| 国产自产视频一区二区三区| 678五月天丁香亚洲综合网| 亚洲成人免费视| 欧美国产精品v| av一二三不卡影片| 亚洲精品综合在线| 欧美男女性生活在线直播观看| 国产精品久久网站| 色狠狠色噜噜噜综合网| 亚洲一区二区四区蜜桃| 在线观看国产日韩| 一区二区三区在线观看欧美| 色综合久久66| 久久国产综合精品| 国产日韩在线不卡| 99精品国产热久久91蜜凸| 国产精品久久久一本精品| 91亚洲午夜精品久久久久久| 亚洲免费色视频| 欧美日本一区二区在线观看| 美女mm1313爽爽久久久蜜臀| 欧美高清在线视频| 欧美性色黄大片手机版| 国产一区二区在线视频| 亚洲一二三四区不卡| 91精品国产91热久久久做人人| 6080日韩午夜伦伦午夜伦| 色呦呦国产精品| 亚洲激情图片小说视频| 久久久久亚洲蜜桃| 制服丝袜国产精品| 91丨九色丨国产丨porny| 麻豆91免费看| 日韩av电影天堂| 丝袜亚洲另类欧美综合| 日韩美女视频19| 国产精品天天看| 久久亚洲免费视频| 亚洲精品一区二区三区影院| 在线影院国内精品| 91久久久免费一区二区| 91亚洲国产成人精品一区二三| 国产91在线观看丝袜| 国产91在线看| 成人av资源站| www.在线成人| 欧美中文字幕一区二区三区亚洲| 97se亚洲国产综合在线| 91美女精品福利| 91亚洲精品一区二区乱码| 91视频一区二区三区| 色婷婷国产精品| 欧美亚洲国产怡红院影院| 欧美在线综合视频| 欧美剧情片在线观看| 日韩欧美色综合| 中文字幕av一区二区三区高| 综合久久久久综合| 午夜精品久久久久久久久久久| 视频一区在线播放| 国产经典欧美精品| 在线观看亚洲专区| 欧美精品一区二区三区在线播放| 久久久久久一二三区| 亚洲精品亚洲人成人网 | 国产精品入口麻豆原神| 一区二区三区四区蜜桃| 日本不卡免费在线视频| 国产.精品.日韩.另类.中文.在线.播放 | 国产欧美日韩三级| 一区二区免费视频| 色婷婷综合久久久中文字幕| 亚洲另类在线一区| 在线观看91精品国产入口| 亚洲男人天堂av| 在线欧美小视频| 一区二区三区四区蜜桃| 欧美影院精品一区| 日本中文字幕一区二区有限公司| 欧美日韩你懂的| 久久精品99国产国产精| 国产亚洲短视频| 成人精品鲁一区一区二区| 国产精品久久久久aaaa樱花| 色婷婷精品久久二区二区蜜臀av| 亚洲国产精品一区二区www在线| 91麻豆精品91久久久久同性| 激情综合色丁香一区二区| 国产精品免费免费| 樱桃国产成人精品视频| 久久精品国产精品青草| 51久久夜色精品国产麻豆| 亚洲电影视频在线| 欧美一区二区三区免费观看视频| 亚洲一区日韩精品中文字幕| 欧美视频一区二区| 午夜精品一区二区三区三上悠亚|