> -----Original Message----- > From: Hiroshi Shimamoto [mailto:h-shimam...@ct.jp.nec.com] > Sent: Tuesday, May 19, 2015 5:06 PM > To: Kirsher, Jeffrey T; intel-wired-...@lists.osuosl.org > Cc: Skidmore, Donald C; Or Gerlitz; David Miller; Linux Netdev List; > nhor...@redhat.com; sassm...@redhat.com; jogre...@redhat.com; > Choi, Sy Jong; Edward Cree; Rony Efraim > Subject: [PATCH v5 3/3] ixgbe: Add new ndo to trust VF > > From: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com> > > Implement the new netdev op to trust VF in ixgbe and make VF multicast > promiscuous mode enabled only in trusted VF. > > The administrator can make VF trusted by ip command which supports trust > message. > # ip link set dev eth0 vf 1 trust on > > After making VF untrusted, ixgbe disables VF multicast promiscuous feature > requested from VF. > # ip link set dev eth0 vf 1 trust off > > Only trusted VF can enable VF multicast promiscuous mode and handle over > 30 IPv6 addresses on VM, because VF multicast promiscuous mode may hurt > performance. > > Signed-off-by: Hiroshi Shimamoto <h-shimam...@ct.jp.nec.com> > Reviewed-by: Hayato Momma <h-mo...@ce.jp.nec.com> > CC: Choi, Sy Jong <sy.jong.c...@intel.com> > --- > drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 + > drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 5 ++++ > drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 38 > +++++++++++++++++++++++--- > drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h | 2 ++ > 4 files changed, 42 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h > b/drivers/net/ethernet/intel/ixgbe/ixgbe.h > index 08e65b6..5181a4d 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h > @@ -153,6 +153,7 @@ struct vf_data_storage { > u16 vlan_count; > u8 spoofchk_enabled; > bool rss_query_enabled; > + u8 trusted; > unsigned int vf_api; > }; > > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > index b1ea707..263cb40 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c > @@ -3679,6 +3679,10 @@ static void ixgbe_configure_virtualization(struct > ixgbe_adapter *adapter) > /* Enable/Disable RSS query feature */ > ixgbe_ndo_set_vf_rss_query_en(adapter->netdev, i, > adapter- > >vfinfo[i].rss_query_enabled); > + > + /* Reconfigure features in trusted */ > + ixgbe_ndo_set_vf_trust(adapter->netdev, i, > + adapter->vfinfo[i].trusted); > } > } > > @@ -8182,6 +8186,7 @@ static const struct net_device_ops > ixgbe_netdev_ops = { > .ndo_set_vf_rate = ixgbe_ndo_set_vf_bw, > .ndo_set_vf_spoofchk = ixgbe_ndo_set_vf_spoofchk, > .ndo_set_vf_rss_query_en = ixgbe_ndo_set_vf_rss_query_en, > + .ndo_set_vf_trust = ixgbe_ndo_set_vf_trust, > .ndo_get_vf_config = ixgbe_ndo_get_vf_config, > .ndo_get_stats64 = ixgbe_get_stats64, > #ifdef CONFIG_IXGBE_DCB > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c > b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c > index 615f651..6c602bc 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c > @@ -117,8 +117,11 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter > *adapter) > */ > adapter->vfinfo[i].rss_query_enabled = 0; > > - /* Turn multicast promiscuous mode off for all VFs */ > + /* Disallow VF multicast promiscuous capability > + * and turn it off for all VFs > + */ > adapter->vfinfo[i].mc_promisc = false; > + adapter->vfinfo[i].trusted = false; > } > > return 0; > @@ -329,9 +332,14 @@ static int ixgbe_enable_vf_mc_promisc(struct > ixgbe_adapter *adapter, u32 vf) > hw = &adapter->hw; > vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf)); > > - e_info(drv, "VF %u: enabling multicast promiscuous\n", vf); > - > - vmolr |= IXGBE_VMOLR_MPE; > + if (adapter->vfinfo[vf].trusted) { > + e_info(drv, "VF %u: enabling multicast promiscuous\n", vf); > + vmolr |= IXGBE_VMOLR_MPE; > + } else { > + e_info(drv, "VF %u: disabling multicast promiscuous " > + "on untrusted VF.\n", vf); > + vmolr &= ~IXGBE_VMOLR_MPE; > + } > > IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf), vmolr); > > @@ -1492,6 +1500,27 @@ int ixgbe_ndo_set_vf_rss_query_en(struct > net_device *netdev, int vf, > return 0; > } > > +int ixgbe_ndo_set_vf_trust(struct net_device *netdev, int vf, bool > +setting) { > + struct ixgbe_adapter *adapter = netdev_priv(netdev); > + > + if (vf >= adapter->num_vfs) > + return -EINVAL; > + > + /* nothing to do */ > + if (adapter->vfinfo[vf].trusted == setting) > + return 0; > + > + adapter->vfinfo[vf].trusted = setting; > + > + /* Reconfigure features which are only allowed for trusted VF */ > + /* VF multicast promiscuous mode */ > + if (adapter->vfinfo[vf].mc_promisc) > + ixgbe_enable_vf_mc_promisc(adapter, vf); > + > + return 0; > +} > + > int ixgbe_ndo_get_vf_config(struct net_device *netdev, > int vf, struct ifla_vf_info *ivi) { @@ -1506,5 > +1535,6 > @@ int ixgbe_ndo_get_vf_config(struct net_device *netdev, > ivi->qos = adapter->vfinfo[vf].pf_qos; > ivi->spoofchk = adapter->vfinfo[vf].spoofchk_enabled; > ivi->rss_query_en = adapter->vfinfo[vf].rss_query_enabled; > + ivi->trusted = adapter->vfinfo[vf].trusted; > return 0; > } > diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h > b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h > index 2c197e6..d85e6fc 100644 > --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h > +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h > @@ -49,6 +49,8 @@ int ixgbe_ndo_set_vf_bw(struct net_device *netdev, > int vf, int min_tx_rate, int ixgbe_ndo_set_vf_spoofchk(struct net_device > *netdev, int vf, bool setting); int ixgbe_ndo_set_vf_rss_query_en(struct > net_device *netdev, int vf, > bool setting); > +int ixgbe_ndo_set_vf_trust(struct net_device *netdev, > + int vf, bool setting); > int ixgbe_ndo_get_vf_config(struct net_device *netdev, > int vf, struct ifla_vf_info *ivi); void > ixgbe_check_vf_rate_limit(struct ixgbe_adapter *adapter); > -- > 1.8.3.1
Hey Hiroshi, In general I like your patch set. There is a little complexity I’m not sure I understand. I'm assuming that: adapter->vfinfo[vf].trusted - Clearly stores if the PF trusts a given VF (i.e. allows it to go into "risky" configurations) What I'm a bit unclear about is: adapter->vfinfo[vf].mc_promisc - This seems to record that the VF at one time as requested over 30 MC. I don't understand the reason for this bit. Wouldn't it be simpler and more straightforward to simply use the trusted bit? I guess specifically I don't understand why we would call ixgbe_enable_vf_mc_promisc() in ixgbe_ndo_set_vf_trust() if mc_promisc is set. Wouldn't just setting the trusted bit allow the next IXGBE_VF_SET_MC_PROMISC mailbox message to (possibly) turn on MC Promisc mode? Thanks, -Don Skidmore <donald.c.skidm...@intel.com>