IB/hfi1: Activate the dummy netdev
As described in earlier patches, ipoib netdev will share receive contexts with existing VNIC netdev through a dummy netdev. The following changes are made to achieve that: - Set up netdev receive contexts after user contexts. A function is added to count the available netdev receive contexts. - Add functions to set/get receive map table free index. - Rename NUM_VNIC_MAP_ENTRIES as NUM_NETDEV_MAP_ENTRIES. - Let the dummy netdev own the receive contexts instead of VNIC. - Allocate the dummy netdev when the hfi1 device is added and free it when the device is removed. - Initialize AIP RSM rules when the IpoIb rxq is initialized and remove the rules when it is de-initialized. - Convert VNIC to use the dummy netdev. Link: https://lore.kernel.org/r/20200511160649.173205.4626.stgit@awfm-01.aw.intel.com Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com> Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Sadanand Warrier <sadanand.warrier@intel.com> Signed-off-by: Grzegorz Andrejczuk <grzegorz.andrejczuk@intel.com> Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Este cometimento está contido em:

cometido por
Jason Gunthorpe

ascendente
370caa5b58
cometimento
4730f4a6c6
@@ -140,6 +140,50 @@ static int hfi1_netdev_allot_ctxt(struct hfi1_netdev_priv *priv,
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* hfi1_num_netdev_contexts - Count of netdev recv contexts to use.
|
||||
* @dd: device on which to allocate netdev contexts
|
||||
* @available_contexts: count of available receive contexts
|
||||
* @cpu_mask: mask of possible cpus to include for contexts
|
||||
*
|
||||
* Return: count of physical cores on a node or the remaining available recv
|
||||
* contexts for netdev recv context usage up to the maximum of
|
||||
* HFI1_MAX_NETDEV_CTXTS.
|
||||
* A value of 0 can be returned when acceleration is explicitly turned off,
|
||||
* a memory allocation error occurs or when there are no available contexts.
|
||||
*
|
||||
*/
|
||||
u32 hfi1_num_netdev_contexts(struct hfi1_devdata *dd, u32 available_contexts,
|
||||
struct cpumask *cpu_mask)
|
||||
{
|
||||
cpumask_var_t node_cpu_mask;
|
||||
unsigned int available_cpus;
|
||||
|
||||
if (!HFI1_CAP_IS_KSET(AIP))
|
||||
return 0;
|
||||
|
||||
/* Always give user contexts priority over netdev contexts */
|
||||
if (available_contexts == 0) {
|
||||
dd_dev_info(dd, "No receive contexts available for netdevs.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!zalloc_cpumask_var(&node_cpu_mask, GFP_KERNEL)) {
|
||||
dd_dev_err(dd, "Unable to allocate cpu_mask for netdevs.\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
cpumask_and(node_cpu_mask, cpu_mask,
|
||||
cpumask_of_node(pcibus_to_node(dd->pcidev->bus)));
|
||||
|
||||
available_cpus = cpumask_weight(node_cpu_mask);
|
||||
|
||||
free_cpumask_var(node_cpu_mask);
|
||||
|
||||
return min3(available_cpus, available_contexts,
|
||||
(u32)HFI1_MAX_NETDEV_CTXTS);
|
||||
}
|
||||
|
||||
static int hfi1_netdev_rxq_init(struct net_device *dev)
|
||||
{
|
||||
int i;
|
||||
@@ -238,7 +282,7 @@ static void disable_queues(struct hfi1_netdev_priv *priv)
|
||||
{
|
||||
int i;
|
||||
|
||||
msix_vnic_synchronize_irq(priv->dd);
|
||||
msix_netdev_synchronize_irq(priv->dd);
|
||||
|
||||
for (i = 0; i < priv->num_rx_q; i++) {
|
||||
struct hfi1_netdev_rxq *rxq = &priv->rxq[i];
|
||||
|
Criar uma nova questão referindo esta
Bloquear um utilizador