On Thu, 03 May 2007 07:56:02 -0500 John Keller <jpk@xxxxxxx> wrote: > On SN, only allow one bit to be set in the smp_affinty mask > when redirecting an interrupt. Currently setting multiple > bits is allowed, but only the first bit is used in > determining the CPU to redirect to. This has caused confusion > among some customers. > > ... > > + > +int is_affinity_mask_valid(cpumask_t cpumask) > +{ > + if (ia64_platform_is("sn2")) { > + /* Only allow one CPU to be specified in the smp_affinity mask */ > + if (cpus_weight(cpumask) != 1) > + return 0; > + } > + return 1; > +} A bool returning true or false would be appropriate, given this function's clearly-boolean name. > +#ifndef ARCH_HAS_IRQ_AFFINITY_VALIDATION > +#define is_irq_affinity_mask_valid(cpumask) 1 > +#endif The ARCH_HAS_FOO things have never been popular. There are a couple of alternatives going around: a) use __attribute__((weak)) and provide a one-line default implementation in kernel/irq/proc.c. This has a small runtime cost. b) In include/asm-ia64/irq.h, do #define is_affinity_mask_valid is_affinity_mask_valid and in kernel/irq/proc.c do #ifndef is_affinity_mask_valid #define is_affinity_mask_valid() 1 #endif This has minimal runtime cost, but is a bit tricksy. It has the advantage that it doesn't introduce some new identifier which needs to be maintained. > extern int irq_set_affinity(unsigned int irq, cpumask_t cpumask); > extern int irq_can_set_affinity(unsigned int irq); > > Index: linux-2.6/include/asm-ia64/irq.h > =================================================================== > --- linux-2.6.orig/include/asm-ia64/irq.h 2007-05-01 15:47:01.660643076 -0500 > +++ linux-2.6/include/asm-ia64/irq.h 2007-05-01 15:48:42.729254805 -0500 > @@ -11,6 +11,8 @@ > * 02/29/00 D.Mosberger moved most things into hw_irq.h > */ > > +#include <linux/cpumask.h> > + This is the sort of inclusion which tends to make things blow up. I trust this was carefully compile-tested. With a) above, the is_affinity_mask_valid() declaration would be in a different header. With b), no additional include will be needed. > #define NR_IRQS 256 > #define NR_IRQ_VECTORS NR_IRQS > > @@ -30,4 +32,7 @@ extern void disable_irq_nosync (unsigned > extern void enable_irq (unsigned int); > extern void set_irq_affinity_info (unsigned int irq, int dest, int redir); > > +#define ARCH_HAS_IRQ_AFFINITY_VALIDATION > +extern int is_affinity_mask_valid(cpumask_t cpumask); > + - To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |