public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Oleg Verych <olecom@flower.upol.cz>
To: linux-kernel@vger.kernel.org
Subject: Re: [PATCH for review] [6/145] x86_64: Utilize performance counter reservation framework in oprofile
Date: Fri, 11 Aug 2006 00:42:08 +0200	[thread overview]
Message-ID: <44DBB640.8040906@flower.upol.cz> (raw)
In-Reply-To: <20060810193518.394E413B90__40006.6926530146$1155241071$gmane$org@wotan.suse.de>

Andi Kleen:

> Index: linux/arch/i386/oprofile/nmi_int.c
> ===================================================================
> --- linux.orig/arch/i386/oprofile/nmi_int.c
> +++ linux/arch/i386/oprofile/nmi_int.c
> @@ -98,15 +98,19 @@ static void nmi_cpu_save_registers(struc
>  	unsigned int i;
>  
>  	for (i = 0; i < nr_ctrs; ++i) {
> -		rdmsr(counters[i].addr,
> -			counters[i].saved.low,
> -			counters[i].saved.high);
> +		if (counters[i].addr){

need space ){

> +			rdmsr(counters[i].addr,
> +				counters[i].saved.low,
> +				counters[i].saved.high);
> +		}
>  	}
>   
>  	for (i = 0; i < nr_ctrls; ++i) {
> -		rdmsr(controls[i].addr,
> -			controls[i].saved.low,
> -			controls[i].saved.high);
> +		if (controls[i].addr){

likewise

> +			rdmsr(controls[i].addr,
> +				controls[i].saved.low,
> +				controls[i].saved.high);
> +		}
>  	}
>  }
>  
> @@ -205,15 +209,19 @@ static void nmi_restore_registers(struct
>  	unsigned int i;
>  
>  	for (i = 0; i < nr_ctrls; ++i) {
> -		wrmsr(controls[i].addr,
> -			controls[i].saved.low,
> -			controls[i].saved.high);
> +		if (controls[i].addr){

likewise

> +			wrmsr(controls[i].addr,
> +				controls[i].saved.low,
> +				controls[i].saved.high);
> +		}
>  	}
>   
>  	for (i = 0; i < nr_ctrs; ++i) {
> -		wrmsr(counters[i].addr,
> -			counters[i].saved.low,
> -			counters[i].saved.high);
> +		if (counters[i].addr){

likewise

> +			wrmsr(counters[i].addr,
> +				counters[i].saved.low,
> +				counters[i].saved.high);
> +		}
>  	}
>  }
>   
> @@ -234,6 +242,7 @@ static void nmi_cpu_shutdown(void * dumm
>  	apic_write(APIC_LVTPC, saved_lvtpc[cpu]);
>  	apic_write(APIC_LVTERR, v);
>  	nmi_restore_registers(msrs);
> +	model->shutdown(msrs);
>  }
>  
>   
> @@ -284,6 +293,14 @@ static int nmi_create_files(struct super
>  		struct dentry * dir;
>  		char buf[4];
>   
> + 		/* quick little hack to _not_ expose a counter if it is not
> +		 * available for use.  This should protect userspace app.
> +		 * NOTE:  assumes 1:1 mapping here (that counters are organized
> +		 *        sequentially in their struct assignment).
> +		 */
> +		if (unlikely(!avail_to_resrv_perfctr_nmi_bit(i)))
> +			continue;
> +
>  		snprintf(buf,  sizeof(buf), "%d", i);
>  		dir = oprofilefs_mkdir(sb, root, buf);
>  		oprofilefs_create_ulong(sb, dir, "enabled", &counter_config[i].enabled); 
> Index: linux/arch/i386/oprofile/op_model_athlon.c
> ===================================================================
> --- linux.orig/arch/i386/oprofile/op_model_athlon.c
> +++ linux/arch/i386/oprofile/op_model_athlon.c
> @@ -21,10 +21,12 @@
>  #define NUM_COUNTERS 4
>  #define NUM_CONTROLS 4
>  
> +#define CTR_IS_RESERVED(msrs,c) (msrs->counters[(c)].addr ? 1 : 0)
>  #define CTR_READ(l,h,msrs,c) do {rdmsr(msrs->counters[(c)].addr, (l), (h));} while (0)
>  #define CTR_WRITE(l,msrs,c) do {wrmsr(msrs->counters[(c)].addr, -(unsigned int)(l), -1);} while (0)
>  #define CTR_OVERFLOWED(n) (!((n) & (1U<<31)))
>  
> +#define CTRL_IS_RESERVED(msrs,c) (msrs->controls[(c)].addr ? 1 : 0)
>  #define CTRL_READ(l,h,msrs,c) do {rdmsr(msrs->controls[(c)].addr, (l), (h));} while (0)
>  #define CTRL_WRITE(l,h,msrs,c) do {wrmsr(msrs->controls[(c)].addr, (l), (h));} while (0)
>  #define CTRL_SET_ACTIVE(n) (n |= (1<<22))
> @@ -40,15 +42,21 @@ static unsigned long reset_value[NUM_COU
>   
>  static void athlon_fill_in_addresses(struct op_msrs * const msrs)
>  {
> -	msrs->counters[0].addr = MSR_K7_PERFCTR0;
> -	msrs->counters[1].addr = MSR_K7_PERFCTR1;
> -	msrs->counters[2].addr = MSR_K7_PERFCTR2;
> -	msrs->counters[3].addr = MSR_K7_PERFCTR3;
> -
> -	msrs->controls[0].addr = MSR_K7_EVNTSEL0;
> -	msrs->controls[1].addr = MSR_K7_EVNTSEL1;
> -	msrs->controls[2].addr = MSR_K7_EVNTSEL2;
> -	msrs->controls[3].addr = MSR_K7_EVNTSEL3;
> +	int i;
> +
> +	for (i=0; i < NUM_COUNTERS; i++) {
> +		if (reserve_perfctr_nmi(MSR_K7_PERFCTR0 + i))
> +			msrs->counters[i].addr = MSR_K7_PERFCTR0 + i;
> +		else
> +			msrs->counters[i].addr = 0;
> +	}
> +
> +	for (i=0; i < NUM_CONTROLS; i++) {
> +		if (reserve_evntsel_nmi(MSR_K7_EVNTSEL0 + i))
> +			msrs->controls[i].addr = MSR_K7_EVNTSEL0 + i;
> +		else
> +			msrs->controls[i].addr = 0;
> +	}
>  }
>  
>   
> @@ -59,19 +67,23 @@ static void athlon_setup_ctrs(struct op_
>   
>  	/* clear all counters */
>  	for (i = 0 ; i < NUM_CONTROLS; ++i) {
> +		if (unlikely(!CTRL_IS_RESERVED(msrs,i)))
> +			continue;
>  		CTRL_READ(low, high, msrs, i);
>  		CTRL_CLEAR(low);
>  		CTRL_WRITE(low, high, msrs, i);
>  	}
> -	
> +
>  	/* avoid a false detection of ctr overflows in NMI handler */
>  	for (i = 0; i < NUM_COUNTERS; ++i) {
> +		if (unlikely(!CTR_IS_RESERVED(msrs,i)))
> +			continue;
>  		CTR_WRITE(1, msrs, i);
>  	}
>  
>  	/* enable active counters */
>  	for (i = 0; i < NUM_COUNTERS; ++i) {
> -		if (counter_config[i].enabled) {
> +		if ((counter_config[i].enabled) && (CTR_IS_RESERVED(msrs,i))) {
>  			reset_value[i] = counter_config[i].count;
>  
>  			CTR_WRITE(counter_config[i].count, msrs, i);
> @@ -98,6 +110,8 @@ static int athlon_check_ctrs(struct pt_r
>  	int i;
>  
>  	for (i = 0 ; i < NUM_COUNTERS; ++i) {
> +		if (!reset_value[i])
> +			continue;
>  		CTR_READ(low, high, msrs, i);
>  		if (CTR_OVERFLOWED(low)) {
>  			oprofile_add_sample(regs, i);
> @@ -132,12 +146,27 @@ static void athlon_stop(struct op_msrs c
>  	/* Subtle: stop on all counters to avoid race with
>  	 * setting our pm callback */
>  	for (i = 0 ; i < NUM_COUNTERS ; ++i) {
> +		if (!reset_value[i])
> +			continue;
>  		CTRL_READ(low, high, msrs, i);
>  		CTRL_SET_INACTIVE(low);
>  		CTRL_WRITE(low, high, msrs, i);
>  	}
>  }
>  
> +static void athlon_shutdown(struct op_msrs const * const msrs)
> +{
> +	int i;
> +
> +	for (i = 0 ; i < NUM_COUNTERS ; ++i) {
> +		if (CTR_IS_RESERVED(msrs,i))
> +			release_perfctr_nmi(MSR_K7_PERFCTR0 + i);
> +	}
> +	for (i = 0 ; i < NUM_CONTROLS ; ++i) {
> +		if (CTRL_IS_RESERVED(msrs,i))
> +			release_evntsel_nmi(MSR_K7_EVNTSEL0 + i);
> +	}
> +}
>  
>  struct op_x86_model_spec const op_athlon_spec = {
>  	.num_counters = NUM_COUNTERS,
> @@ -146,5 +175,6 @@ struct op_x86_model_spec const op_athlon
>  	.setup_ctrs = &athlon_setup_ctrs,
>  	.check_ctrs = &athlon_check_ctrs,
>  	.start = &athlon_start,
> -	.stop = &athlon_stop
> +	.stop = &athlon_stop,
> +	.shutdown = &athlon_shutdown
>  };
> Index: linux/arch/i386/oprofile/op_model_p4.c
> ===================================================================
> --- linux.orig/arch/i386/oprofile/op_model_p4.c
> +++ linux/arch/i386/oprofile/op_model_p4.c
> @@ -32,7 +32,7 @@
>  #define NUM_CONTROLS_HT2 (NUM_ESCRS_HT2 + NUM_CCCRS_HT2)
>  
>  static unsigned int num_counters = NUM_COUNTERS_NON_HT;
> -
> +static unsigned int num_controls = NUM_CONTROLS_NON_HT;
>  
>  /* this has to be checked dynamically since the
>     hyper-threadedness of a chip is discovered at
> @@ -40,8 +40,10 @@ static unsigned int num_counters = NUM_C
>  static inline void setup_num_counters(void)
>  {
>  #ifdef CONFIG_SMP
> -	if (smp_num_siblings == 2)
> +	if (smp_num_siblings == 2){

likewise

>  		num_counters = NUM_COUNTERS_HT2;
> +		num_controls = NUM_CONTROLS_HT2;
> +	}
>  #endif
>  }
>  
> @@ -97,15 +99,6 @@ static struct p4_counter_binding p4_coun
>  
>  #define NUM_UNUSED_CCCRS	NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT

maybe (NUM_CCCRS_NON_HT - NUM_COUNTERS_NON_HT) will be better

>  
> -/* All cccr we don't use. */
> -static int p4_unused_cccr[NUM_UNUSED_CCCRS] = {
> -	MSR_P4_BPU_CCCR1,	MSR_P4_BPU_CCCR3,
> -	MSR_P4_MS_CCCR1,	MSR_P4_MS_CCCR3,
> -	MSR_P4_FLAME_CCCR1,	MSR_P4_FLAME_CCCR3,
> -	MSR_P4_IQ_CCCR0,	MSR_P4_IQ_CCCR1,
> -	MSR_P4_IQ_CCCR2,	MSR_P4_IQ_CCCR3
> -};
> -
>  /* p4 event codes in libop/op_event.h are indices into this table. */
>  
>  static struct p4_event_binding p4_events[NUM_EVENTS] = {
> @@ -372,6 +365,8 @@ static struct p4_event_binding p4_events
>  #define CCCR_OVF_P(cccr) ((cccr) & (1U<<31))
>  #define CCCR_CLEAR_OVF(cccr) ((cccr) &= (~(1U<<31)))
>  
> +#define CTRL_IS_RESERVED(msrs,c) (msrs->controls[(c)].addr ? 1 : 0)
> +#define CTR_IS_RESERVED(msrs,c) (msrs->counters[(c)].addr ? 1 : 0)
>  #define CTR_READ(l,h,i) do {rdmsr(p4_counters[(i)].counter_address, (l), (h));} while (0)
>  #define CTR_WRITE(l,i) do {wrmsr(p4_counters[(i)].counter_address, -(u32)(l), -1);} while (0)
>  #define CTR_OVERFLOW_P(ctr) (!((ctr) & 0x80000000))
> @@ -401,29 +396,34 @@ static unsigned long reset_value[NUM_COU
>  static void p4_fill_in_addresses(struct op_msrs * const msrs)
>  {
>  	unsigned int i; 
> -	unsigned int addr, stag;
> +	unsigned int addr, cccraddr, stag;
>  
>  	setup_num_counters();
>  	stag = get_stagger();
>  
> -	/* the counter registers we pay attention to */
> +	/* initialize some registers */
>  	for (i = 0; i < num_counters; ++i) {
> -		msrs->counters[i].addr = 
> -			p4_counters[VIRT_CTR(stag, i)].counter_address;
> +		msrs->counters[i].addr = 0;
>  	}
> -
> -	/* FIXME: bad feeling, we don't save the 10 counters we don't use. */
> -
> -	/* 18 CCCR registers */
> -	for (i = 0, addr = MSR_P4_BPU_CCCR0 + stag;
> -	     addr <= MSR_P4_IQ_CCCR5; ++i, addr += addr_increment()) {
> -		msrs->controls[i].addr = addr;
> +	for (i = 0; i < num_controls; ++i) {
> +		msrs->controls[i].addr = 0;
>  	}
>  	
> +	/* the counter & cccr registers we pay attention to */
> +	for (i = 0; i < num_counters; ++i) {
> +		addr = p4_counters[VIRT_CTR(stag, i)].counter_address;
> +		cccraddr = p4_counters[VIRT_CTR(stag, i)].cccr_address;
> +		if (reserve_perfctr_nmi(addr)){

){

> +			msrs->counters[i].addr = addr;
> +			msrs->controls[i].addr = cccraddr;
> +		}
> +	}
> +
>  	/* 43 ESCR registers in three or four discontiguous group */
>  	for (addr = MSR_P4_BSU_ESCR0 + stag;
>  	     addr < MSR_P4_IQ_ESCR0; ++i, addr += addr_increment()) {
> -		msrs->controls[i].addr = addr;
> +		if (reserve_evntsel_nmi(addr))
> +			msrs->controls[i].addr = addr;
>  	}
>  
>  	/* no IQ_ESCR0/1 on some models, we save a seconde time BSU_ESCR0/1
> @@ -431,47 +431,57 @@ static void p4_fill_in_addresses(struct 
>  	if (boot_cpu_data.x86_model >= 0x3) {
>  		for (addr = MSR_P4_BSU_ESCR0 + stag;
>  		     addr <= MSR_P4_BSU_ESCR1; ++i, addr += addr_increment()) {
> -			msrs->controls[i].addr = addr;
> +			if (reserve_evntsel_nmi(addr))
> +				msrs->controls[i].addr = addr;

anyways 'if' opens braces, maybe move init of 'addr' before 'for'

>  		}
>  	} else {
>  		for (addr = MSR_P4_IQ_ESCR0 + stag;
>  		     addr <= MSR_P4_IQ_ESCR1; ++i, addr += addr_increment()) {
> -			msrs->controls[i].addr = addr;
> +			if (reserve_evntsel_nmi(addr))
> +				msrs->controls[i].addr = addr;
>  		}
>  	}
>  
>  	for (addr = MSR_P4_RAT_ESCR0 + stag;
>  	     addr <= MSR_P4_SSU_ESCR0; ++i, addr += addr_increment()) {
> -		msrs->controls[i].addr = addr;
> +		if (reserve_evntsel_nmi(addr))
> +			msrs->controls[i].addr = addr;
>  	}
>  	
>  	for (addr = MSR_P4_MS_ESCR0 + stag;
>  	     addr <= MSR_P4_TC_ESCR1; ++i, addr += addr_increment()) { 
> -		msrs->controls[i].addr = addr;
> +		if (reserve_evntsel_nmi(addr))
> +			msrs->controls[i].addr = addr;
>  	}
>  	
>  	for (addr = MSR_P4_IX_ESCR0 + stag;
>  	     addr <= MSR_P4_CRU_ESCR3; ++i, addr += addr_increment()) { 
> -		msrs->controls[i].addr = addr;
> +		if (reserve_evntsel_nmi(addr))
> +			msrs->controls[i].addr = addr;
>  	}
>  
>  	/* there are 2 remaining non-contiguously located ESCRs */
>  
>  	if (num_counters == NUM_COUNTERS_NON_HT) {		
>  		/* standard non-HT CPUs handle both remaining ESCRs*/
> -		msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> -		msrs->controls[i++].addr = MSR_P4_CRU_ESCR4;
> +		if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR5))
> +			msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> +		if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR4))
> +			msrs->controls[i++].addr = MSR_P4_CRU_ESCR4;
>  
>  	} else if (stag == 0) {

if (!stag)

>  		/* HT CPUs give the first remainder to the even thread, as
>  		   the 32nd control register */
> -		msrs->controls[i++].addr = MSR_P4_CRU_ESCR4;
> +		if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR4))
> +			msrs->controls[i++].addr = MSR_P4_CRU_ESCR4;
>  
>  	} else {
>  		/* and two copies of the second to the odd thread,
>  		   for the 22st and 23nd control registers */
> -		msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> -		msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> +		if (reserve_evntsel_nmi(MSR_P4_CRU_ESCR5)) {
> +			msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> +			msrs->controls[i++].addr = MSR_P4_CRU_ESCR5;
> +		}
>  	}
>  }
>  
> @@ -544,7 +554,6 @@ static void p4_setup_ctrs(struct op_msrs
>  {
>  	unsigned int i;
>  	unsigned int low, high;
> -	unsigned int addr;
>  	unsigned int stag;
>  
>  	stag = get_stagger();
> @@ -557,59 +566,24 @@ static void p4_setup_ctrs(struct op_msrs
>  
>  	/* clear the cccrs we will use */
>  	for (i = 0 ; i < num_counters ; i++) {
> +		if (unlikely(!CTRL_IS_RESERVED(msrs,i)))
> +			continue;
>  		rdmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high);
>  		CCCR_CLEAR(low);
>  		CCCR_SET_REQUIRED_BITS(low);
>  		wrmsr(p4_counters[VIRT_CTR(stag, i)].cccr_address, low, high);
>  	}
>  
> -	/* clear cccrs outside our concern */
> -	for (i = stag ; i < NUM_UNUSED_CCCRS ; i += addr_increment()) {
> -		rdmsr(p4_unused_cccr[i], low, high);
> -		CCCR_CLEAR(low);
> -		CCCR_SET_REQUIRED_BITS(low);
> -		wrmsr(p4_unused_cccr[i], low, high);
> -	}
> -
>  	/* clear all escrs (including those outside our concern) */
> -	for (addr = MSR_P4_BSU_ESCR0 + stag;
> -	     addr <  MSR_P4_IQ_ESCR0; addr += addr_increment()) {
> -		wrmsr(addr, 0, 0);
> -	}
> -
> -	/* On older models clear also MSR_P4_IQ_ESCR0/1 */
> -	if (boot_cpu_data.x86_model < 0x3) {
> -		wrmsr(MSR_P4_IQ_ESCR0, 0, 0);
> -		wrmsr(MSR_P4_IQ_ESCR1, 0, 0);
> -	}
> -
> -	for (addr = MSR_P4_RAT_ESCR0 + stag;
> -	     addr <= MSR_P4_SSU_ESCR0; ++i, addr += addr_increment()) {
> -		wrmsr(addr, 0, 0);
> -	}
> -	
> -	for (addr = MSR_P4_MS_ESCR0 + stag;
> -	     addr <= MSR_P4_TC_ESCR1; addr += addr_increment()){ 
> -		wrmsr(addr, 0, 0);
> -	}
> -	
> -	for (addr = MSR_P4_IX_ESCR0 + stag;
> -	     addr <= MSR_P4_CRU_ESCR3; addr += addr_increment()){ 
> -		wrmsr(addr, 0, 0);
> +	for (i = num_counters; i < num_controls; i++) {
> +		if (unlikely(!CTRL_IS_RESERVED(msrs,i)))
> +			continue;
> +		wrmsr(msrs->controls[i].addr, 0, 0);
>  	}
>  
> -	if (num_counters == NUM_COUNTERS_NON_HT) {		
> -		wrmsr(MSR_P4_CRU_ESCR4, 0, 0);
> -		wrmsr(MSR_P4_CRU_ESCR5, 0, 0);
> -	} else if (stag == 0) {
> -		wrmsr(MSR_P4_CRU_ESCR4, 0, 0);
> -	} else {
> -		wrmsr(MSR_P4_CRU_ESCR5, 0, 0);
> -	}		
> -	
>  	/* setup all counters */
>  	for (i = 0 ; i < num_counters ; ++i) {
> -		if (counter_config[i].enabled) {
> +		if ((counter_config[i].enabled) && (CTRL_IS_RESERVED(msrs,i))) {
>  			reset_value[i] = counter_config[i].count;
>  			pmc_setup_one_p4_counter(i);
>  			CTR_WRITE(counter_config[i].count, VIRT_CTR(stag, i));
> @@ -696,12 +670,32 @@ static void p4_stop(struct op_msrs const
>  	stag = get_stagger();
>  
>  	for (i = 0; i < num_counters; ++i) {
> +		if (!reset_value[i])
> +			continue;
>  		CCCR_READ(low, high, VIRT_CTR(stag, i));
>  		CCCR_SET_DISABLE(low);
>  		CCCR_WRITE(low, high, VIRT_CTR(stag, i));
>  	}
>  }
>  
> +static void p4_shutdown(struct op_msrs const * const msrs)
> +{
> +	int i;
> +
> +	for (i = 0 ; i < num_counters ; ++i) {
> +		if (CTR_IS_RESERVED(msrs,i))
> +			release_perfctr_nmi(msrs->counters[i].addr);
> +	}
> +	/* some of the control registers are specially reserved in
> +	 * conjunction with the counter registers (hence the starting offset).
> +	 * This saves a few bits.
> +	 */
> +	for (i = num_counters ; i < num_controls ; ++i) {
> +		if (CTRL_IS_RESERVED(msrs,i))
> +			release_evntsel_nmi(msrs->controls[i].addr);
> +	}
> +}
> +
>  
>  #ifdef CONFIG_SMP
>  struct op_x86_model_spec const op_p4_ht2_spec = {
> @@ -711,7 +705,8 @@ struct op_x86_model_spec const op_p4_ht2
>  	.setup_ctrs = &p4_setup_ctrs,
>  	.check_ctrs = &p4_check_ctrs,
>  	.start = &p4_start,
> -	.stop = &p4_stop
> +	.stop = &p4_stop,
> +	.shutdown = &p4_shutdown
>  };
>  #endif
>  
> @@ -722,5 +717,6 @@ struct op_x86_model_spec const op_p4_spe
>  	.setup_ctrs = &p4_setup_ctrs,
>  	.check_ctrs = &p4_check_ctrs,
>  	.start = &p4_start,
> -	.stop = &p4_stop
> +	.stop = &p4_stop,
> +	.shutdown = &p4_shutdown
>  };
> Index: linux/arch/i386/oprofile/op_model_ppro.c
> ===================================================================
> --- linux.orig/arch/i386/oprofile/op_model_ppro.c
> +++ linux/arch/i386/oprofile/op_model_ppro.c
> @@ -22,10 +22,12 @@
>  #define NUM_COUNTERS 2
>  #define NUM_CONTROLS 2
>  
> +#define CTR_IS_RESERVED(msrs,c) (msrs->counters[(c)].addr ? 1 : 0)
>  #define CTR_READ(l,h,msrs,c) do {rdmsr(msrs->counters[(c)].addr, (l), (h));} while (0)
>  #define CTR_WRITE(l,msrs,c) do {wrmsr(msrs->counters[(c)].addr, -(u32)(l), -1);} while (0)
>  #define CTR_OVERFLOWED(n) (!((n) & (1U<<31)))
>  
> +#define CTRL_IS_RESERVED(msrs,c) (msrs->controls[(c)].addr ? 1 : 0)
>  #define CTRL_READ(l,h,msrs,c) do {rdmsr((msrs->controls[(c)].addr), (l), (h));} while (0)
>  #define CTRL_WRITE(l,h,msrs,c) do {wrmsr((msrs->controls[(c)].addr), (l), (h));} while (0)
>  #define CTRL_SET_ACTIVE(n) (n |= (1<<22))
> @@ -41,11 +43,21 @@ static unsigned long reset_value[NUM_COU
>   
>  static void ppro_fill_in_addresses(struct op_msrs * const msrs)
>  {
> -	msrs->counters[0].addr = MSR_P6_PERFCTR0;
> -	msrs->counters[1].addr = MSR_P6_PERFCTR1;
> +	int i;
> +
> +	for (i=0; i < NUM_COUNTERS; i++) {
> +		if (reserve_perfctr_nmi(MSR_P6_PERFCTR0 + i))
> +			msrs->counters[i].addr = MSR_P6_PERFCTR0 + i;
> +		else
> +			msrs->counters[i].addr = 0;
> +	}
>  	
> -	msrs->controls[0].addr = MSR_P6_EVNTSEL0;
> -	msrs->controls[1].addr = MSR_P6_EVNTSEL1;
> +	for (i=0; i < NUM_CONTROLS; i++) {
> +		if (reserve_evntsel_nmi(MSR_P6_EVNTSEL0 + i))
> +			msrs->controls[i].addr = MSR_P6_EVNTSEL0 + i;
> +		else
> +			msrs->controls[i].addr = 0;
> +	}
>  }
>  
>  
> @@ -56,6 +68,8 @@ static void ppro_setup_ctrs(struct op_ms
>  
>  	/* clear all counters */
>  	for (i = 0 ; i < NUM_CONTROLS; ++i) {
> +		if (unlikely(!CTRL_IS_RESERVED(msrs,i)))
> +			continue;
>  		CTRL_READ(low, high, msrs, i);
>  		CTRL_CLEAR(low);
>  		CTRL_WRITE(low, high, msrs, i);
> @@ -63,12 +77,14 @@ static void ppro_setup_ctrs(struct op_ms
>  	
>  	/* avoid a false detection of ctr overflows in NMI handler */
>  	for (i = 0; i < NUM_COUNTERS; ++i) {
> +		if (unlikely(!CTR_IS_RESERVED(msrs,i)))
> +			continue;
>  		CTR_WRITE(1, msrs, i);
>  	}
>  
>  	/* enable active counters */
>  	for (i = 0; i < NUM_COUNTERS; ++i) {
> -		if (counter_config[i].enabled) {
> +		if ((counter_config[i].enabled) && (CTR_IS_RESERVED(msrs,i))) {
>  			reset_value[i] = counter_config[i].count;
>  
>  			CTR_WRITE(counter_config[i].count, msrs, i);
> @@ -81,6 +97,8 @@ static void ppro_setup_ctrs(struct op_ms
>  			CTRL_SET_UM(low, counter_config[i].unit_mask);
>  			CTRL_SET_EVENT(low, counter_config[i].event);
>  			CTRL_WRITE(low, high, msrs, i);
> +		} else {
> +			reset_value[i] = 0;
>  		}
>  	}
>  }
> @@ -93,6 +111,8 @@ static int ppro_check_ctrs(struct pt_reg
>  	int i;
>   
>  	for (i = 0 ; i < NUM_COUNTERS; ++i) {
> +		if (!reset_value[i])
> +			continue;
>  		CTR_READ(low, high, msrs, i);
>  		if (CTR_OVERFLOWED(low)) {
>  			oprofile_add_sample(regs, i);
> @@ -118,18 +138,38 @@ static int ppro_check_ctrs(struct pt_reg
>  static void ppro_start(struct op_msrs const * const msrs)
>  {
>  	unsigned int low,high;
> -	CTRL_READ(low, high, msrs, 0);
> -	CTRL_SET_ACTIVE(low);
> -	CTRL_WRITE(low, high, msrs, 0);
> +
> +	if (reset_value[0]) {
> +		CTRL_READ(low, high, msrs, 0);
> +		CTRL_SET_ACTIVE(low);
> +		CTRL_WRITE(low, high, msrs, 0);
> +	}
>  }
>  
>  
>  static void ppro_stop(struct op_msrs const * const msrs)
>  {
>  	unsigned int low,high;
> -	CTRL_READ(low, high, msrs, 0);
> -	CTRL_SET_INACTIVE(low);
> -	CTRL_WRITE(low, high, msrs, 0);
> +
> +	if (reset_value[0]) {
> +		CTRL_READ(low, high, msrs, 0);
> +		CTRL_SET_INACTIVE(low);
> +		CTRL_WRITE(low, high, msrs, 0);
> +	}
> +}
> +
> +static void ppro_shutdown(struct op_msrs const * const msrs)
> +{
> +	int i;
> +
> +	for (i = 0 ; i < NUM_COUNTERS ; ++i) {
> +		if (CTR_IS_RESERVED(msrs,i))
> +			release_perfctr_nmi(MSR_P6_PERFCTR0 + i);
> +	}
> +	for (i = 0 ; i < NUM_CONTROLS ; ++i) {
> +		if (CTRL_IS_RESERVED(msrs,i))
> +			release_evntsel_nmi(MSR_P6_EVNTSEL0 + i);
> +	}
>  }
>  
>  
> @@ -140,5 +180,6 @@ struct op_x86_model_spec const op_ppro_s
>  	.setup_ctrs = &ppro_setup_ctrs,
>  	.check_ctrs = &ppro_check_ctrs,
>  	.start = &ppro_start,
> -	.stop = &ppro_stop
> +	.stop = &ppro_stop,
> +	.shutdown = &ppro_shutdown
>  };
> Index: linux/arch/i386/oprofile/op_x86_model.h
> ===================================================================
> --- linux.orig/arch/i386/oprofile/op_x86_model.h
> +++ linux/arch/i386/oprofile/op_x86_model.h
> @@ -40,6 +40,7 @@ struct op_x86_model_spec {
>  		struct op_msrs const * const msrs);
>  	void (*start)(struct op_msrs const * const msrs);
>  	void (*stop)(struct op_msrs const * const msrs);
> +	void (*shutdown)(struct op_msrs const * const msrs);
>  };
>  
>  extern struct op_x86_model_spec const op_ppro_spec;

i hope code works the way it should ;D

---
-o--=O`C
  #oo'L O
<___=E M


      parent reply	other threads:[~2006-08-11  0:42 UTC|newest]

Thread overview: 195+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20060810 935.775038000@suse.de>
2006-08-10 19:35 ` [PATCH for review] [1/145] x86_64: Update defconfig Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [2/145] i386: " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [3/145] i386: Allow to use GENERICARCH for UP kernels Andi Kleen
2006-08-10 19:47   ` Dave Hansen
2006-08-10 19:50     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [4/145] x86_64: Temporarily revert parts of the Core 2 nmi nmi watchdog support Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [5/145] x86_64: Add performance counter reservation framework for UP kernels Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [6/145] x86_64: Utilize performance counter reservation framework in oprofile Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [7/145] x86_64: Add SMP support on x86_64 to reservation framework Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [8/145] x86_64: Add SMP support on i386 " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [9/145] x86_64: Cleanup NMI interrupt path Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [10/145] x86_64: Add TIF_RESTORE_SIGMASK Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [11/145] x86_64: Add ppoll/pselect syscalls Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [12/145] i386/x86-64: Remove un/set_nmi_callback and reserve/release_lapic_nmi functions Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [13/145] x86_64: Add abilty to enable/disable nmi watchdog with sysctl Andi Kleen
2006-08-10 19:48   ` Oleg Verych
2006-08-11  6:44     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [14/145] x86_64: Add abilty to enable/disable nmi watchdog from procfs (update) Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [15/145] x86_64: Allow users to force a panic on NMI Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [16/145] x86_64: x86 clean up nmi panic messages Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [17/145] i386/x86-64: x86 nmi fix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [18/145] x86_64: x86 nmi fix 2 Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [19/145] x86_64: Fix up panic messages for different NMI panics Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [20/145] x86_64: make functions static Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [21/145] x86_64: kdump x86_64 nmi event notification fix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [22/145] x86_64: Kdump i386 " Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [23/145] i386: Enable NMI watchdog by default Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [24/145] x86_64: i386/x86-64 Add nmi watchdog support for new Intel CPUs Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [25/145] x86_64: Add macros for rdtscp Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [26/145] x86_64: Add initalization of the RDTSCP auxilliary values Andi Kleen
2006-08-10 21:49   ` Oleg Verych
2006-08-11  4:09     ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [27/145] x86_64: Add the vgetcpu vsyscall Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [28/145] x86_64: Add portable getcpu call Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [29/145] x86_64: Clean up asm/smp.h includes Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [30/145] x86_64: x86-64 TIF flags for debug regs and io bitmap in ctxsw Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [31/145] x86_64: Don't print virtual address in HPET initialization Andi Kleen
2006-08-11 16:50   ` Clemens Ladisch
2006-08-10 19:35 ` [PATCH for review] [32/145] x86_64: A few trivial spelling and grammar fixes Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [33/145] i386/x86-64: Don't randomize stack top when no randomization personality is set Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [34/145] i386: Account spinlocks to the caller during profiling for !FP kernels Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [35/145] x86_64: Simplify profile_pc on x86-64 Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [36/145] x86_64: Document backtracer selection options Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [37/145] x86_64: Support patchable lock prefix for pure assembly files Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [38/145] x86_64: Switch rwlocks over to patchable lock prefix Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [39/145] x86_64: Clean up read write lock assembly Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [40/145] i386: Remove const case for rwlocks Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [41/145] x86_64: Add proper alignment to ENTRY Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [42/145] i386: add alternative-asm.h to allow LOCK_PREFIX replacement in .S files Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [43/145] i386: Redo semaphore and rwlock assembly helpers Andi Kleen
2006-08-13  0:53   ` Andrew Morton
2006-08-13  6:50     ` Andi Kleen
2006-08-13  6:54       ` Andrew Morton
2006-08-13  7:42         ` Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [44/145] x86_64: Remove leftover CVS Id in thunk.S Andi Kleen
2006-08-10 19:35 ` [PATCH for review] [45/145] x86_64: Add some comments what tce.c actually does Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [46/145] x86_64: Remove all ifdefs for local/io apic Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [47/145] x86_64: Remove apic mismatch counter Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [48/145] x86_64: Remove old "focus disabled" chipset errata workaround Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [49/145] x86_64: Clean up and minor fixes to TLB flush Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [50/145] i386: Minor fixes & cleanup to tlb flush Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [51/145] x86_64: Add some comments to entry.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [52/145] x86_64: Remove pirq overwrite support Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [53/145] x86_64: Remove leftover MCE/EISA support Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [54/145] x86_64: Remove obsolete PIC mode Andi Kleen
2006-08-16 16:31   ` Len Brown
2006-08-16 16:35     ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [55/145] i386/x86-64: Remove obsolete sanity check in mptable parsing Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [56/145] x86_64: Factor out common io apic routing entry access Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [57/145] i386: " Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [58/145] x86_64: AUX_DEVICE_INFO is one byte long, use 'movb' Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [59/145] x86_64: Remove MPS table APIC renumbering Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [60/145] x86_64: Move early chipset quirks out to new file Andi Kleen
2006-08-16 15:36   ` Len Brown
2006-08-10 19:36 ` [PATCH for review] [61/145] x86_64: Replace mp bus array with bitmap for bus not pci Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [62/145] x86_64: Remove useless wrapper in mpparse.c code Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [63/145] x86_64: Remove some unneeded ACPI externs in mpparse.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [64/145] x86_64: Fix up some non linuxy style in ACPI functions " Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [65/145] i386: Clean up code style in mpparse.c ACPI code Andi Kleen
2006-08-16 16:08   ` Len Brown
2006-08-16 16:30     ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [66/145] x86_64: Use BUILD_BUG_ON in apic.c build sanity checking Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [67/145] x86_64: Detect CFI support in the assembler at runtime Andi Kleen
     [not found]   ` <20060811053932.GA4910@mars.ravnborg.org>
2006-08-11  5:55     ` Andi Kleen
2006-08-11 15:16       ` Sam Ravnborg
2006-08-11 16:10         ` Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [68/145] x86_64: Remove obsolete CVS $ from assembler files in arch/x86_64/kernel/* Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [69/145] x86_64: Disable DAC on VIA PCI bridges Andi Kleen
     [not found]   ` <20060810205554.GE4745@rhun.haifa.ibm.com>
2006-08-11  6:51     ` Andi Kleen
2006-08-11 19:13       ` Muli Ben-Yehuda
2006-08-11 19:36         ` Andi Kleen
2006-08-11 19:41           ` Muli Ben-Yehuda
2006-08-10 19:36 ` [PATCH for review] [70/145] x86_64: initialize end of memory variables as early as possible Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [71/145] x86_64: remove int_delivery_dest Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [72/145] i386: initialize end-of-memory variables as early as possible Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [73/145] x86_64: Add stack documentation document from Keith Owens Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [74/145] x86_64: Calgary IOMMU: rearrange 'struct iommu_table' members Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [75/145] x86_64: Calgary IOMMU: consolidate per bus data structures Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [76/145] x86_64: Calgary IOMMU: break out of pci_find_device_reverse if dev not found Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [77/145] x86_64: Calgary IOMMU: fix error path memleak in calgary_free_tar Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [78/145] x86_64: Calgary IOMMU: fix reference counting of Calgary PCI devices Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [79/145] x86_64: Calgary IOMMU: calgary_init_one_nontraslated() can return void Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [80/145] x86_64: Calgary IOMMU: save a bit of space in bus_info Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [81/145] i386: Remove lock section support in mutex.h, semaphore.h Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [82/145] x86_64: Don't use lock section for mutexes and semaphores Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [83/145] x86_64: fix is_at_popf() for compat tasks Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [84/145] x86_64: annotate arch/x86_64/lib/*.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [85/145] x86_64: Fix gdt table size in trampoline.S Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [86/145] x86_64: remove superflous BUG_ON's in nommu and gart Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [87/145] x86_64: remove lock prefix from is_at_popf() tests Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [88/145] x86_64: Use early CPU identify before early command line parsing Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [89/145] x86_64: Allow early_param and identical __setup to exist Andi Kleen
2006-08-16 16:25   ` Len Brown
2006-08-10 19:36 ` [PATCH for review] [90/145] x86_64: Replace i386 open-coded cmdline parsing with Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [91/145] x86_64: Convert x86-64 to early param Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [92/145] x86_64: Remove need for early lockdep init Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [93/145] i386/x86-64: Move acpi_disabled variables into acpi/boot.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [94/145] x86_64: Clean up acpi_numa variable Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [95/145] x86_64: Move e820 map into e820.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [96/145] x86_64: Add sparse annotation to vsyscall.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [97/145] x86_64: Add sparse annotations to quiet sparse in arch/x86_64/mm/fault.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [98/145] x86_64: Fix most sparse warnings in sys_ia32.c Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [99/145] x86_64: Fix sparse warnings in compat aout code Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [100/145] x86_64: Fix broken indentation in iommu_setup Andi Kleen
2006-08-10 19:36 ` [PATCH for review] [101/145] x86_64: Replace local_save_flags+local_irq_disable with Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [102/145] x86_64: Remove unneeded externs in acpi/boot.c Andi Kleen
2006-08-16 15:41   ` Len Brown
2006-08-10 19:37 ` [PATCH for review] [103/145] i386/x86-64: rename is_at_popf(), add iret to tests and fix Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [104/145] x86_64: print whether CONFIG_IOMMU_DEBUG is enabled Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [105/145] x86_64: only verify the allocation bitmap if CONFIG_IOMMU_DEBUG is on Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [106/145] x86_64: remove tce_cache_blast_stress() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [107/145] x86_64: Calgary IOMMU: eradicate sole remaining 80 chars per line offender Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [108/145] x86_64: Some preparationary cleanup for stack trace Andi Kleen
2006-08-13  6:26   ` Andrew Morton
2006-08-13  6:53     ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [109/145] x86_64: Convert modlist_lock to be a raw spinlock Andi Kleen
2006-08-13  5:48   ` Andrew Morton
2006-08-13  6:52     ` Andi Kleen
2006-08-13  7:02       ` Andrew Morton
2006-08-13  7:15         ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [110/145] x86_64: Don't access the APIC in safe_smp_processor_id when it is not mapped yet Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [111/145] x86_64: Move unwind_init earlier Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [112/145] x86_64: Merge stacktrace and show_trace Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [113/145] i386: Do stacktracer conversion too Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [114/145] x86_64: Don't force frame pointers for lockdep Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [115/145] x86_64: fix dubious segment register clear in cpu_init() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [116/145] i386: don't taint UP K7's running SMP kernels Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [117/145] i386: error_code is not safe for kprobes Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [118/145] x86_64: Mark error_entry as forbidden to kprobes Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [119/145] x86_64: X86_64 monotonic_clock goes backwards Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [120/145] i386/x86-64: Improve Kconfig description of CRASH_DUMP Andi Kleen
2006-08-10 21:12   ` Randy.Dunlap
2006-08-10 19:37 ` [PATCH for review] [121/145] x86_64: Make boot_param_data pure BSS Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [122/145] i386: Fix warning in mpparse.c Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [123/145] i386: make fault notifier unconditional and export it Andi Kleen
2006-08-13 15:28   ` Adrian Bunk
2006-08-13 17:11     ` Alan Cox
2006-08-13 17:08       ` Adrian Bunk
2006-08-13 18:04         ` Alan Cox
2006-08-13 20:17     ` Andi Kleen
2006-08-14  0:03       ` Keith Owens
2006-08-10 19:37 ` [PATCH for review] [124/145] " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [125/145] i376: Make acpi_force static Andi Kleen
2006-08-16 15:47   ` Len Brown
2006-08-16 16:07     ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [126/145] i386: Make enable_local_apic static Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [127/145] i386: move kernel_thread_helper into entry.S Andi Kleen
2006-08-11  8:33   ` Jan Beulich
2006-08-11  8:38     ` Andi Kleen
2006-08-11  9:48       ` Jan Beulich
2006-08-11 10:16         ` Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [128/145] i386: Descriptor and trap table cleanups Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [129/145] x86_64: Auto size the per cpu area Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [130/145] i386: clean up topology.c Andi Kleen
2006-08-10 19:50   ` Dave Hansen
2006-08-10 19:55     ` Andi Kleen
2006-08-11  1:32     ` Magnus Damm
2006-08-10 19:37 ` [PATCH for review] [131/145] i386: mark two more functions as __init Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [132/145] x86_64: fix bus numbering format in mmconfig warning Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [133/145] x86_64: Support physical cpu hotplug for x86_64 Andi Kleen
     [not found]   ` <20060810222056.GA24184@mail.muni.cz>
2006-08-11  4:05     ` Andi Kleen
2006-08-16 16:02   ` Len Brown
2006-08-10 19:37 ` [PATCH for review] [134/145] x86_64: non lazy "sleazy" fpu implementation Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [135/145] x86_64: wire up oops_enter()/oops_exit() Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [136/145] x86_64: x86_64 kernel mapping fix Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [137/145] i386: KPROBE_ENTRY ends up putting code into .fixup Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [138/145] i386: remove redundant generic_identify() calls when identifying cpus Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [139/145] x86_64: mark init_amd() as __cpuinit Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [140/145] i386: mark cpu_dev structures as __cpuinitdata Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [141/145] i386: mark cpu init functions as __cpuinit, data " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [142/145] i386: mark cpu identify functions as __cpuinit Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [143/145] i386: mark cpu cache " Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [144/145] i386: Disallow kprobes on NMI handlers Andi Kleen
2006-08-10 19:37 ` [PATCH for review] [145/145] " Andi Kleen
     [not found] ` <20060810193518.394E413B90__40006.6926530146$1155241071$gmane$org@wotan.suse.de>
2006-08-10 22:42   ` Oleg Verych [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=44DBB640.8040906@flower.upol.cz \
    --to=olecom@flower.upol.cz \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox