Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e7986739 authored by Mike Travis's avatar Mike Travis
Browse files

x86 smp: modify send_IPI_mask interface to accept cpumask_t pointers



Impact: cleanup, change parameter passing

  * Change genapic interfaces to accept cpumask_t pointers where possible.

  * Modify external callers to use cpumask_t pointers in function calls.

  * Create new send_IPI_mask_allbutself which is the same as the
    send_IPI_mask functions but removes smp_processor_id() from list.
    This removes another common need for a temporary cpumask_t variable.

  * Functions that used a temp cpumask_t variable for:

	cpumask_t allbutme = cpu_online_map;

	cpu_clear(smp_processor_id(), allbutme);
	if (!cpus_empty(allbutme))
		...

    become:

	if (!cpus_equal(cpu_online_map, cpumask_of_cpu(cpu)))
		...

  * Other minor code optimizations (like using cpus_clear instead of
    CPU_MASK_NONE, etc.)

Applies to linux-2.6.tip/master.

Signed-off-by: default avatarMike Travis <travis@sgi.com>
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
parent 36f5101a
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -9,12 +9,12 @@ static inline int apic_id_registered(void)
	return (1);
}

static inline cpumask_t target_cpus(void)
static inline const cpumask_t *target_cpus(void)
{
#ifdef CONFIG_SMP
        return cpu_online_map;
	return &cpu_online_map;
#else
        return cpumask_of_cpu(0);
	return &cpumask_of_cpu(0);
#endif
}

@@ -79,7 +79,7 @@ static inline int apicid_to_node(int logical_apicid)

static inline int cpu_present_to_apicid(int mps_cpu)
{
	if (mps_cpu < NR_CPUS)
	if (mps_cpu < nr_cpu_ids)
		return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);

	return BAD_APICID;
@@ -94,7 +94,7 @@ extern u8 cpu_2_logical_apicid[];
/* Mapping from cpu number to logical apicid */
static inline int cpu_to_logical_apicid(int cpu)
{
	if (cpu >= NR_CPUS)
	if (cpu >= nr_cpu_ids)
		return BAD_APICID;
	return cpu_physical_id(cpu);
}
@@ -119,12 +119,12 @@ static inline int check_phys_apicid_present(int boot_cpu_physical_apicid)
}

/* As we are using single CPU as destination, pick only one CPU here */
static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
{
	int cpu;
	int apicid;	

	cpu = first_cpu(cpumask);
	cpu = first_cpu(*cpumask);
	apicid = cpu_to_logical_apicid(cpu);
	return apicid;
}
+5 −4
Original line number Diff line number Diff line
#ifndef __ASM_MACH_IPI_H
#define __ASM_MACH_IPI_H

void send_IPI_mask_sequence(cpumask_t mask, int vector);
void send_IPI_mask_sequence(const cpumask_t *mask, int vector);
void send_IPI_mask_allbutself(const cpumask_t *mask, int vector);

static inline void send_IPI_mask(cpumask_t mask, int vector)
static inline void send_IPI_mask(const cpumask_t *mask, int vector)
{
	send_IPI_mask_sequence(mask, vector);
}
@@ -14,12 +15,12 @@ static inline void send_IPI_allbutself(int vector)
	cpu_clear(smp_processor_id(), mask);

	if (!cpus_empty(mask))
		send_IPI_mask(mask, vector);
		send_IPI_mask(&mask, vector);
}

static inline void send_IPI_all(int vector)
{
	send_IPI_mask(cpu_online_map, vector);
	send_IPI_mask(&cpu_online_map, vector);
}

#endif /* __ASM_MACH_IPI_H */
+20 −18
Original line number Diff line number Diff line
@@ -9,14 +9,14 @@ static inline int apic_id_registered(void)
	        return (1);
}

static inline cpumask_t target_cpus_cluster(void)
static inline const cpumask_t *target_cpus_cluster(void)
{
	return CPU_MASK_ALL;
	return &CPU_MASK_ALL;
}

static inline cpumask_t target_cpus(void)
static inline const cpumask_t *target_cpus(void)
{
	return cpumask_of_cpu(smp_processor_id());
	return &cpumask_of_cpu(smp_processor_id());
}

#define APIC_DFR_VALUE_CLUSTER		(APIC_DFR_CLUSTER)
@@ -82,7 +82,8 @@ static inline void setup_apic_routing(void)
	int apic = per_cpu(x86_bios_cpu_apicid, smp_processor_id());
	printk("Enabling APIC mode:  %s. Using %d I/O APICs, target cpus %lx\n",
		(apic_version[apic] == 0x14) ?
		"Physical Cluster" : "Logical Cluster", nr_ioapics, cpus_addr(target_cpus())[0]);
			"Physical Cluster" : "Logical Cluster",
			nr_ioapics, cpus_addr(*target_cpus())[0]);
}

