netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Martin Habets <habetsm.xilinx@gmail.com>
To: ecree@xilinx.com
Cc: netdev@vger.kernel.org, linux-net-drivers@amd.com,
	davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com,
	edumazet@google.com, Edward Cree <ecree.xilinx@gmail.com>
Subject: Re: [PATCH v2 net-next 1/6] sfc: bind blocks for TC offload on EF100
Date: Wed, 28 Sep 2022 09:43:14 +0100	[thread overview]
Message-ID: <YzQJIiRPI7i+orJu@gmail.com> (raw)
In-Reply-To: <097c1e9d6122630f909fb0c25868b6ce253a89c2.1664218348.git.ecree.xilinx@gmail.com>

On Mon, Sep 26, 2022 at 07:57:31PM +0100, ecree@xilinx.com wrote:
> From: Edward Cree <ecree.xilinx@gmail.com>
> 
> Bind direct blocks for the MAE-admin PF and each VF representor.
> Currently these connect to a stub efx_tc_flower() that only returns
>  -EOPNOTSUPP; subsequent patches will implement flower offloads to the
>  Match-Action Engine.
> 
> Signed-off-by: Edward Cree <ecree.xilinx@gmail.com>
> ---
>  drivers/net/ethernet/sfc/Makefile       |   2 +-
>  drivers/net/ethernet/sfc/ef100_netdev.c |   4 +
>  drivers/net/ethernet/sfc/ef100_nic.c    |   3 +
>  drivers/net/ethernet/sfc/ef100_rep.c    |  16 +++
>  drivers/net/ethernet/sfc/tc.c           |  14 ++-
>  drivers/net/ethernet/sfc/tc.h           |   7 ++
>  drivers/net/ethernet/sfc/tc_bindings.c  | 157 ++++++++++++++++++++++++
>  drivers/net/ethernet/sfc/tc_bindings.h  |  23 ++++
>  8 files changed, 224 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/net/ethernet/sfc/tc_bindings.c
>  create mode 100644 drivers/net/ethernet/sfc/tc_bindings.h
>
<snip>

> diff --git a/drivers/net/ethernet/sfc/tc_bindings.c b/drivers/net/ethernet/sfc/tc_bindings.c
> new file mode 100644
> index 000000000000..d9401ee7b8e1
> --- /dev/null
> +++ b/drivers/net/ethernet/sfc/tc_bindings.c
> @@ -0,0 +1,157 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/****************************************************************************
> + * Driver for Solarflare network controllers and boards
> + * Copyright 2022 Xilinx Inc.

New files should have "Copyright 2022 Advanced Micro Devices, Inc."
Same for the .h file below.

-- 
Martin Habets <habetsm.xilinx@gmail.com>

> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published
> + * by the Free Software Foundation, incorporated herein by reference.
> + */
> +
> +#include "tc_bindings.h"
> +#include "tc.h"
> +
> +struct efx_tc_block_binding {
> +	struct list_head list;
> +	struct efx_nic *efx;
> +	struct efx_rep *efv;
> +	struct net_device *otherdev; /* may actually be us */
> +	struct flow_block *block;
> +};
> +
> +static struct efx_tc_block_binding *efx_tc_find_binding(struct efx_nic *efx,
> +							struct net_device *otherdev)
> +{
> +	struct efx_tc_block_binding *binding;
> +
> +	ASSERT_RTNL();
> +	list_for_each_entry(binding, &efx->tc->block_list, list)
> +		if (binding->otherdev == otherdev)
> +			return binding;
> +	return NULL;
> +}
> +
> +static int efx_tc_block_cb(enum tc_setup_type type, void *type_data,
> +			   void *cb_priv)
> +{
> +	struct efx_tc_block_binding *binding = cb_priv;
> +	struct flow_cls_offload *tcf = type_data;
> +
> +	switch (type) {
> +	case TC_SETUP_CLSFLOWER:
> +		return efx_tc_flower(binding->efx, binding->otherdev,
> +				     tcf, binding->efv);
> +	default:
> +		return -EOPNOTSUPP;
> +	}
> +}
> +
> +static void efx_tc_block_unbind(void *cb_priv)
> +{
> +	struct efx_tc_block_binding *binding = cb_priv;
> +
> +	list_del(&binding->list);
> +	kfree(binding);
> +}
> +
> +static struct efx_tc_block_binding *efx_tc_create_binding(
> +			struct efx_nic *efx, struct efx_rep *efv,
> +			struct net_device *otherdev, struct flow_block *block)
> +{
> +	struct efx_tc_block_binding *binding = kmalloc(sizeof(*binding), GFP_KERNEL);
> +
> +	if (!binding)
> +		return ERR_PTR(-ENOMEM);
> +	binding->efx = efx;
> +	binding->efv = efv;
> +	binding->otherdev = otherdev;
> +	binding->block = block;
> +	list_add(&binding->list, &efx->tc->block_list);
> +	return binding;
> +}
> +
> +int efx_tc_setup_block(struct net_device *net_dev, struct efx_nic *efx,
> +		       struct flow_block_offload *tcb, struct efx_rep *efv)
> +{
> +	struct efx_tc_block_binding *binding;
> +	struct flow_block_cb *block_cb;
> +	int rc;
> +
> +	if (tcb->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
> +		return -EOPNOTSUPP;
> +
> +	if (WARN_ON(!efx->tc))
> +		return -ENETDOWN;
> +
> +	switch (tcb->command) {
> +	case FLOW_BLOCK_BIND:
> +		binding = efx_tc_create_binding(efx, efv, net_dev, tcb->block);
> +		if (IS_ERR(binding))
> +			return PTR_ERR(binding);
> +		block_cb = flow_block_cb_alloc(efx_tc_block_cb, binding,
> +					       binding, efx_tc_block_unbind);
> +		rc = PTR_ERR_OR_ZERO(block_cb);
> +		netif_dbg(efx, drv, efx->net_dev,
> +			  "bind %sdirect block for device %s, rc %d\n",
> +			  net_dev == efx->net_dev ? "" :
> +			  efv ? "semi" : "in",
> +			  net_dev ? net_dev->name : NULL, rc);
> +		if (rc) {
> +			list_del(&binding->list);
> +			kfree(binding);
> +		} else {
> +			flow_block_cb_add(block_cb, tcb);
> +		}
> +		return rc;
> +	case FLOW_BLOCK_UNBIND:
> +		binding = efx_tc_find_binding(efx, net_dev);
> +		if (binding) {
> +			block_cb = flow_block_cb_lookup(tcb->block,
> +							efx_tc_block_cb,
> +							binding);
> +			if (block_cb) {
> +				flow_block_cb_remove(block_cb, tcb);
> +				netif_dbg(efx, drv, efx->net_dev,
> +					  "unbound %sdirect block for device %s\n",
> +					  net_dev == efx->net_dev ? "" :
> +					  binding->efv ? "semi" : "in",
> +					  net_dev ? net_dev->name : NULL);
> +				return 0;
> +			}
> +		}
> +		/* If we're in driver teardown, then we expect to have
> +		 * already unbound all our blocks (we did it early while
> +		 * we still had MCDI to remove the filters), so getting
> +		 * unbind callbacks now isn't a problem.
> +		 */
> +		netif_cond_dbg(efx, drv, efx->net_dev,
> +			       !efx->tc->up, warn,
> +			       "%sdirect block unbind for device %s, was never bound\n",
> +			       net_dev == efx->net_dev ? "" : "in",
> +			       net_dev ? net_dev->name : NULL);
> +		return -ENOENT;
> +	default:
> +		return -EOPNOTSUPP;
> +	}
> +}
> +
> +/* .ndo_setup_tc implementation
> + * Entry point for flower block and filter management.
> + */
> +int efx_tc_setup(struct net_device *net_dev, enum tc_setup_type type,
> +		 void *type_data)
> +{
> +	struct efx_nic *efx = efx_netdev_priv(net_dev);
> +
> +	if (efx->type->is_vf)
> +		return -EOPNOTSUPP;
> +	if (!efx->tc)
> +		return -EOPNOTSUPP;
> +
> +	if (type == TC_SETUP_CLSFLOWER)
> +		return efx_tc_flower(efx, net_dev, type_data, NULL);
> +	if (type == TC_SETUP_BLOCK)
> +		return efx_tc_setup_block(net_dev, efx, type_data, NULL);
> +
> +	return -EOPNOTSUPP;
> +}
> diff --git a/drivers/net/ethernet/sfc/tc_bindings.h b/drivers/net/ethernet/sfc/tc_bindings.h
> new file mode 100644
> index 000000000000..bcd63c270585
> --- /dev/null
> +++ b/drivers/net/ethernet/sfc/tc_bindings.h
> @@ -0,0 +1,23 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/****************************************************************************
> + * Driver for Solarflare network controllers and boards
> + * Copyright 2022 Xilinx Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License version 2 as published
> + * by the Free Software Foundation, incorporated herein by reference.
> + */
> +
> +#ifndef EFX_TC_BINDINGS_H
> +#define EFX_TC_BINDINGS_H
> +#include "net_driver.h"
> +
> +#include <net/sch_generic.h>
> +
> +struct efx_rep;
> +
> +int efx_tc_setup_block(struct net_device *net_dev, struct efx_nic *efx,
> +		       struct flow_block_offload *tcb, struct efx_rep *efv);
> +int efx_tc_setup(struct net_device *net_dev, enum tc_setup_type type,
> +		 void *type_data);
> +#endif /* EFX_TC_BINDINGS_H */

  reply	other threads:[~2022-09-28  8:47 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-26 18:57 [PATCH v2 net-next 0/6] sfc: bare bones TC offload ecree
2022-09-26 18:57 ` [PATCH v2 net-next 1/6] sfc: bind blocks for TC offload on EF100 ecree
2022-09-28  8:43   ` Martin Habets [this message]
2022-09-26 18:57 ` [PATCH v2 net-next 2/6] sfc: bind indirect " ecree
2022-09-26 18:57 ` [PATCH v2 net-next 3/6] sfc: optional logging of TC offload errors ecree
2022-09-28 17:44   ` Jakub Kicinski
2022-09-28 18:17     ` Edward Cree
2022-09-28 18:32       ` Jakub Kicinski
2022-09-28 18:58         ` Edward Cree
2022-09-28 19:07           ` Jakub Kicinski
2022-09-28 21:14             ` Edward Cree
2022-09-29  1:15               ` Jakub Kicinski
2022-09-30  9:03                 ` Edward Cree
2022-09-30 14:19                   ` Jakub Kicinski
2022-10-03 19:30                     ` Edward Cree
2022-09-26 18:57 ` [PATCH v2 net-next 4/6] sfc: add a hashtable for offloaded TC rules ecree
2022-09-26 18:57 ` [PATCH v2 net-next 5/6] sfc: interrogate MAE capabilities at probe time ecree
2022-09-26 18:57 ` [PATCH v2 net-next 6/6] sfc: bare bones TC offload on EF100 ecree
2022-09-28  8:50 ` [PATCH v2 net-next 0/6] sfc: bare bones TC offload patchwork-bot+netdevbpf

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=YzQJIiRPI7i+orJu@gmail.com \
    --to=habetsm.xilinx@gmail.com \
    --cc=davem@davemloft.net \
    --cc=ecree.xilinx@gmail.com \
    --cc=ecree@xilinx.com \
    --cc=edumazet@google.com \
    --cc=kuba@kernel.org \
    --cc=linux-net-drivers@amd.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).