11 Oct, 2007

1 commit

  • We now have struct net_device_stats embedded in struct net_device,
    and the default ->get_stats() hook does the obvious thing for us.

    Run through drivers/net/* and remove the driver-local storage of
    statistics, and driver-local ->get_stats() hook where applicable.

    This was just the low-hanging fruit in drivers/net; plenty more drivers
    remain to be updated.

    [ Resolved conflicts with napi_struct changes and fix sunqe build
    regression... -DaveM ]

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

    Jeff Garzik
     

20 Jul, 2007

1 commit

  • Transform some calls to kmalloc/memset to a single kzalloc (or kcalloc).

    Here is a short excerpt of the semantic patch performing
    this transformation:

    @@
    type T2;
    expression x;
    identifier f,fld;
    expression E;
    expression E1,E2;
    expression e1,e2,e3,y;
    statement S;
    @@

    x =
    - kmalloc
    + kzalloc
    (E1,E2)
    ... when != \(x->fld=E;\|y=f(...,x,...);\|f(...,x,...);\|x=E;\|while(...) S\|for(e1;e2;e3) S\)
    - memset((T2)x,0,E1);

    @@
    expression E1,E2,E3;
    @@

    - kzalloc(E1 * E2,E3)
    + kcalloc(E1,E2,E3)

    [akpm@linux-foundation.org: get kcalloc args the right way around]
    Signed-off-by: Yoann Padioleau
    Cc: Richard Henderson
    Cc: Ivan Kokshaysky
    Acked-by: Russell King
    Cc: Bryan Wu
    Acked-by: Jiri Slaby
    Cc: Dave Airlie
    Acked-by: Roland Dreier
    Cc: Jiri Kosina
    Acked-by: Dmitry Torokhov
    Cc: Benjamin Herrenschmidt
    Acked-by: Mauro Carvalho Chehab
    Acked-by: Pierre Ossman
    Cc: Jeff Garzik
    Cc: "David S. Miller"
    Acked-by: Greg KH
    Cc: James Bottomley
    Cc: "Antonino A. Daplas"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Yoann Padioleau
     

26 Apr, 2007

1 commit


08 Feb, 2007

1 commit


20 Dec, 2006

1 commit


22 Nov, 2006

1 commit


05 Oct, 2006

1 commit

  • Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
    of passing regs around manually through all ~1800 interrupt handlers in the
    Linux kernel.

    The regs pointer is used in few places, but it potentially costs both stack
    space and code to pass it around. On the FRV arch, removing the regs parameter
    from all the genirq function results in a 20% speed up of the IRQ exit path
    (ie: from leaving timer_interrupt() to leaving do_IRQ()).

    Where appropriate, an arch may override the generic storage facility and do
    something different with the variable. On FRV, for instance, the address is
    maintained in GR28 at all times inside the kernel as part of general exception
    handling.

    Having looked over the code, it appears that the parameter may be handed down
    through up to twenty or so layers of functions. Consider a USB character
    device attached to a USB hub, attached to a USB controller that posts its
    interrupts through a cascaded auxiliary interrupt controller. A character
    device driver may want to pass regs to the sysrq handler through the input
    layer which adds another few layers of parameter passing.

    I've build this code with allyesconfig for x86_64 and i386. I've runtested the
    main part of the code on FRV and i386, though I can't test most of the drivers.
    I've also done partial conversion for powerpc and MIPS - these at least compile
    with minimal configurations.

    This will affect all archs. Mostly the changes should be relatively easy.
    Take do_IRQ(), store the regs pointer at the beginning, saving the old one:

    struct pt_regs *old_regs = set_irq_regs(regs);

    And put the old one back at the end:

    set_irq_regs(old_regs);

    Don't pass regs through to generic_handle_irq() or __do_IRQ().

    In timer_interrupt(), this sort of change will be necessary:

    - update_process_times(user_mode(regs));
    - profile_tick(CPU_PROFILING, regs);
    + update_process_times(user_mode(get_irq_regs()));
    + profile_tick(CPU_PROFILING);

    I'd like to move update_process_times()'s use of get_irq_regs() into itself,
    except that i386, alone of the archs, uses something other than user_mode().

    Some notes on the interrupt handling in the drivers:

    (*) input_dev() is now gone entirely. The regs pointer is no longer stored in
    the input_dev struct.

    (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
    something different depending on whether it's been supplied with a regs
    pointer or not.

    (*) Various IRQ handler function pointers have been moved to type
    irq_handler_t.

    Signed-Off-By: David Howells
    (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)

    David Howells
     

14 Sep, 2006

1 commit


01 Jul, 2006

1 commit


19 May, 2006

1 commit


12 Jan, 2006

1 commit


09 Nov, 2005

1 commit

  • This patch removes almost all inclusions of linux/version.h. The 3
    #defines are unused in most of the touched files.

    A few drivers use the simple KERNEL_VERSION(a,b,c) macro, which is
    unfortunatly in linux/version.h.

    There are also lots of #ifdef for long obsolete kernels, this was not
    touched. In a few places, the linux/version.h include was move to where
    the LINUX_VERSION_CODE was used.

    quilt vi `find * -type f -name "*.[ch]"|xargs grep -El '(UTS_RELEASE|LINUX_VERSION_CODE|KERNEL_VERSION|linux/version.h)'|grep -Ev '(/(boot|coda|drm)/|~$)'`

    search pattern:
    /UTS_RELEASE\|LINUX_VERSION_CODE\|KERNEL_VERSION\|linux\/\(utsname\|version\).h

    Signed-off-by: Olaf Hering
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Olaf Hering
     

02 Nov, 2005

4 commits


24 Oct, 2005

2 commits


14 Oct, 2005

1 commit


07 Sep, 2005

1 commit


01 Sep, 2005

18 commits

  • The iseries_veth driver tells sysfs that it's called 'iseries_veth', but if
    you ask it via ethtool it thinks it's called 'veth'. I think this comes from
    2.4 when the driver was called 'veth', but it's definitely called
    'iseries_veth' now, so fix it.

    To make sure we don't do it again define DRV_NAME and use it everywhere.

    While we're at it, change the version number to 2.0, to reflect the changes
    made in this patch series.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • Having merged iseries_veth.h, let's remove some of the studly caps that came
    with it.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • iseries_veth.h is only used by iseries_veth.c, so merge the former into
    the latter.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • Also to aid debugging, add sysfs support for iseries_veth's port structures.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • To aid in field debugging, add sysfs support for iseries_veth's connection
    structures. At the moment this is all read-only, however we could think about
    adding write support for some attributes in future.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • There's a number of problems with the way iseries_veth counts TX errors.

    Firstly it counts conditions which aren't really errors as TX errors. This
    includes if we don't have a connection struct for the other LPAR, or if the
    other LPAR is currently down (or just doesn't want to talk to us). Neither
    of these should count as TX errors.

    Secondly, it counts one TX error for each LPAR that fails to accept the packet.
    This can lead to TX error counts higher than the total number of packets sent
    through the interface. This is confusing for users.

    This patch fixes that behaviour. The non-error conditions are no longer
    counted, and we introduce a new and I think saner meaning to the TX counts.

    If a packet is successfully transmitted to any LPAR then it is transmitted
    and tx_packets is incremented by 1.

    If there is an error transmitting a packet to any LPAR then that is counted
    as one error, ie. tx_errors is incremented by 1.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver often has multiple netdevices sending packets over
    a single connection to another LPAR. If the bandwidth to the other LPAR is
    exceeded, all the netdevices must have their queues stopped.

    The current code achieves this by queueing one incoming skb on the
    per-netdevice port structure. When the connection is able to send more packets
    we iterate through the port structs and flush any packet that is queued,
    as well as restarting the associated netdevice's queue.

    This arrangement makes less sense now that we have per-connection TX timers,
    rather than the per-netdevice generic TX timer.

    The new code simply detects when one of the connections is full, and stops
    the queue of all associated netdevices. Then when a packet is acked on that
    connection (ie. there is space again) all the queues are woken up.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • Currently the iseries_veth driver contravenes the specification in
    Documentation/networking/driver.txt, in that if packets are not acked by
    the other LPAR they will sit around forever.

    This patch adds a per-connection timer which fires if we've had no acks for
    five seconds. This is superior to the generic TX timer because it catches
    the case of a small number of packets being sent and never acked.

    This fixes a bug we were seeing on real systems, where some IPv6 neighbour
    discovery packets would not be acked and then prevent the module from being
    removed, due to skbs lying around.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver uses the generic TX timeout watchdog, however a better
    solution is in the works, so remove this code.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver can attach to multiple vlans, which correspond to
    multiple net devices. However there is only 1 connection between each LPAR,
    so the connection structure may be shared by multiple net devices.

    This makes module removal messy, because we can't deallocate the connections
    until we know there are no net devices still using them. The solution is to
    use ref counts on the connections, so we can delete them (actually stop) as
    soon as the ref count hits zero.

    This patch fixes (part of) a bug we were seeing with IPv6 sending probes to
    a dead LPAR, which would then hang us forever due to leftover skbs.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • This patch makes veth_init_connection() and veth_destroy_connection()
    symmetrical in that they allocate/deallocate the same data.

    Currently if there's an error while initialising connections (ie. ENOMEM)
    we call veth_module_cleanup(), however this will oops because we call
    driver_unregister() before we've called driver_register(). I've never seen
    this actually happen though.

    So instead we explicitly call veth_destroy_connection() for each connection,
    any that have been set up will be deallocated.

    We also fix a potential leak if vio_register_driver() fails.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver unconditionally calls dma_unmap_single() even
    when the corresponding dma_map_single() may have failed.

    Rework the code a bit to keep the return value from dma_unmap_single()
    around, and then check if it's a dma_mapping_error() before we do
    the dma_unmap_single().

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver uses atomic ops to manipulate the in_use field of
    one of its per-connection structures. However all references to the
    flag occur while the connection's lock is held, so the atomic ops aren't
    necessary.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver keeps a stack of messages for each connection
    and a lock to protect the stack. However there is also a per-connection lock
    which makes the message stack lock redundant.

    Remove the message stack lock and document the fact that callers of the
    stack-manipulation functions must hold the connection's lock.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • Due to a logic bug, once promiscuous mode is enabled in the iseries_veth
    driver it is never disabled.

    The driver keeps two flags, promiscuous and all_mcast which have exactly the
    same effect. This is because we only ever receive packets destined for us,
    or multicast packets. So consolidate them into one promiscuous flag for
    simplicity.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver contains a state machine which is used to manage
    how connections are setup and neogotiated between LPARs.

    If one side of a connection resets for some reason, the two LPARs can get
    stuck in a race to re-setup the connection. This can lead to the connection
    being declared dead by one or both ends. In practice the connection is
    declared dead by one or both ends approximately 8/10 times a connection is
    reset, although it is rare for connections to be reset.

    (an example here: http://michael.ellerman.id.au/files/misc/veth-trace.html)

    The core of the problem is that the end that resets the connection doesn't
    wait for the other end to become aware of the reset. So the resetting end
    starts setting the connection back up, and then receives a reset from the
    other end (which is the response to the initial reset). And so on.

    We're severely limited in what we can do to fix this. The protocol between
    LPARs is essentially fixed, as we have to interoperate with both OS/400
    and old Linux drivers. Which also means we need a fix that only changes the
    code on one end.

    The only fix I've found given that, is to just blindly sleep for a bit when
    resetting the connection, in the hope that the other end will get itself
    sorted. Needless to say I'd love it if someone has a better idea.

    This does work, I've so far been unable to get it to break, whereas without
    the fix a reset of one end will lead to a dead connection ~8/10 times.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • The iseries_veth driver has a timer which we use to send acks. When the
    connection is reset or stopped we need to delete the timer.

    Currently we only call del_timer() when resetting a connection, which means
    the timer might run again while the connection is being re-setup. As it turns
    out that's ok, because the flags the timer consults have been reset.

    It's cleaner though to call del_timer_sync() once we've dropped the lock,
    although the timer may still run between us dropping the lock and calling
    del_timer_sync(), but as above that's ok.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     
  • Currently the iseries_veth driver prints the file name and line number in its
    error messages. This isn't very useful for most users, so just print
    "iseries_veth: message" instead.

    - convert uses of veth_printk() to veth_debug()/veth_error()/veth_info()
    - make terminology consistent, ie. always refer to LPAR not lpar
    - be consistent about printing return codes as %d not %x
    - make format strings fit in 80 columns

    Signed-off-by: Michael Ellerman
    Signed-off-by: Jeff Garzik

    Michael Ellerman
     

30 Aug, 2005

1 commit


10 Jun, 2005

1 commit

  • My patch from a few weeks back (now in mainline), called "Cleanup skbs to
    prevent unregister_netdevice() hanging", can cause our TX timeout code to
    fire on machines with lots of VLANs (because it takes > 2 seconds between
    when we stop the queues and when we're finished stopping the connections).

    When that happens the TX timeout code freaks out and does a WARN_ON()
    because as far as it's concerned there shouldn't be a TX timeout happening,
    which is fair enough.

    I have a "proper" fix for this, which is to a) do refcounting on
    connections and b) implement a proper ack timer so we don't keep unacked
    skbs lying around for ever. But for 2.6.12 I propose just supressing the
    WARN_ON(). Users will still see the "NETDEV WATCHDOG" warning, but that's
    not nearly as bad as a WARN_ON() which users interpret as an Oops.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Michael Ellerman