public inbox for netdev@vger.kernel.org 
 help / color / mirror / Atom feed
From: Nikolay Aleksandrov <nikolay@cumulusnetworks•com>
To: Jiri Pirko <jiri@resnulli•us>, netdev@vger•kernel.org
Cc: davem@davemloft•net, idosch@mellanox•com, eladr@mellanox•com,
	yotamg@mellanox•com, ogerlitz@mellanox•com, corbet@lwn•net,
	stephen@networkplumber•org, sfeldma@gmail•com,
	vivien.didelot@savoirfairelinux•com, roopa@cumulusnetworks•com,
	gospo@cumulusnetworks•com
Subject: Re: [patch net-next 7/8] mlxsw: Adding layer 2 multicast support
Date: Sun, 10 Jan 2016 15:23:11 +0100	[thread overview]
Message-ID: <5692694F.8040902@cumulusnetworks.com> (raw)
In-Reply-To: <1452431248-5411-8-git-send-email-jiri@resnulli.us>

On 01/10/2016 02:07 PM, Jiri Pirko wrote:
> From: Elad Raz <eladr@mellanox•com>
> 
> Add SWITCHDEV_OBJ_ID_PORT_MDB switchdev ops support. On first MDB insertion
> creates a new multicast group (MID) and add members port to the MID. Also
> add new MDB entry for the flooding-domain (fid-vid) and link the MDB entry
> to the newly constructed MC group.
> 
> Signed-off-by: Elad Raz <eladr@mellanox•com>
> Signed-off-by: Ido Schimmel <idosch@mellanox•com>
> Signed-off-by: Jiri Pirko <jiri@mellanox•com>
> ---
>  drivers/net/ethernet/mellanox/mlxsw/spectrum.c     |   1 +
>  drivers/net/ethernet/mellanox/mlxsw/spectrum.h     |  13 ++
>  .../ethernet/mellanox/mlxsw/spectrum_switchdev.c   | 176 +++++++++++++++++++++
>  3 files changed, 190 insertions(+)
> 
[snip]
> +static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
> +						const unsigned char *addr,
> +						u16 vid)
> +{
> +	struct mlxsw_sp_mid *mid;
> +	u16 mid_idx;
> +
> +	mid_idx = find_first_zero_bit(mlxsw_sp->br_mids.mapped,
> +				      MLXSW_SP_MID_MAX);
> +	if (mid_idx == MLXSW_SP_MID_MAX)
> +		return NULL;
> +
> +	mid = kzalloc(sizeof(*mid), GFP_ATOMIC);

Is GFP_ATOMIC allocation really required here ?
mlxsw_sp_port_smid_set() which is called after this uses GFP_KERNEL.

Cheers,
 Nik

> +	if (!mid)
> +		return NULL;
> +
> +	set_bit(mid_idx, mlxsw_sp->br_mids.mapped);
> +	ether_addr_copy(mid->addr, addr);
> +	mid->vid = vid;
> +	mid->mid = mid_idx;
> +	mid->ref_count = 0;
> +	list_add_tail(&mid->list, &mlxsw_sp->br_mids.list);
> +
> +	return mid;
> +}
> +
> +static int __mlxsw_sp_mc_dec_ref(struct mlxsw_sp *mlxsw_sp,
> +				 struct mlxsw_sp_mid *mid)
> +{
> +	if (--mid->ref_count == 0) {
> +		list_del(&mid->list);
> +		clear_bit(mid->mid, mlxsw_sp->br_mids.mapped);
> +		kfree(mid);
> +		return 1;
> +	}
> +	return 0;
> +}
> +
> +static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
> +				 const struct switchdev_obj_port_mdb *mdb,
> +				 struct switchdev_trans *trans)
> +{
> +	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
> +	struct net_device *dev = mlxsw_sp_port->dev;
> +	struct mlxsw_sp_mid *mid;
> +	u16 fid = mlxsw_sp_port_vid_to_fid_get(mlxsw_sp_port, mdb->vid);
> +	int err = 0;
> +
> +	if (switchdev_trans_ph_prepare(trans))
> +		return 0;
> +
> +	mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, mdb->vid);
> +	if (!mid) {
> +		mid = __mlxsw_sp_mc_alloc(mlxsw_sp, mdb->addr, mdb->vid);
> +		if (!mid) {
> +			netdev_err(dev, "Unable to allocate MC group\n");
> +			return -ENOMEM;
> +		}
> +	}
> +	mid->ref_count++;
> +
> +	err = mlxsw_sp_port_smid_set(mlxsw_sp_port, mid->mid, true,
> +				     mid->ref_count == 1);
> +	if (err) {
> +		netdev_err(dev, "Unable to set SMID\n");
> +		goto err_out;
> +	}
> +
> +	if (mid->ref_count == 1) {
> +		err = mlxsw_sp_port_mdb_op(mlxsw_sp, mdb->addr, fid, mid->mid,
> +					   true);
> +		if (err) {
> +			netdev_err(dev, "Unable to set MC SFD\n");
> +			goto err_out;
> +		}
> +	}
> +
> +	return 0;
> +
> +err_out:
> +	__mlxsw_sp_mc_dec_ref(mlxsw_sp, mid);
> +	return err;
> +}
> +
>  static int mlxsw_sp_port_obj_add(struct net_device *dev,
>  				 const struct switchdev_obj *obj,
>  				 struct switchdev_trans *trans)
> @@ -704,6 +841,11 @@ static int mlxsw_sp_port_obj_add(struct net_device *dev,
>  						   SWITCHDEV_OBJ_PORT_FDB(obj),
>  						   trans);
>  		break;
> +	case SWITCHDEV_OBJ_ID_PORT_MDB:
> +		err = mlxsw_sp_port_mdb_add(mlxsw_sp_port,
> +					    SWITCHDEV_OBJ_PORT_MDB(obj),
> +					    trans);
> +		break;
>  	default:
>  		err = -EOPNOTSUPP;
>  		break;
> @@ -817,6 +959,37 @@ mlxsw_sp_port_fdb_static_del(struct mlxsw_sp_port *mlxsw_sp_port,
>  						   false, false);
>  }
>  
[snip]

  reply	other threads:[~2016-01-10 14:23 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-10 13:07 [patch net-next 0/8] mlxsw: Adding layer 2 multicast Jiri Pirko
2016-01-10 13:07 ` [patch net-next 1/8] switchdev: Adding MDB entry offload Jiri Pirko
2016-01-10 13:07 ` [patch net-next 2/8] bridge: Reflect MDB entries to hardware Jiri Pirko
2016-01-10 13:07 ` [patch net-next 3/8] mlxsw: reg: Add definition of multicast record for SFD register Jiri Pirko
2016-01-10 13:07 ` [patch net-next 4/8] mlxsw: reg: Adding SMID register Jiri Pirko
2016-01-10 13:07 ` [patch net-next 5/8] mlxsw: Changing the maximum number of multicast group to a define Jiri Pirko
2016-01-10 13:07 ` [patch net-next 6/8] mlxsw: Adding VID to FID translatation Jiri Pirko
2016-01-10 13:07 ` [patch net-next 7/8] mlxsw: Adding layer 2 multicast support Jiri Pirko
2016-01-10 14:23   ` Nikolay Aleksandrov [this message]
2016-01-10 13:07 ` [patch net-next 8/8] switchdev: Adding IGMP snooping documentation Jiri Pirko

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=5692694F.8040902@cumulusnetworks.com \
    --to=nikolay@cumulusnetworks$(echo .)com \
    --cc=corbet@lwn$(echo .)net \
    --cc=davem@davemloft$(echo .)net \
    --cc=eladr@mellanox$(echo .)com \
    --cc=gospo@cumulusnetworks$(echo .)com \
    --cc=idosch@mellanox$(echo .)com \
    --cc=jiri@resnulli$(echo .)us \
    --cc=netdev@vger$(echo .)kernel.org \
    --cc=ogerlitz@mellanox$(echo .)com \
    --cc=roopa@cumulusnetworks$(echo .)com \
    --cc=sfeldma@gmail$(echo .)com \
    --cc=stephen@networkplumber$(echo .)org \
    --cc=vivien.didelot@savoirfairelinux$(echo .)com \
    --cc=yotamg@mellanox$(echo .)com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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