From: Jiri Pirko <jiri@resnulli.us>
To: sfeldma@gmail.com
Cc: netdev@vger.kernel.org, roopa@cumulusnetworks.com,
linux@roeck-us.net, f.fainelli@gmail.com, andrew@lunn.ch,
simon.horman@netronome.com, joe@perches.com,
sridhar.samudrala@intel.com, ronen.arad@intel.com
Subject: Re: [PATCH net-next v6 05/23] rocker: support prepare-commit transaction model
Date: Sat, 9 May 2015 20:18:24 +0200 [thread overview]
Message-ID: <20150509181824.GA2290@nanopsycho> (raw)
In-Reply-To: <1431193225-807-6-git-send-email-sfeldma@gmail.com>
Sat, May 09, 2015 at 07:40:07PM CEST, sfeldma@gmail.com wrote:
>From: Scott Feldman <sfeldma@gmail.com>
>
>For rocker, support prepare-commit transaction model for setting attributes
>(and for adding objects). This requires rocker to preallocate memory
>needed for the commit up front in the prepare phase. Since rtnl_lock is
>held between prepare-commit, store the allocated memory on a queue hanging
>off of the rocker_port. Also, in prepare phase, do everything right up to
>calling into HW. The same code paths are tranversed in the driver for both
>prepare and commit phases. In some cases, any state modified in the
>prepare phase must be reverted before returning so the commit phase makes
>the same decisions.
>
>As a consequence of holding rtnl_lock in process context for all attr sets
>(and obj adds), all memory is GFP_KERNEL allocated and we don't need to
>busy spin waiting for the device to complete the command. So the bulk of
>this patch is simplifying the memory allocations to only use GFP_KERNEL and
>to remove the nowait flag and busy spin loop.
>
>Signed-off-by: Scott Feldman <sfeldma@gmail.com>
>---
> drivers/net/ethernet/rocker/rocker.c | 393 +++++++++++++++++++++++-----------
> 1 file changed, 271 insertions(+), 122 deletions(-)
>
...
>+static void *__rocker_port_alloc(struct rocker_port *rocker_port,
>+ size_t size, gfp_t flags,
>+ void *(*alloc)(size_t size, gfp_t flags))
>+{
you can omit alloc param here, since __rocker_port_alloc is called
always with kzalloc. Also, flags is always GFP_KERNEL, but I have no
problem in having that.
also, __rocker_port_alloc sond to me like it allocates actual port.
Maybe "__rocker_per_port_alloc" or something like that?
(same goes to other functions of similar name)
>+ struct list_head *elem = NULL;
>+
>+ /* If in transaction prepare phase, allocate the memory
>+ * and enqueue it on a per-port list. If in transaction
>+ * commit phase, dequeue the memory from the per-port list
>+ * rather than re-allocating the memory. The idea is the
>+ * driver code paths for prepare and commit are identical
>+ * so the memory allocated in the prepare phase is the
>+ * memory used in the commit phase.
>+ */
>+
>+ switch (rocker_port->trans) {
>+ case SWITCHDEV_TRANS_PREPARE:
>+ elem = alloc(size + sizeof(*elem), flags);
>+ if (!elem)
>+ return NULL;
>+ list_add_tail(elem, &rocker_port->trans_mem);
>+ break;
>+ case SWITCHDEV_TRANS_COMMIT:
>+ BUG_ON(list_empty(&rocker_port->trans_mem));
>+ elem = rocker_port->trans_mem.next;
>+ list_del_init(elem);
>+ break;
>+ case SWITCHDEV_TRANS_NONE:
>+ elem = alloc(size + sizeof(*elem), flags);
>+ if (elem)
>+ INIT_LIST_HEAD(elem);
>+ break;
I must say I don't like propagating SWITCHDEV_TRANS_* this deep into
driver. Also I don't like storing it in rocker_port->trans. I believe
that is should be seen only by rocker_port_attr_set. Then functions with
proper params should be called inside driver.
...
> static int rocker_cmd_exec(struct rocker *rocker,
> struct rocker_port *rocker_port,
> rocker_cmd_cb_t prepare, void *prepare_priv,
>- rocker_cmd_cb_t process, void *process_priv,
>- bool nowait)
>+ rocker_cmd_cb_t process, void *process_priv)
> {
> struct rocker_desc_info *desc_info;
> struct rocker_wait *wait;
> unsigned long flags;
> int err;
>
>- wait = rocker_wait_create(nowait ? GFP_ATOMIC : GFP_KERNEL);
>+ wait = rocker_wait_create(rocker_port);
> if (!wait)
> return -ENOMEM;
>- wait->nowait = nowait;
>
> spin_lock_irqsave(&rocker->cmd_ring_lock, flags);
>+
^^^
> desc_info = rocker_desc_head_get(&rocker->cmd_ring);
> if (!desc_info) {
> spin_unlock_irqrestore(&rocker->cmd_ring_lock, flags);
> err = -EAGAIN;
> goto out;
> }
>+
^^^
> err = prepare(rocker, rocker_port, desc_info, prepare_priv);
> if (err) {
> spin_unlock_irqrestore(&rocker->cmd_ring_lock, flags);
> goto out;
> }
>+
^^^ not sure why you adding these lines.
next prev parent reply other threads:[~2015-05-09 18:18 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-09 17:40 [PATCH net-next v6 00/23] switchdev: spring cleanup sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 01/23] switchdev: s/netdev_switch_/switchdev_/ and s/NETDEV_SWITCH_/SWITCHDEV_/ sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 02/23] switchdev: s/swdev_/switchdev_/ sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 03/23] switchdev: introduce get/set attrs ops sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 04/23] switchdev: convert parent_id_get to switchdev attr get sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 05/23] rocker: support prepare-commit transaction model sfeldma
2015-05-09 18:18 ` Jiri Pirko [this message]
2015-05-10 6:14 ` Scott Feldman
2015-05-09 17:40 ` [PATCH net-next v6 06/23] switchdev: convert STP update to switchdev attr set sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 07/23] switchdev: introduce switchdev add/del obj ops sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 08/23] switchdev: add port vlan obj sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 09/23] rocker: use switchdev add/del obj for bridge port vlans sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 10/23] switchdev: add bridge port flags attr sfeldma
2015-05-09 18:47 ` Jiri Pirko
2015-05-09 17:40 ` [PATCH net-next v6 11/23] switchdev: add new switchdev bridge setlink sfeldma
2015-05-09 18:48 ` Jiri Pirko
2015-05-09 17:40 ` [PATCH net-next v6 12/23] switchdev: cut over to new switchdev_port_bridge_setlink sfeldma
2015-05-09 18:49 ` Jiri Pirko
2015-05-09 17:40 ` [PATCH net-next v6 13/23] switchdev: remove old switchdev_port_bridge_setlink sfeldma
2015-05-09 18:49 ` Jiri Pirko
2015-05-09 17:40 ` [PATCH net-next v6 14/23] bridge: restore br_setlink back to original sfeldma
2015-05-09 19:00 ` Jiri Pirko
2015-05-10 16:10 ` roopa
2015-05-10 23:55 ` Scott Feldman
2015-05-11 0:55 ` roopa
2015-05-11 2:46 ` Scott Feldman
2015-05-11 3:03 ` roopa
2015-05-09 17:40 ` [PATCH net-next v6 15/23] switchdev: add new switchdev_port_bridge_dellink sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 16/23] switchdev: cut over to " sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 17/23] switchdev: remove unused switchdev_port_bridge_dellink sfeldma
2015-05-09 18:54 ` Jiri Pirko
2015-05-09 17:40 ` [PATCH net-next v6 18/23] switchdev: add new switchdev_port_bridge_getlink sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 19/23] switchdev: cut over to " sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 20/23] switchdev: convert fib_ipv4_add/del over to switchdev_port_obj_add/del sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 21/23] switchdev: remove NETIF_F_HW_SWITCH_OFFLOAD feature flag sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 22/23] rocker: make checkpatch -f clean sfeldma
2015-05-09 17:40 ` [PATCH net-next v6 23/23] switchdev: bring documentation up-to-date sfeldma
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150509181824.GA2290@nanopsycho \
--to=jiri@resnulli.us \
--cc=andrew@lunn.ch \
--cc=f.fainelli@gmail.com \
--cc=joe@perches.com \
--cc=linux@roeck-us.net \
--cc=netdev@vger.kernel.org \
--cc=ronen.arad@intel.com \
--cc=roopa@cumulusnetworks.com \
--cc=sfeldma@gmail.com \
--cc=simon.horman@netronome.com \
--cc=sridhar.samudrala@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.