Hi! I am facing a weird problem: $ ARCH=um make linux make[1]: `arch/um/sys-x86_64/user-offsets.s' is up to date. CHK include/linux/version.h CHK include/generated/utsrelease.h CALL scripts/checksyscalls.sh CHK include/generated/compile.h QUOTE arch/um/kernel/config.tmp QUOTE arch/um/kernel/config.c CC arch/um/kernel/config.o LD arch/um/kernel/built-in.o VDSOSYM arch/um/sys-x86_64/vdso/vdso-syms.lds LD arch/um/sys-x86_64/vdso/built-in.o LD arch/um/sys-x86_64/built-in.o CHK kernel/config_data.h LD vmlinux.o MODPOST vmlinux.o GEN .version CHK include/generated/compile.h UPD include/generated/compile.h CC init/version.o LD init/built-in.o LD .tmp_vmlinux1 KSYM .tmp_kallsyms1.S AS .tmp_kallsyms1.o LD .tmp_vmlinux2 /usr/bin/ld: .tmp_vmlinux2: section __modver vma 0x6028c000 overlaps previous sections KSYM .tmp_kallsyms2.S AS .tmp_kallsyms2.o LD vmlinux /usr/bin/ld: vmlinux: section __modver vma 0x6028c000 overlaps previous sections SYSMAP System.map SYSMAP .tmp_System.map LINK linux This is triggered by changing files in my network protocol code for no apparent reason. My code is at available at http://repo.or.cz/w/cor.git?a=tree This change triggers it: diff --git a/net/cor/credits.c b/net/cor/credits.c index e0fb39a..776d197 100644 --- a/net/cor/credits.c +++ b/net/cor/credits.c @@ -556,7 +556,14 @@ void connreset_credits(struct conn *cn) { unsigned long iflags; - __u32 unlockhints = credits_lock_conn(cn); + if (cn->is_client) { + spin_lock_bh(&(cn->rcv_lock)); + spin_lock_bh(&(cn->reversedir->rcv_lock)); + } else { + spin_lock_bh(&(cn->reversedir->rcv_lock)); + spin_lock_bh(&(cn->rcv_lock)); + } + if (cn->in_credit_list) { spin_lock_irqsave(&credits_list_lock, iflags); list_del(&(cn->credit_list)); @@ -582,13 +589,26 @@ void connreset_credits(struct conn *cn) cn->crate_out, 0); spin_unlock_irqrestore(&(nb->credits_lock), iflags); } - credits_unlock_conn(cn, unlockhints); + + if (cn->is_client) { + spin_unlock_bh(&(cn->rcv_lock)); + spin_unlock_bh(&(cn->reversedir->rcv_lock)); + } else { + spin_unlock_bh(&(cn->reversedir->rcv_lock)); + spin_unlock_bh(&(cn->rcv_lock)); + } } void set_conn_in_decaytime(struct neighbor *nb, __u32 conn_id, struct conn *src_in, __u8 decaytime_seqno, __u16 decaytime) { - __u32 unlockhints = credits_lock_conn(src_in); + if (src_in->is_client) { + spin_lock_bh(&(src_in->rcv_lock)); + spin_lock_bh(&(src_in->reversedir->rcv_lock)); + } else { + spin_lock_bh(&(src_in->reversedir->rcv_lock)); + spin_lock_bh(&(src_in->rcv_lock)); + } if (unlikely(is_conn_in(src_in, nb, conn_id) == 0)) goto out; @@ -608,7 +628,13 @@ set: refresh_conn_credits(src_in, 0, 1); out: - credits_unlock_conn(src_in, unlockhints); + if (src_in->is_client) { + spin_unlock_bh(&(src_in->rcv_lock)); + spin_unlock_bh(&(src_in->reversedir->rcv_lock)); + } else { + spin_unlock_bh(&(src_in->reversedir->rcv_lock)); + spin_unlock_bh(&(src_in->rcv_lock)); + } } static void background_refresh_credits(struct work_struct *work) However, if only one instead of both credits_(un)lock_conn changes are made, the error/warning is gone. By searching on the internet it looks like the linker runs out of ressources, maybe because of certain properties of the build environment. However, I did not find a solution yet. Any ideas? My system is debian stable/squeeze. -Michi _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies