04 Jul, 2011

1 commit


18 Oct, 2010

1 commit

  • The bonding driver currently modifies the netpoll structure in its xmit path
    while sending frames from netpoll. This is racy, as other cpus can access the
    netpoll structure in parallel. Since the bonding driver points np->dev to a
    slave device, other cpus can inadvertently attempt to send data directly to
    slave devices, leading to improper locking with the bonding master, lost frames,
    and deadlocks. This patch fixes that up.

    This patch also removes the real_dev pointer from the netpoll structure as that
    data is really only used by bonding in the poll_controller, and we can emulate
    its behavior by check each slave for IS_UP.

    Signed-off-by: Neil Horman
    Signed-off-by: David S. Miller

    Neil Horman
     

18 Sep, 2010

1 commit

  • We cannot use rcu_dereference_bh safely in netpoll_rx as we may
    be called with IRQs disabled. We could however simply disable
    IRQs as that too causes BH to be disabled and is safe in either
    case.

    Thanks to John Linville for discovering this bug and providing
    a patch.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     

11 Aug, 2010

1 commit


16 Jun, 2010

4 commits

  • Now that RCU debugging checks for matching rcu_dereference calls
    and rcu_read_lock, we need to use the correct primitives or face
    nasty warnings.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     
  • This patch adds the helper netpoll_tx_running for use within
    ndo_start_xmit. It returns non-zero if ndo_start_xmit is being
    invoked by netpoll, and zero otherwise.

    This is currently implemented by simply looking at the hardirq
    count. This is because for all non-netpoll uses of ndo_start_xmit,
    IRQs must be enabled while netpoll always disables IRQs before
    calling ndo_start_xmit.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     
  • This patch adds the functions __netpoll_setup/__netpoll_cleanup
    which is designed to be called recursively through ndo_netpoll_seutp.

    They must be called with RTNL held, and the caller must initialise
    np->dev and ensure that it has a valid reference count.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     
  • The use of RCU in netpoll is incorrect in a number of places:

    1) The initial setting is lacking a write barrier.
    2) The synchronize_rcu is in the wrong place.
    3) Read barriers are missing.
    4) Some places are even missing rcu_read_lock.
    5) npinfo is zeroed after freeing.

    This patch fixes those issues. As most users are in BH context,
    this also converts the RCU usage to the BH variant.

    Signed-off-by: Herbert Xu
    Acked-by: Paul E. McKenney
    Signed-off-by: David S. Miller

    Herbert Xu
     

06 May, 2010

2 commits

  • Signed-off-by: David S. Miller

    David S. Miller
     
  • This whole patchset is for adding netpoll support to bridge and bonding
    devices. I already tested it for bridge, bonding, bridge over bonding,
    and bonding over bridge. It looks fine now.

    To make bridge and bonding support netpoll, we need to adjust
    some netpoll generic code. This patch does the following things:

    1) introduce two new priv_flags for struct net_device:
    IFF_IN_NETPOLL which identifies we are processing a netpoll;
    IFF_DISABLE_NETPOLL is used to disable netpoll support for a device
    at run-time;

    2) introduce one new method for netdev_ops:
    ->ndo_netpoll_cleanup() is used to clean up netpoll when a device is
    removed.

    3) introduce netpoll_poll_dev() which takes a struct net_device * parameter;
    export netpoll_send_skb() and netpoll_poll_dev() which will be used later;

    4) hide a pointer to struct netpoll in struct netpoll_info, ditto.

    5) introduce ->real_dev for struct netpoll.

    6) introduce a new status NETDEV_BONDING_DESLAE, which is used to disable
    netconsole before releasing a slave, to avoid deadlocks.

    Cc: David Miller
    Cc: Neil Horman
    Signed-off-by: WANG Cong
    Signed-off-by: David S. Miller

    WANG Cong
     

14 Jan, 2010

1 commit


29 Mar, 2009

1 commit


17 Mar, 2009

1 commit

  • As my netpoll fix for net doesn't really work for net-next, we
    need this update to move the checks into the right place. As it
    stands we may pass freed skbs to netpoll_receive_skb.

    This patch also introduces a netpoll_rx_on function to avoid GRO
    completely if we're invoked through netpoll. This might seem
    paranoid but as netpoll may have an external receive hook it's
    better to be safe than sorry. I don't think we need this for
    2.6.29 though since there's nothing immediately broken by it.

    This patch also moves the GRO_* return values to netdevice.h since
    VLAN needs them too (I tried to avoid this originally but alas
    this seems to be the easiest way out). This fixes a bug in VLAN
    where it continued to use the old return value 2 instead of the
    correct GRO_DROP.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     

16 Dec, 2008

1 commit

  • This patch adds the top-level GRO (Generic Receive Offload) infrastructure.
    This is pretty similar to LRO except that this is protocol-independent.
    Instead of holding packets in an lro_mgr structure, they're now held in
    napi_struct.

    For drivers that intend to use this, they can set the NETIF_F_GRO bit and
    call napi_gro_receive instead of netif_receive_skb or just call netif_rx.
    The latter will call napi_receive_skb automatically. When napi_gro_receive
    is used, the driver must either call napi_complete/napi_rx_complete, or
    call napi_gro_flush in softirq context if the driver uses the primitives
    __napi_complete/__napi_rx_complete.

    Protocols will set the gro_receive and gro_complete function pointers in
    order to participate in this scheme.

    In addition to the packet, gro_receive will get a list of currently held
    packets. Each packet in the list has a same_flow field which is non-zero
    if it is a potential match for the new packet. For each packet that may
    match, they also have a flush field which is non-zero if the held packet
    must not be merged with the new packet.

    Once gro_receive has determined that the new skb matches a held packet,
    the held packet may be processed immediately if the new skb cannot be
    merged with it. In this case gro_receive should return the pointer to
    the existing skb in gro_list. Otherwise the new skb should be merged into
    the existing packet and NULL should be returned, unless the new skb makes
    it impossible for any further merges to be made (e.g., FIN packet) where
    the merged skb should be returned.

    Whenever the skb is merged into an existing entry, the gro_receive
    function should set NAPI_GRO_CB(skb)->same_flow. Note that if an skb
    merely matches an existing entry but can't be merged with it, then
    this shouldn't be set.

    If gro_receive finds it pointless to hold the new skb for future merging,
    it should set NAPI_GRO_CB(skb)->flush.

    Held packets will be flushed by napi_gro_flush which is called by
    napi_complete and napi_rx_complete.

    Currently held packets are stored in a singly liked list just like LRO.
    The list is limited to a maximum of 8 entries. In future, this may be
    expanded to use a hash table to allow more flows to be held for merging.

    Signed-off-by: Herbert Xu
    Signed-off-by: David S. Miller

    Herbert Xu
     

05 Mar, 2008

1 commit

  • Based upon a report by Andrew Morton and code analysis done
    by Jarek Poplawski.

    This reverts 33f807ba0d9259e7c75c7a2ce8bd2787e5b540c7 ("[NETPOLL]:
    Kill NETPOLL_RX_DROP, set but never tested.") and
    c7b6ea24b43afb5749cb704e143df19d70e23dea ("[NETPOLL]: Don't need
    rx_flags.").

    The rx_flags did get tested for zero vs. non-zero and therefore we do
    need those tests and that code which sets NETPOLL_RX_DROP et al.

    Signed-off-by: David S. Miller

    David S. Miller
     

29 Jan, 2008

2 commits


11 Oct, 2007

2 commits

  • Based upon initial work by Keiichi Kii .

    This patch introduces support for dynamic reconfiguration (adding, removing
    and/or modifying parameters of netconsole targets at runtime) using a
    userspace interface exported via configfs. Documentation is also updated
    accordingly.

    Issues and brief design overview:

    (1) Kernel-initiated creation / destruction of kernel objects is not
    possible with configfs -- the lifetimes of the "config items" is managed
    exclusively from userspace. But netconsole must support boot/module
    params too, and these are parsed in kernel and hence netpolls must be
    setup from the kernel. Joel Becker suggested to separately manage the
    lifetimes of the two kinds of netconsole_target objects -- those created
    via configfs mkdir(2) from userspace and those specified from the
    boot/module option string. This adds complexity and some redundancy here
    and also means that boot/module param-created targets are not exposed
    through the configfs namespace (and hence cannot be updated / destroyed
    dynamically). However, this saves us from locking / refcounting
    complexities that would need to be introduced in configfs to support
    kernel-initiated item creation / destroy there.

    (2) In configfs, item creation takes place in the call chain of the
    mkdir(2) syscall in the driver subsystem. If we used an ioctl(2) to
    create / destroy objects from userspace, the special userspace program is
    able to fill out the structure to be passed into the ioctl and hence
    specify attributes such as local interface that are required at the time
    we set up the netpoll. For configfs, this information is not available at
    the time of mkdir(2). So, we keep all newly-created targets (via
    configfs) disabled by default. The user is expected to set various
    attributes appropriately (including the local network interface if
    required) and then write(2) "1" to the "enabled" attribute. Thus,
    netpoll_setup() is then called on the set parameters in the context of
    _this_ write(2) on the "enabled" attribute itself. This design enables
    the user to reconfigure existing netconsole targets at runtime to be
    attached to newly-come-up interfaces that may not have existed when
    netconsole was loaded or when the targets were actually created. All this
    effectively enables us to get rid of custom ioctls.

    (3) Ultra-paranoid configfs attribute show() and store() operations, with
    sanity and input range checking, using only safe string primitives, and
    compliant with the recommendations in Documentation/filesystems/sysfs.txt.

    (4) A new function netpoll_print_options() is created in the netpoll API,
    that just prints out the configured parameters for a netpoll structure.
    netpoll_parse_options() is modified to use that and it is also exported to
    be used from netconsole.

    Signed-off-by: Satyam Sharma
    Acked-by: Keiichi Kii
    Signed-off-by: Andrew Morton
    Signed-off-by: David S. Miller

    Satyam Sharma
     
  • Several devices have multiple independant RX queues per net
    device, and some have a single interrupt doorbell for several
    queues.

    In either case, it's easier to support layouts like that if the
    structure representing the poll is independant from the net
    device itself.

    The signature of the ->poll() call back goes from:

    int foo_poll(struct net_device *dev, int *budget)

    to

    int foo_poll(struct napi_struct *napi, int budget)

    The caller is returned the number of RX packets processed (or
    the number of "NAPI credits" consumed if you want to get
    abstract). The callee no longer messes around bumping
    dev->quota, *budget, etc. because that is all handled in the
    caller upon return.

    The napi_struct is to be embedded in the device driver private data
    structures.

    Furthermore, it is the driver's responsibility to disable all NAPI
    instances in it's ->stop() device close handler. Since the
    napi_struct is privatized into the driver's private data structures,
    only the driver knows how to get at all of the napi_struct instances
    it may have per-device.

    With lots of help and suggestions from Rusty Russell, Roland Dreier,
    Michael Chan, Jeff Garzik, and Jamal Hadi Salim.

    Bug fixes from Thomas Graf, Roland Dreier, Peter Zijlstra,
    Joseph Fannin, Scott Wood, Hans J. Koch, and Michael Chan.

    [ Ported to current tree and all drivers converted. Integrated
    Stephen's follow-on kerneldoc additions, and restored poll_list
    handling to the old style to fix mutual exclusion issues. -DaveM ]

    Signed-off-by: Stephen Hemminger
    Signed-off-by: David S. Miller

    Stephen Hemminger
     

06 Dec, 2006

1 commit


03 Dec, 2006

5 commits

  • As Steve left netpoll beast, hopefully not to return soon.
    He noticed that the header was messy. He straightened it
    up and polished it a little, then waved goodbye.

    Signed-off-by: Stephen Hemminger

    Stephen Hemminger
     
  • The beast had a long and not very happy history. At one
    point, a friend (netdump) had asked that he open up a little.
    Well, the friend was long gone now, and the beast had
    this dangling piece hanging (netpoll_queue).

    It wasn't hard to stitch the netpoll_queue back in
    where it belonged and make everything tidy.

    Signed-off-by: Stephen Hemminger

    Stephen Hemminger
     
  • The netpoll beast was still not happy. If the beast got
    clogged pipes, it tended to stare blankly off in space
    for a long time.

    The problem couldn't be completely fixed because the
    beast talked with irq's disabled. But it could be made
    less painful and shorter.

    Signed-off-by: Stephen Hemminger

    Stephen Hemminger
     
  • When the netpoll beast got really busy, it tended to clog
    things, so it stored them for later. But the beast was putting
    all it's skb's in one basket. This was bad because maybe some
    pipes were clogged and others were not.

    Signed-off-by: Stephen Hemminger

    Stephen Hemminger
     
  • After looking harder, Steve noticed that the netpoll
    beast leaked a little every time it shutdown for a nap.
    Not a big leak, but a nuisance kind of thing.

    He took out his refcount duct tape and patched the
    leak. It was overkill since there was already other
    locking in that area, but it looked clean and wouldn't
    attract fleas.

    Signed-off-by: Stephen Hemminger

    Stephen Hemminger
     

26 Jun, 2006

1 commit

  • The netpoll system currently has a rx to tx path via:

    netpoll_rx
    __netpoll_rx
    arp_reply
    netpoll_send_skb
    dev->hard_start_tx

    This rx->tx loop places network drivers at risk of inadvertently causing a
    deadlock or BUG halt by recursively trying to acquire a spinlock that is
    used in both their rx and tx paths (this problem was origionally reported
    to me in the 3c59x driver, which shares a spinlock between the
    boomerang_interrupt and boomerang_start_xmit routines).

    This patch breaks this loop, by queueing arp frames, so that they can be
    responded to after all receive operations have been completed. Tested by
    myself and the reported with successful results.

    Specifically it was tested with netdump. Heres the BZ with details:
    https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=194055

    Signed-off-by: Neil Horman
    Acked-by: Matt Mackall
    Signed-off-by: Andrew Morton
    Signed-off-by: David S. Miller

    Neil Horman
     

13 Oct, 2005

1 commit


12 Aug, 2005

2 commits

  • This fixes a race during initialization with the NAPI softirq
    processing by using an RCU approach.

    This race was discovered when refill_skbs() was added to
    the setup code.

    Signed-off-by: Matt Mackall
    Signed-off-by: David S. Miller

    Matt Mackall
     
  • Add limited retry logic to netpoll_send_skb

    Each time we attempt to send, decrement our per-device retry counter.
    On every successful send, we reset the counter.

    We delay 50us between attempts with up to 20000 retries for a total of
    1 second. After we've exhausted our retries, subsequent failed
    attempts will try only once until reset by success.

    Signed-off-by: Matt Mackall
    Signed-off-by: David S. Miller

    Matt Mackall
     

23 Jun, 2005

3 commits

  • This patch provides support for registering multiple netpoll clients to the
    same network device. Only one of these clients may register an rx_hook,
    however. In practice, this restriction has not been problematic. It is
    worth mentioning, though, that the current design can be easily extended to
    allow for the registration of multiple rx_hooks.

    The basic idea of the patch is that the rx_np pointer in the netpoll_info
    structure points to the struct netpoll that has rx_hook filled in. Aside
    from this one case, there is no need for a pointer from the struct
    net_device to an individual struct netpoll.

    A lock is introduced to protect the setting and clearing of the np_rx
    pointer. The pointer will only be cleared upon netpoll client module
    removal, and the lock should be uncontested.

    Signed-off-by: Jeff Moyer
    Signed-off-by: David S. Miller

    Jeff Moyer
     
  • This patch introduces a netpoll_info structure, which the struct net_device
    will now point to instead of pointing to a struct netpoll. The reason for
    this is two-fold: 1) fields such as the rx_flags, poll_owner, and poll_lock
    should be maintained per net_device, not per netpoll; and 2) this is a first
    step in providing support for multiple netpoll clients to register against the
    same net_device.

    The struct netpoll is now pointed to by the netpoll_info structure. As
    such, the previous behaviour of the code is preserved.

    Signed-off-by: Jeff Moyer
    Signed-off-by: David S. Miller

    Jeff Moyer
     
  • This trivial patch moves the assignment of poll_owner to -1 inside of
    the lock. This fixes a potential SMP race in the code.

    Signed-off-by: Jeff Moyer
    Signed-off-by: David S. Miller

    Jeff Moyer
     

17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds