Re: ip_contrack refuses to load if built UP as a module on IA64

dann frazier
2006-01-10T21:21:11Z

On Mon, 2005-12-19 at 13:07 -0800, Luck, Tony wrote:
> On Thu, Sep 22, 2005 at 04:04:59PM -0600, dann frazier wrote:
> > On Thu, 2005-09-01 at 14:59 +1000, Peter Chubb wrote:
> > >
> > > This patch makes UP and SMP do the same thing as far as module per-cpu
> > > data go.
> > >
> > > Unfortunately it affects core code.
> >
> > It causes 2.6.13/x86 to fail to link:
> > kernel/built-in.o: In function `load_module':
> > : undefined reference to `percpu_modcopy'
> > make: *** [.tmp_vmlinux1] Error 1
> >
> > fyi, this is a problem we're seeing in the Debian UP packages:
> > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug25070
>
> Another possible solution is to make ia64 more like other
> architectures and make per-cpu variables just turn into
> ordinary variables on UP. There are some pros and cons to
> this:
>
> +) Being more like other architectures makes it less likely that
> we'll be burned by changes in generic code/tools that depend
> on implementation details
>
> -) We probably get worse code to access per-cpu variables from
> C-compiled code, and definitely get worse code in a couple of
> critical paths in assembler (where an "addl" becomes a "movl")
>
> Here's the patch ... lightly tested (just booted and checked that
> I could load the ip_conntrack module).

Thanks Tony; sorry for taking so long to test this. I required an
additional change to discontig.c to get this to build w/ the Debian
config. With this additional patch, a UP kernel boots fine on my
rx2600.

--- build-ia64-none-mckinley/arch/ia64/mm/discontig.c~ 2006-01-02 20:21:10.000000000 -0700
+++ build-ia64-none-mckinley/arch/ia64/mm/discontig.c 2006-01-09 19:56:58.000000000 -0700
@@ -339,8 +339,7 @@
struct cpuinfo_ia64 *cpu0_cpu_info;
cpu = 0;
node = node_cpuid[cpu].nid;
- cpu0_cpu_info = (struct cpuinfo_ia64 *)(__phys_per_cpu_start +
- ((char *)&per_cpu__cpu_info - __per_cpu_start));
+ cpu0_cpu_info = &per_cpu(cpu_info, 0);
cpu0_cpu_info->node_data = mem_data[node].node_data;
}
#endif /* CONFIG_SMP */