lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1375368891-9979-1-git-send-email-nikolay@redhat.com>
Date:	Thu,  1 Aug 2013 16:54:46 +0200
From:	Nikolay Aleksandrov <nikolay@...hat.com>
To:	netdev@...r.kernel.org
Cc:	davem@...emloft.net, andy@...yhouse.net, fubar@...ibm.com
Subject: [PATCH net-next v3 0/5] bonding: groundwork and initial conversion to RCU

From: Nikolay Aleksandrov <Nikolay Aleksandrov nikolay@...hat.com>

Hello,
 This patchset aims to lay the groundwork, and do the initial conversion to
RCUism. I decided that it'll be much better to make the bonding RCU
conversion gradual, so patches can be reviewed and tested better rather
than having one huge patch (which I did in the beginning, before this).
The first patch is straightforward and it converts the bonding to the
standard list API, simplifying a lot of code, removing unnecessary local
variables and allowing to use the nice rculist API later. It also takes
care of some minor styling issues (re-arranging local variables longest ->
shortest, removing brackets for single statement if/else, leaving new line
before return statement etc.).
 The second patch simplifies the conversion by removing unnecessary
read_lock(&bond->curr_slave_lock) in xmit paths that are to be converted
later, because we only care if the pointer is NULL or a slave there, since
we already have bond->lock the slave can't go away.
 The third patch simplifies the broadcast xmit function by removing
the use of curr_active_slave and converting to standard list API. Also this
design of the broadcast xmit function avoids a subtle double packet tx race
when converted to RCU.
 The fourth patch factors out the code that transmits skb through a slave
with given id (i.e. rr_tx_counter in rr mode, hashed value in xor mode) and
simplifies the active-backup xmit path because bond_dev_queue_xmit always
consumes the skb. The new bond_xmit_slave_id function is used in rr and xor
modes currently, but the plans are to use it in 3ad mode as well thus it's
made global. I've left the function prototype to be 81 chars so I wouldn't
break it, if this is an issue I can always break it in more lines.
 The fifth patch introduces RCU by converting attach/detach and release to
RCU. It also converts dereferencing of curr_active_slave to rcu_dereference
although it's not fully converted to RCU, that is needed for the converted
xmit paths. And it converts roundrobin, broadcast, xor and active-backup
xmit paths to RCU. The 3ad and ALB/TLB modes acquire read_lock(&bond->lock)
to make sure that no slave will be removed and to sync properly with
enslave and release as before.
 This way for the price of a little complexity, we'll be able to convert
individual parts of the bonding to RCU, and test them easier in the
process. If this patchset is accepted in some form, I'll post followups
in the next weeks that gradually convert the bonding to RCU and remove the
need for the rwlocks.
 For performance notes please refer to patch 5 (RCU conversion one).

v3 summary:
 patch 1 - fix 3ad bug where next_slave wasn't checked if we've crossed
 to the first slave again (v2 introduced bug).
 Note: I know that it's not necessary to check next_slave for NULL but
 later when the mode is converted to RCU that'll be necessary so I put
 it there from now

v2 summary:
 patch 1 - new primitives as suggested, removal of slave_cnt for checking
 if there're slaves in the bonding (using list_empty instead), using
 bond_for_each_slave and introducing bond_for_each_slave_continue_reverse
 for consistency, also making bond_next/prev_slave return NULL and
 simplifying further, also make bond_for_each_slave_from check if pos is
 NULL, also I think we fix an ALB bug in bond_alb_deinit_slave because
 we have to check if any slaves have the released slave's MAC address, and
 in case we have 2 slaves "> 1" would fail since this one has been already
 detached and slave_cnt is == 1 exactly, so switch to !list_empty

 patch 4 - don't set slave to NULL in roundrobin, it's not necessary

 patch 5 - included the performance notes, converted curr_active_slave in
 bond_sysfs.c to rcu_dereference, fixed a potential latency issue in slave
 release because TX was unblocked after synchronize_rcu which might take a
 while

Nikolay Aleksandrov (5):
  bonding: convert to list API and replace bond's custom list
  bonding: remove unnecessary read_locks of curr_slave_lock
  bonding: simplify broadcast_xmit function
  bonding: factor out slave id tx code and simplify xmit paths
  bonding: initial RCU conversion

 drivers/net/bonding/bond_3ad.c    |  44 ++--
 drivers/net/bonding/bond_alb.c    |  57 +++--
 drivers/net/bonding/bond_main.c   | 433 +++++++++++++++-----------------------
 drivers/net/bonding/bond_procfs.c |  12 +-
 drivers/net/bonding/bond_sysfs.c  |  62 +++---
 drivers/net/bonding/bonding.h     |  85 +++++---
 6 files changed, 310 insertions(+), 383 deletions(-)

-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