static inline int multi_timer_check(int apic, int irq)
@@ -100,7 +101,7 @@ static inline int cpu_present_to_apicid(int mps_cpu)
{
	if (!mps_cpu)
		return boot_cpu_physical_apicid;
	else if (mps_cpu < NR_CPUS)
	else if (mps_cpu < nr_cpu_ids)
		return (int) per_cpu(x86_bios_cpu_apicid, mps_cpu);
	else
		return BAD_APICID;
@@ -120,7 +121,7 @@ extern u8 cpu_2_logical_apicid[];
static inline int cpu_to_logical_apicid(int cpu)
{
#ifdef CONFIG_SMP
       if (cpu >= NR_CPUS)
	if (cpu >= nr_cpu_ids)
		return BAD_APICID;
	return (int)cpu_2_logical_apicid[cpu];
#else
@@ -146,14 +147,15 @@ static inline int check_phys_apicid_present(int cpu_physical_apicid)
	return (1);
}

static inline unsigned int cpu_mask_to_apicid_cluster(cpumask_t cpumask)
static inline unsigned int
cpu_mask_to_apicid_cluster(const struct cpumask *cpumask)
{
	int num_bits_set;
	int cpus_found = 0;
	int cpu;
	int apicid;

	num_bits_set = cpus_weight(cpumask);
	num_bits_set = cpumask_weight(cpumask);
	/* Return id to all */
	if (num_bits_set == NR_CPUS)
		return 0xFF;
@@ -161,10 +163,10 @@ static inline unsigned int cpu_mask_to_apicid_cluster(cpumask_t cpumask)
	 * The cpus in the mask must all be on the apic cluster.  If are not
	 * on the same apicid cluster return default value of TARGET_CPUS.
	 */
	cpu = first_cpu(cpumask);
	cpu = cpumask_first(cpumask);
	apicid = cpu_to_logical_apicid(cpu);
	while (cpus_found < num_bits_set) {
		if (cpu_isset(cpu, cpumask)) {
		if (cpumask_test_cpu(cpu, cpumask)) {
			int new_apicid = cpu_to_logical_apicid(cpu);
			if (apicid_cluster(apicid) !=
					apicid_cluster(new_apicid)){
@@ -179,14 +181,14 @@ static inline unsigned int cpu_mask_to_apicid_cluster(cpumask_t cpumask)
	return apicid;
}

static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
static inline unsigned int cpu_mask_to_apicid(const cpumask_t *cpumask)
{
	int num_bits_set;
	int cpus_found = 0;
	int cpu;
	int apicid;

	num_bits_set = cpus_weight(cpumask);
	num_bits_set = cpus_weight(*cpumask);
	/* Return id to all */
	if (num_bits_set == NR_CPUS)
		return cpu_to_logical_apicid(0);
@@ -194,10 +196,10 @@ static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
	 * The cpus in the mask must all be on the apic cluster.  If are not
	 * on the same apicid cluster return default value of TARGET_CPUS.
	 */
	cpu = first_cpu(cpumask);
	cpu = first_cpu(*cpumask);
	apicid = cpu_to_logical_apicid(cpu);
	while (cpus_found < num_bits_set) {
		if (cpu_isset(cpu, cpumask)) {
		if (cpu_isset(cpu, *cpumask)) {
			int new_apicid = cpu_to_logical_apicid(cpu);
			if (apicid_cluster(apicid) !=
					apicid_cluster(new_apicid)){
+5 −4
Original line number Diff line number Diff line
#ifndef __ASM_ES7000_IPI_H
#define __ASM_ES7000_IPI_H

void send_IPI_mask_sequence(cpumask_t mask, int vector);
void send_IPI_mask_sequence(const cpumask_t *mask, int vector);
void send_IPI_mask_allbutself(const cpumask_t *mask, int vector);

static inline void send_IPI_mask(cpumask_t mask, int vector)
static inline void send_IPI_mask(const cpumask_t *mask, int vector)
{
	send_IPI_mask_sequence(mask, vector);
}
@@ -13,12 +14,12 @@ static inline void send_IPI_allbutself(int vector)
	cpumask_t mask = cpu_online_map;
	cpu_clear(smp_processor_id(), mask);
	if (!cpus_empty(mask))
		send_IPI_mask(mask, vector);
		send_IPI_mask(&mask, vector);
}

static inline void send_IPI_all(int vector)
{
	send_IPI_mask(cpu_online_map, vector);
	send_IPI_mask(&cpu_online_map, vector);
}

#endif /* __ASM_ES7000_IPI_H */
+5 −4
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ struct genapic {
	int (*probe)(void);

	int (*apic_id_registered)(void);
	cpumask_t (*target_cpus)(void);
	const cpumask_t *(*target_cpus)(void);
	int int_delivery_mode;
	int int_dest_mode;
	int ESR_DISABLE;
@@ -57,12 +57,13 @@ struct genapic {

	unsigned (*get_apic_id)(unsigned long x);
	unsigned long apic_id_mask;
	unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
	cpumask_t (*vector_allocation_domain)(int cpu);
	unsigned int (*cpu_mask_to_apicid)(const cpumask_t *cpumask);
	void (*vector_allocation_domain)(int cpu, cpumask_t *retmask);

#ifdef CONFIG_SMP
	/* ipi */
	void (*send_IPI_mask)(cpumask_t mask, int vector);
	void (*send_IPI_mask)(const cpumask_t *mask, int vector);
	void (*send_IPI_mask_allbutself)(const cpumask_t *mask, int vector);
	void (*send_IPI_allbutself)(int vector);
	void (*send_IPI_all)(int vector);
#endif
Loading