15 Nov, 2013

1 commit


10 Oct, 2013

1 commit


03 Oct, 2013

1 commit

  • Because 'node' is the i'st child of 'oldnode',
    thus, here 'i' equals
    tkey_extract_bits(node->key, oldtnode->pos, oldtnode->bits)

    we just get 1 more bit,
    and need not care the detail value of this bits.

    I apologize for the mistake.

    I generated the patch on a branch version,
    and did not notice the put_child has been changed.

    I have redone the test on HEAD version with my patch.

    two cases are used.
    case 1. inflate a node which has a leaf child node.
    case 2: inflate a node which has a an child node with skipped bits

    test env:
    ip link set eth0 up
    ip a add dev eth0 192.168.11.1/32
    here, we just focus on route table(MAIN),
    so I use a "192.168.11.1/32" address to simplify the test case.

    call trace:
    + fib_insert_node
    + + trie_rebalance
    + + + resize
    + + + + inflate

    Test case 1: inflate a node which has a leaf child node.

    ===========================================================
    step 1. prepare a fib trie
    ------------------------------------------
    ip r a 192.168.0.0/24 via 192.168.11.1
    ip r a 192.168.1.0/24 via 192.168.11.1

    we get a fib trie.
    root@baker:~# cat /proc/net/fib_trie
    Main:
    +-- 192.168.0.0/23 1 0 0
    |-- 192.168.0.0
    /24 universe UNICAST
    |-- 192.168.1.0
    /24 universe UNICAST
    Local:
    .....

    step 2. Add the third route
    ------------------------------------------
    root@baker:~# ip r a 192.168.2.0/24 via 192.168.11.1

    A fib_trie leaf will be inserted in fib_insert_node before trie_rebalance.

    For function 'inflate':
    'inflate' is called with following trie.
    +-- 192.168.0.0/22 1 1 0 key, oldtnode->pos + oldtnode->bits, 1)
    it equals:
    tkey_extract_bits("192.168,2,0", 22 + 1, 1)

    thus got 0, and call put_child(tn, 2*i, node); key, oldtnode->pos, oldtnode->bits + 1),
    tkey_extract_bits("192.168,2,0", 22, 1 + 1) key "192.168.128.0",
    oldnode:(pos:16, bits:1)
    so
    tkey_extract_bits(node->key, oldtnode->pos + oldtnode->bits, 1)
    it equals:
    tkey_extract_bits("192.168,128,0", 16 + 1, 1) key, oldtnode->pos, oldtnode->bits, 1)
    it equals:
    tkey_extract_bits("192.168,128,0", 16, 1+1)
    Signed-off-by: David S. Miller

    baker.zhang
     

06 Aug, 2013

1 commit

  • AddressSanitizer [1] dynamic checker pointed a potential
    out of bound access in leaf_walk_rcu()

    We could allocate one more slot in tnode_new() to leave the prefetch()
    in-place but it looks not worth the pain.

    Bug added in commit 82cfbb008572b ("[IPV4] fib_trie: iterator recode")

    [1] :
    https://code.google.com/p/address-sanitizer/wiki/AddressSanitizerForKernel

    Reported-by: Andrey Konovalov
    Signed-off-by: Eric Dumazet
    Cc: Dmitry Vyukov
    Signed-off-by: David S. Miller

    Eric Dumazet
     

25 Jul, 2013

1 commit


06 May, 2013

1 commit

  • Now that vfree() can be called from interrupt contexts, there's no
    need to play games with schedule_work() to escape calling vfree()
    from RCU callbacks.

    Signed-off-by: Al Viro
    Signed-off-by: David S. Miller

    Al Viro
     

28 Feb, 2013

1 commit

  • I'm not sure why, but the hlist for each entry iterators were conceived

    list_for_each_entry(pos, head, member)

    The hlist ones were greedy and wanted an extra parameter:

    hlist_for_each_entry(tpos, pos, head, member)

    Why did they need an extra pos parameter? I'm not quite sure. Not only
    they don't really need it, it also prevents the iterator from looking
    exactly like the list iterator, which is unfortunate.

    Besides the semantic patch, there was some manual work required:

    - Fix up the actual hlist iterators in linux/list.h
    - Fix up the declaration of other iterators based on the hlist ones.
    - A very small amount of places were using the 'node' parameter, this
    was modified to use 'obj->member' instead.
    - Coccinelle didn't handle the hlist_for_each_entry_safe iterator
    properly, so those had to be fixed up manually.

    The semantic patch which is mostly the work of Peter Senna Tschudin is here:

    @@
    iterator name hlist_for_each_entry, hlist_for_each_entry_continue, hlist_for_each_entry_from, hlist_for_each_entry_rcu, hlist_for_each_entry_rcu_bh, hlist_for_each_entry_continue_rcu_bh, for_each_busy_worker, ax25_uid_for_each, ax25_for_each, inet_bind_bucket_for_each, sctp_for_each_hentry, sk_for_each, sk_for_each_rcu, sk_for_each_from, sk_for_each_safe, sk_for_each_bound, hlist_for_each_entry_safe, hlist_for_each_entry_continue_rcu, nr_neigh_for_each, nr_neigh_for_each_safe, nr_node_for_each, nr_node_for_each_safe, for_each_gfn_indirect_valid_sp, for_each_gfn_sp, for_each_host;

    type T;
    expression a,c,d,e;
    identifier b;
    statement S;
    @@

    -T b;

    [akpm@linux-foundation.org: drop bogus change from net/ipv4/raw.c]
    [akpm@linux-foundation.org: drop bogus hunk from net/ipv6/raw.c]
    [akpm@linux-foundation.org: checkpatch fixes]
    [akpm@linux-foundation.org: fix warnings]
    [akpm@linux-foudnation.org: redo intrusive kvm changes]
    Tested-by: Peter Senna Tschudin
    Acked-by: Paul E. McKenney
    Signed-off-by: Sasha Levin
    Cc: Wu Fengguang
    Cc: Marcelo Tosatti
    Cc: Gleb Natapov
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Sasha Levin
     

19 Feb, 2013

2 commits

  • proc_net_remove is only used to remove proc entries
    that under /proc/net,it's not a general function for
    removing proc entries of netns. if we want to remove
    some proc entries which under /proc/net/stat/, we still
    need to call remove_proc_entry.

    this patch use remove_proc_entry to replace proc_net_remove.
    we can remove proc_net_remove after this patch.

    Signed-off-by: Gao feng
    Signed-off-by: David S. Miller

    Gao feng
     
  • Right now, some modules such as bonding use proc_create
    to create proc entries under /proc/net/, and other modules
    such as ipv4 use proc_net_fops_create.

    It looks a little chaos.this patch changes all of
    proc_net_fops_create to proc_create. we can remove
    proc_net_fops_create after this patch.

    Signed-off-by: Gao feng
    Signed-off-by: David S. Miller

    Gao feng
     

11 Sep, 2012

1 commit

  • It is a frequent mistake to confuse the netlink port identifier with a
    process identifier. Try to reduce this confusion by renaming fields
    that hold port identifiers portid instead of pid.

    I have carefully avoided changing the structures exported to
    userspace to avoid changing the userspace API.

    I have successfully built an allyesconfig kernel with this change.

    Signed-off-by: "Eric W. Biederman"
    Acked-by: Stephen Hemminger
    Signed-off-by: David S. Miller

    Eric W. Biederman
     

08 Sep, 2012

1 commit


23 Aug, 2012

1 commit


15 Aug, 2012

1 commit


09 Aug, 2012

1 commit

  • After IP route cache removal, I believe rcu_bh() has very little use and
    we should remove this RCU variant, since it adds some cycles in fast
    path.

    Anyway, the call_rcu_bh() use in fib_true is obviously wrong, since
    some users only assert rcu_read_lock().

    Signed-off-by: Eric Dumazet
    Cc: "Paul E. McKenney"
    Signed-off-by: David S. Miller

    Eric Dumazet
     

08 Aug, 2012

1 commit


30 Jul, 2012

2 commits


13 Jul, 2012

1 commit


11 Jun, 2012

1 commit


04 Jun, 2012

1 commit

  • Adding casts of objects to the same type is unnecessary
    and confusing for a human reader.

    For example, this cast:

    int y;
    int *p = (int *)&y;

    I used the coccinelle script below to find and remove these
    unnecessary casts. I manually removed the conversions this
    script produces of casts with __force and __user.

    @@
    type T;
    T *p;
    @@

    - (T *)p
    + p

    Signed-off-by: Joe Perches
    Signed-off-by: David S. Miller

    Joe Perches
     

11 May, 2012

1 commit

  • Due to RCU lookups and RCU based release, fib_info objects can
    be found during lookup which have fi->fib_dead set.

    We must ignore these entries, otherwise we risk dereferencing
    the parts of the entry which are being torn down.

    Reported-by: Yevgen Pronenko
    Signed-off-by: David S. Miller

    David S. Miller
     

29 Mar, 2012

1 commit


12 Mar, 2012

1 commit

  • Use a more current kernel messaging style.

    Convert a printk block to print_hex_dump.
    Coalesce formats, align arguments.
    Use %s, __func__ instead of embedding function names.

    Some messages that were prefixed with _close are
    now prefixed with _fini. Some ah4 and esp messages
    are now not prefixed with "ip ".

    The intent of this patch is to later add something like
    #define pr_fmt(fmt) "IPv4: " fmt.
    to standardize the output messages.

    Text size is trivially reduced. (x86-32 allyesconfig)

    $ size net/ipv4/built-in.o*
    text data bss dec hex filename
    887888 31558 249696 1169142 11d6f6 net/ipv4/built-in.o.new
    887934 31558 249800 1169292 11d78c net/ipv4/built-in.o.old

    Signed-off-by: Joe Perches
    Signed-off-by: David S. Miller

    Joe Perches
     

13 Jan, 2012

1 commit

  • commit a9b3cd7f32 (rcu: convert uses of rcu_assign_pointer(x, NULL) to
    RCU_INIT_POINTER) did a lot of incorrect changes, since it did a
    complete conversion of rcu_assign_pointer(x, y) to RCU_INIT_POINTER(x,
    y).

    We miss needed barriers, even on x86, when y is not NULL.

    Signed-off-by: Eric Dumazet
    CC: Stephen Hemminger
    CC: Paul E. McKenney
    Signed-off-by: David S. Miller

    Eric Dumazet
     

05 Dec, 2011

1 commit


01 Nov, 2011

1 commit


02 Aug, 2011

1 commit

  • When assigning a NULL value to an RCU protected pointer, no barrier
    is needed. The rcu_assign_pointer, used to handle that but will soon
    change to not handle the special case.

    Convert all rcu_assign_pointer of NULL value.

    //smpl
    @@ expression P; @@

    - rcu_assign_pointer(P, NULL)
    + RCU_INIT_POINTER(P, NULL)

    //

    Signed-off-by: Stephen Hemminger
    Acked-by: Paul E. McKenney
    Signed-off-by: David S. Miller

    Stephen Hemminger
     

19 Jul, 2011

1 commit

  • Compiler is not smart enough to avoid double BSWAP instructions in
    ntohl(inet_make_mask(plen)).

    Lets cache this value in struct leaf_info, (fill a hole on 64bit arches)

    With route cache disabled, this saves ~2% of cpu in udpflood bench on
    x86_64 machine.

    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

23 May, 2011

1 commit

  • After discovering that wide use of prefetch on modern CPUs
    could be a net loss instead of a win, net drivers which were
    relying on the implicit inclusion of prefetch.h via the list
    headers showed up in the resulting cleanup fallout. Give
    them an explicit include via the following $0.02 script.

    =========================================
    #!/bin/bash
    MANUAL=""
    for i in `git grep -l 'prefetch(.*)' .` ; do
    grep -q '' $i
    if [ $? = 0 ] ; then
    continue
    fi

    ( echo '?^#include '
    echo .
    echo w
    echo q
    ) | ed -s $i > /dev/null 2>&1
    if [ $? != 0 ]; then
    echo $i needs manual fixup
    MANUAL="$i $MANUAL"
    fi
    done
    echo ------------------- 8\
    [ Fixed up some incorrect #include placements, and added some
    non-network drivers and the fib_trie.c case - Linus ]
    Signed-off-by: Linus Torvalds

    Paul Gortmaker
     

21 May, 2011

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1446 commits)
    macvlan: fix panic if lowerdev in a bond
    tg3: Add braces around 5906 workaround.
    tg3: Fix NETIF_F_LOOPBACK error
    macvlan: remove one synchronize_rcu() call
    networking: NET_CLS_ROUTE4 depends on INET
    irda: Fix error propagation in ircomm_lmp_connect_response()
    irda: Kill set but unused variable 'bytes' in irlan_check_command_param()
    irda: Kill set but unused variable 'clen' in ircomm_connect_indication()
    rxrpc: Fix set but unused variable 'usage' in rxrpc_get_transport()
    be2net: Kill set but unused variable 'req' in lancer_fw_download()
    irda: Kill set but unused vars 'saddr' and 'daddr' in irlan_provider_connect_indication()
    atl1c: atl1c_resume() is only used when CONFIG_PM_SLEEP is defined.
    rxrpc: Fix set but unused variable 'usage' in rxrpc_get_peer().
    rxrpc: Kill set but unused variable 'local' in rxrpc_UDP_error_handler()
    rxrpc: Kill set but unused variable 'sp' in rxrpc_process_connection()
    rxrpc: Kill set but unused variable 'sp' in rxrpc_rotate_tx_window()
    pkt_sched: Kill set but unused variable 'protocol' in tc_classify()
    isdn: capi: Use pr_debug() instead of ifdefs.
    tg3: Update version to 3.119
    tg3: Apply rx_discards fix to 5719/5720
    ...

    Fix up trivial conflicts in arch/x86/Kconfig and net/mac80211/agg-tx.c
    as per Davem.

    Linus Torvalds
     

08 May, 2011

1 commit


06 May, 2011

1 commit


02 May, 2011

1 commit


15 Apr, 2011

1 commit

  • fib_select_default() is a complete NOP, and completely pointless
    to invoke, when we have no more than 1 default route installed.

    And this is far and away the common case.

    So remember how many prefixlen==0 routes we have in the routing
    table, and elide the call when we have no more than one of those.

    This cuts output route creation time by 157 cycles on Niagara2+.

    In order to add the new int to fib_table, we have to correct the type
    of ->tb_data[] to unsigned long, otherwise the private area will be
    unaligned on 64-bit systems.

    Signed-off-by: David S. Miller
    Reviewed-by: Eric Dumazet

    David S. Miller
     

12 Apr, 2011

1 commit


31 Mar, 2011

2 commits


26 Mar, 2011

1 commit


25 Mar, 2011

1 commit


22 Mar, 2011

1 commit

  • fib_table_delete forgets to match the routes by prefsrc.
    Callers can specify known IP in fc_prefsrc and we should remove
    the exact route. This is needed for cases when same local or
    broadcast addresses are used in different subnets and the
    routes differ only in prefsrc. All callers that do not provide
    fc_prefsrc will ignore the route prefsrc as before and will
    delete the first occurence. That is how the ip route del default
    magic works.

    Current callers are:

    - ip_rt_ioctl where rtentry_to_fib_config provides fc_prefsrc only
    when the provided device name matches IP label with colon.

    - inet_rtm_delroute where RTA_PREFSRC is optional too

    - fib_magic which deals with routes when deleting addresses
    and where the fc_prefsrc is always set with the primary IP
    for the concerned IFA.

    Signed-off-by: Julian Anastasov
    Signed-off-by: David S. Miller

    Julian Anastasov