⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dasd_profile.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
字号:
#include <linux/mm.h>#include <linux/dasd.h>#include "dasd_types.h"#define PRINTK_HEADER "dasd_profile:"static long dasd_io_reqs=0; /* number of requests processed at all */static long dasd_io_secs[16]; /* histogram of request's sizes */static long dasd_io_times[16]; /* histogram of requests's times */static long dasd_io_timps[16]; /* histogram of requests's times per sector */static long dasd_io_time1[16]; /* histogram of time from build to start */static long dasd_io_time2[16]; /* histogram of time from start to irq */static long dasd_io_time2ps[16]; /* histogram of time from start to irq */static long dasd_io_time3[16]; /* histogram of time from irq to end */voiddasd_profile_add ( cqr_t *cqr ){	int ind;	long strtime,irqtime,endtime,tottime;	long tottimeps,sectors;	long help;	if ( ! cqr -> req ) 	  return;	sectors = cqr -> req -> nr_sectors;	strtime = ((cqr->startclk - cqr->buildclk) >> 12);	irqtime = ((cqr->stopclk - cqr->startclk) >> 12);	endtime = ((cqr->endclk - cqr->stopclk) >> 12);	tottime = ((cqr->endclk - cqr->buildclk) >> 12);	tottimeps = tottime / sectors;	if (! dasd_io_reqs ++){	  for ( ind = 0; ind < 16; ind ++) {		dasd_io_secs[ind] = 0;		dasd_io_times[ind]=0;		dasd_io_timps[ind]=0;		dasd_io_time1[ind]=0;		dasd_io_time2[ind]=0;		dasd_io_time2ps[ind]=0;		dasd_io_time3[ind]=0;	  }	};		for ( ind = 0, help = sectors >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_secs[ind] ++;	for ( ind = 0, help = tottime >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_times[ind] ++;	for ( ind = 0, help = tottimeps >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_timps[ind] ++;	for ( ind = 0, help = strtime >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_time1[ind] ++;	for ( ind = 0, help = irqtime >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_time2[ind] ++;	for ( ind = 0, help = (irqtime/sectors) >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_time2ps[ind] ++;	for ( ind = 0, help = endtime >> 3; 	      ind < 15 && help; 	      help = help >> 1,ind ++);	dasd_io_time3[ind] ++;}int dasd_proc_read_statistics ( char * buf, char **start, 			    off_t off, int len, int d){	int i;	int shift, help;		for ( shift = 0, help = dasd_io_reqs; 	      help > 8192; 	      help = help >> 1,shift ++);	len = sprintf ( buf, "%ld dasd I/O requests\n", dasd_io_reqs); 	len += sprintf ( buf+len, "__<4 ___8 __16 __32 __64 _128 _256 _512 __1k __2k __4k __8k _16k _32k _64k >64k\n");	len += sprintf ( buf+len, "Histogram of sizes (512B secs)\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_secs[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O times\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_times[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O times per sector\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_timps[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O time till ssch\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_time1[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O time between ssch and irq\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_time2[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O time between ssch and irq per sector\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_time2ps[i] >> shift );	}	len += sprintf ( buf+len, "\n");	len += sprintf ( buf+len, "Histogram of I/O time between irq and end\n");	for ( i = 0; i < 16; i ++) {		len += sprintf ( buf+len, "%4ld ",dasd_io_time3[i] >> shift );	}	len += sprintf ( buf+len, "\n");	return len;}typedefstruct {	union {		unsigned long long  clock;		struct {			unsigned int ts1;			unsigned int ts2 : 20;			unsigned int unused : 8;			unsigned int cpu : 4;		} __attribute__ ((packed)) s;	} __attribute__ ((packed)) u;	unsigned long caller_address;	unsigned long tag;} __attribute__ ((packed)) dasd_debug_entry;static dasd_debug_entry *dasd_debug_area = NULL;static dasd_debug_entry *dasd_debug_actual;static spinlock_t debug_lock = SPIN_LOCK_UNLOCKED;void dasd_debug ( unsigned long tag ){	long flags;	dasd_debug_entry *d;	/* initialize in first call ... */	if ( ! dasd_debug_area ) {		dasd_debug_actual = dasd_debug_area = 			(dasd_debug_entry *) get_free_page (GFP_ATOMIC);		if ( ! dasd_debug_area ) {			PRINT_WARN("No debug area allocated\n");			return;		}		memset (dasd_debug_area,0,PAGE_SIZE);	}	/* renormalize to page */	spin_lock_irqsave(&debug_lock,flags);	dasd_debug_actual = (dasd_debug_entry *)		( (unsigned long) dasd_debug_area +		  ( ( (unsigned long)dasd_debug_actual -		      (unsigned long)dasd_debug_area ) % PAGE_SIZE ) );	d = dasd_debug_actual ++;	spin_unlock_irqrestore(&debug_lock,flags);	/* write CPUID to lowest 12 bits of clock... */	__asm__ __volatile__ ( "STCK  %0"			       :"=m" (d->u.clock));	d->tag = tag;	d -> caller_address = (unsigned long) __builtin_return_address(0);	d->u.s.cpu = smp_processor_id();}int dasd_proc_read_debug ( char * buf, char **start, 		       off_t off, int len, int dd){	dasd_debug_entry *d;	char tag[9] = { 0, };	long flags;	spin_lock_irqsave(&debug_lock,flags);	len = 0;       	for( d = dasd_debug_area; 	     len < 4068 ;	     d ++ ) {		if ( *(char*)(&d->tag) == 'D' ) {			memcpy(tag,&(d->tag),4);			tag[4]=0;		}		else {			sprintf(tag,"%08lx", d->tag);			tag[8]=0;		}		len += sprintf ( buf+len,				 "%x %08x%05x %08lx (%8s)\n",				 d->u.s.cpu, d->u.s.ts1, d->u.s.ts2,				 d->caller_address,tag);	}	spin_unlock_irqrestore(&debug_lock,flags);	return len;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -