mlx4: Paravirtualize Node Guids for slaves
This is necessary in order to support > 1 VF/PF in a VM for software that uses the node guid as a discriminator, such as librdmacm. Signed-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
Родитель
026149cbaa
Коммит
afa8fd1db9
|
@ -35,6 +35,7 @@
|
||||||
#include <rdma/ib_sa.h>
|
#include <rdma/ib_sa.h>
|
||||||
#include <rdma/ib_cache.h>
|
#include <rdma/ib_cache.h>
|
||||||
|
|
||||||
|
#include <linux/random.h>
|
||||||
#include <linux/mlx4/cmd.h>
|
#include <linux/mlx4/cmd.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <rdma/ib_pma.h>
|
#include <rdma/ib_pma.h>
|
||||||
|
@ -89,6 +90,12 @@ static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num);
|
||||||
static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,
|
static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num,
|
||||||
int block, u32 change_bitmap);
|
int block, u32 change_bitmap);
|
||||||
|
|
||||||
|
__be64 mlx4_ib_gen_node_guid(void)
|
||||||
|
{
|
||||||
|
#define NODE_GUID_HI ((u64) (((u64)IB_OPENIB_OUI) << 40))
|
||||||
|
return cpu_to_be64(NODE_GUID_HI | random32());
|
||||||
|
}
|
||||||
|
|
||||||
__be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx)
|
__be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx)
|
||||||
{
|
{
|
||||||
return cpu_to_be64(atomic_inc_return(&ctx->tid)) |
|
return cpu_to_be64(atomic_inc_return(&ctx->tid)) |
|
||||||
|
@ -1962,6 +1969,13 @@ int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < dev->dev->caps.sqp_demux; i++) {
|
||||||
|
if (i == mlx4_master_func_num(dev->dev))
|
||||||
|
mlx4_put_slave_node_guid(dev->dev, i, dev->ib_dev.node_guid);
|
||||||
|
else
|
||||||
|
mlx4_put_slave_node_guid(dev->dev, i, mlx4_ib_gen_node_guid());
|
||||||
|
}
|
||||||
|
|
||||||
err = mlx4_ib_init_alias_guid_service(dev);
|
err = mlx4_ib_init_alias_guid_service(dev);
|
||||||
if (err) {
|
if (err) {
|
||||||
mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n");
|
mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n");
|
||||||
|
|
|
@ -723,4 +723,7 @@ int mlx4_ib_device_register_sysfs(struct mlx4_ib_dev *device) ;
|
||||||
|
|
||||||
void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device);
|
void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device);
|
||||||
|
|
||||||
|
__be64 mlx4_ib_gen_node_guid(void);
|
||||||
|
|
||||||
|
|
||||||
#endif /* MLX4_IB_H */
|
#endif /* MLX4_IB_H */
|
||||||
|
|
|
@ -696,6 +696,7 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
|
||||||
struct ib_smp *outsmp = outbox->buf;
|
struct ib_smp *outsmp = outbox->buf;
|
||||||
__be16 *outtab = (__be16 *)(outsmp->data);
|
__be16 *outtab = (__be16 *)(outsmp->data);
|
||||||
__be32 slave_cap_mask;
|
__be32 slave_cap_mask;
|
||||||
|
__be64 slave_node_guid;
|
||||||
port = vhcr->in_modifier;
|
port = vhcr->in_modifier;
|
||||||
|
|
||||||
if (smp->base_version == 1 &&
|
if (smp->base_version == 1 &&
|
||||||
|
@ -755,6 +756,16 @@ static int mlx4_MAD_IFC_wrapper(struct mlx4_dev *dev, int slave,
|
||||||
}
|
}
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
if (smp->attr_id == IB_SMP_ATTR_NODE_INFO) {
|
||||||
|
err = mlx4_cmd_box(dev, inbox->dma, outbox->dma,
|
||||||
|
vhcr->in_modifier, vhcr->op_modifier,
|
||||||
|
vhcr->op, MLX4_CMD_TIME_CLASS_C, MLX4_CMD_NATIVE);
|
||||||
|
if (!err) {
|
||||||
|
slave_node_guid = mlx4_get_slave_node_guid(dev, slave);
|
||||||
|
memcpy(outsmp->data + 12, &slave_node_guid, 8);
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (slave != mlx4_master_func_num(dev) &&
|
if (slave != mlx4_master_func_num(dev) &&
|
||||||
|
|
|
@ -435,6 +435,28 @@ void mlx4_sync_pkey_table(struct mlx4_dev *dev, int slave, int port, int i, int
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mlx4_sync_pkey_table);
|
EXPORT_SYMBOL(mlx4_sync_pkey_table);
|
||||||
|
|
||||||
|
void mlx4_put_slave_node_guid(struct mlx4_dev *dev, int slave, __be64 guid)
|
||||||
|
{
|
||||||
|
struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
|
||||||
|
|
||||||
|
if (!mlx4_is_master(dev))
|
||||||
|
return;
|
||||||
|
|
||||||
|
priv->slave_node_guids[slave] = guid;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx4_put_slave_node_guid);
|
||||||
|
|
||||||
|
__be64 mlx4_get_slave_node_guid(struct mlx4_dev *dev, int slave)
|
||||||
|
{
|
||||||
|
struct mlx4_priv *priv = container_of(dev, struct mlx4_priv, dev);
|
||||||
|
|
||||||
|
if (!mlx4_is_master(dev))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return priv->slave_node_guids[slave];
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx4_get_slave_node_guid);
|
||||||
|
|
||||||
int mlx4_is_slave_active(struct mlx4_dev *dev, int slave)
|
int mlx4_is_slave_active(struct mlx4_dev *dev, int slave)
|
||||||
{
|
{
|
||||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||||
|
|
|
@ -810,6 +810,7 @@ struct mlx4_priv {
|
||||||
int reserved_mtts;
|
int reserved_mtts;
|
||||||
int fs_hash_mode;
|
int fs_hash_mode;
|
||||||
u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS];
|
u8 virt2phys_pkey[MLX4_MFUNC_MAX][MLX4_MAX_PORTS][MLX4_MAX_PORT_PKEYS];
|
||||||
|
__be64 slave_node_guids[MLX4_MFUNC_MAX];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -981,5 +981,7 @@ int mlx4_gen_port_state_change_eqe(struct mlx4_dev *dev, int slave, u8 port, u8
|
||||||
enum slave_port_state mlx4_get_slave_port_state(struct mlx4_dev *dev, int slave, u8 port);
|
enum slave_port_state mlx4_get_slave_port_state(struct mlx4_dev *dev, int slave, u8 port);
|
||||||
int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, u8 port, int event, enum slave_port_gen_event *gen_event);
|
int set_and_calc_slave_port_state(struct mlx4_dev *dev, int slave, u8 port, int event, enum slave_port_gen_event *gen_event);
|
||||||
|
|
||||||
|
void mlx4_put_slave_node_guid(struct mlx4_dev *dev, int slave, __be64 guid);
|
||||||
|
__be64 mlx4_get_slave_node_guid(struct mlx4_dev *dev, int slave);
|
||||||
|
|
||||||
#endif /* MLX4_DEVICE_H */
|
#endif /* MLX4_DEVICE_H */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче