On Sun, 4 Sep 2011 01:06:02 +0200
Luka Perkov <[email protected]> wrote:
> > What are you actually trying to fix with enabling preemption? I didn't
> > really get it by reading your mail.
>
> Kernel oops that I described.
Yeah. And that is completely unacceptable.
> CONFIG_PREEMPT must be enabled; don't know what more I can do.
No. You must provide a full OOPS message.
An unaligned access is easy to fix (or at least work around properly)
with proper debugging information.
> --- a/net/ipv4/netfilter/nf_nat_core.c
> +++ b/net/ipv4/netfilter/nf_nat_core.c
> @@ -276,9 +276,9 @@ nf_nat_setup_info(struct nf_conn *ct,
>
> /* nat helper or nfctnetlink also setup binding */
> nat = nfct_nat(ct);
> - if (!nat) {
> + if (unlikely(!nat)) {
> nat = nf_ct_ext_add(ct, NF_CT_EXT_NAT, GFP_ATOMIC);
> - if (nat == NULL) {
> + if (unlikely(nat == NULL)) {
> pr_debug("failed to add NAT extension\n");
> return NF_ACCEPT;
> }
> @@ -313,16 +313,17 @@ nf_nat_setup_info(struct nf_conn *ct,
> }
>
> if (maniptype == IP_NAT_MANIP_SRC) {
> - unsigned int srchash;
> + unsigned int h;
>
> - srchash = hash_by_src(net, nf_ct_zone(ct),
> - &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
> - spin_lock_bh(&nf_nat_lock);
> - /* nf_conntrack_alter_reply might re-allocate exntension aera */
> + h = hash_by_src(net, nf_ct_zone(ct),
> + &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple);
> +
> + /* nf_conntrack_alter_reply might re-allocate extension area */
> nat = nfct_nat(ct);
> nat->ct = ct;
> - hlist_add_head_rcu(&nat->bysource,
> - &net->ipv4.nat_bysource[srchash]);
> +
> + spin_lock_bh(&nf_nat_lock);
> + hlist_add_head_rcu(&nat->bysource, &net->ipv4.nat_bysource[h]);
> spin_unlock_bh(&nf_nat_lock);
> }
This doesn't seem to fix any alignment issues, does it?
--
Greetings, Michael.
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel