29 Nov, 2010

1 commit

  • This patch adds XPS_CONFIG option to enable and disable XPS. This is
    done in the same manner as RPS_CONFIG. This is also fixes build
    failure in XPS code when SMP is not enabled.

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

    Tom Herbert
     

25 Nov, 2010

1 commit

  • This patch implements transmit packet steering (XPS) for multiqueue
    devices. XPS selects a transmit queue during packet transmission based
    on configuration. This is done by mapping the CPU transmitting the
    packet to a queue. This is the transmit side analogue to RPS-- where
    RPS is selecting a CPU based on receive queue, XPS selects a queue
    based on the CPU (previously there was an XPS patch from Eric
    Dumazet, but that might more appropriately be called transmit completion
    steering).

    Each transmit queue can be associated with a number of CPUs which will
    use the queue to send packets. This is configured as a CPU mask on a
    per queue basis in:

    /sys/class/net/eth/queues/tx-/xps_cpus

    The mappings are stored per device in an inverted data structure that
    maps CPUs to queues. In the netdevice structure this is an array of
    num_possible_cpu structures where each structure holds and array of
    queue_indexes for queues which that CPU can use.

    The benefits of XPS are improved locality in the per queue data
    structures. Also, transmit completions are more likely to be done
    nearer to the sending thread, so this should promote locality back
    to the socket on free (e.g. UDP). The benefits of XPS are dependent on
    cache hierarchy, application load, and other factors. XPS would
    nominally be configured so that a queue would only be shared by CPUs
    which are sharing a cache, the degenerative configuration woud be that
    each CPU has it's own queue.

    Below are some benchmark results which show the potential benfit of
    this patch. The netperf test has 500 instances of netperf TCP_RR test
    with 1 byte req. and resp.

    bnx2x on 16 core AMD
    XPS (16 queues, 1 TX queue per CPU) 1234K at 100% CPU
    No XPS (16 queues) 996K at 100% CPU

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

    Tom Herbert
     

28 Sep, 2010

1 commit

  • For RPS, we create a kobject for each RX queue based on the number of
    queues passed to alloc_netdev_mq(). However, drivers generally do not
    determine the numbers of hardware queues to use until much later, so
    this usually represents the maximum number the driver may use and not
    the actual number in use.

    For TX queues, drivers can update the actual number using
    netif_set_real_num_tx_queues(). Add a corresponding function for RX
    queues, netif_set_real_num_rx_queues().

    Signed-off-by: Ben Hutchings
    Signed-off-by: David S. Miller

    Ben Hutchings
     

22 May, 2010

1 commit

  • This reverts commit aaf8cdc34ddba08122f02217d9d684e2f9f5d575.

    Drivers like the ipw2100 call device_create_group when they
    are initialized and device_remove_group when they are shutdown.
    Moving them between namespaces deletes their sysfs groups early.

    In particular the following call chain results.
    netdev_unregister_kobject -> device_del -> kobject_del -> sysfs_remove_dir
    With sysfs_remove_dir recursively deleting all of it's subdirectories,
    and nothing adding them back.

    Ouch!

    Therefore we need to call something that ultimate calls sysfs_mv_dir
    as that sysfs function can move sysfs directories between namespaces
    without deleting their subdirectories or their contents. Allowing
    us to avoid placing extra boiler plate into every driver that does
    something interesting with sysfs.

    Currently the function that provides that capability is device_rename.
    That is the code works without nasty side effects as originally written.

    So remove the misguided fix for moving devices between namespaces. The
    bug in the kobject layer that inspired it has now been recognized and
    fixed.

    Signed-off-by: Eric W. Biederman
    Acked-by: David S. Miller
    Signed-off-by: Greg Kroah-Hartman

    Eric W. Biederman
     

03 May, 2008

1 commit

  • When a netdev is moved across namespaces with the
    'dev_change_net_namespace' function, the 'device_rename' function is
    used to fixup kobject and refresh the sysfs tree. The device_rename
    function will call kobject_rename and this one will check if there is
    an object with the same name and this is the case because we are
    renaming the object with the same name.

    The use of 'device_rename' seems for me wrong because we usually don't
    rename it but just move it across namespaces. As we just want to do a
    mini "netdev_[un]register", IMO the functions
    'netdev_[un]register_kobject' should be used instead, like an usual
    network device [un]registering.

    This patch replace device_rename by netdev_unregister_kobject,
    followed by netdev_register_kobject.

    The netdev_register_kobject will call device_initialize and will raise
    a warning indicating the device was already initialized. In order to
    fix that, I split the device initialization into a separate function
    and use it together with 'netdev_register_kobject' into
    register_netdevice. So we can safely call 'netdev_register_kobject' in
    'dev_change_net_namespace'.

    This fix will allow to properly use the sysfs per namespace which is
    coming from -mm tree.

    Signed-off-by: Daniel Lezcano
    Acked-by: Benjamin Thery
    Signed-off-by: David S. Miller

    Daniel Lezcano
     

24 Oct, 2007

1 commit