diff options
author | Jack Morgenstein <jackm@dev.mellanox.co.il> | 2012-08-03 04:40:56 -0400 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2012-09-30 23:33:43 -0400 |
commit | afa8fd1db9f295a0c4130bc6d87bf8b05bdd0523 (patch) | |
tree | 725c4a2c6a9044ff9ac79e4f6a863393756953f0 /drivers/infiniband | |
parent | 026149cbaada391d98f1cbec47c488cb548f753a (diff) |
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>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/mlx4/mad.c | 14 | ||||
-rw-r--r-- | drivers/infiniband/hw/mlx4/mlx4_ib.h | 3 |
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c index b91b4865d635..603a114b3dfe 100644 --- a/drivers/infiniband/hw/mlx4/mad.c +++ b/drivers/infiniband/hw/mlx4/mad.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <rdma/ib_sa.h> | 35 | #include <rdma/ib_sa.h> |
36 | #include <rdma/ib_cache.h> | 36 | #include <rdma/ib_cache.h> |
37 | 37 | ||
38 | #include <linux/random.h> | ||
38 | #include <linux/mlx4/cmd.h> | 39 | #include <linux/mlx4/cmd.h> |
39 | #include <linux/gfp.h> | 40 | #include <linux/gfp.h> |
40 | #include <rdma/ib_pma.h> | 41 | #include <rdma/ib_pma.h> |
@@ -89,6 +90,12 @@ static void handle_lid_change_event(struct mlx4_ib_dev *dev, u8 port_num); | |||
89 | static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num, | 90 | static void __propagate_pkey_ev(struct mlx4_ib_dev *dev, int port_num, |
90 | int block, u32 change_bitmap); | 91 | int block, u32 change_bitmap); |
91 | 92 | ||
93 | __be64 mlx4_ib_gen_node_guid(void) | ||
94 | { | ||
95 | #define NODE_GUID_HI ((u64) (((u64)IB_OPENIB_OUI) << 40)) | ||
96 | return cpu_to_be64(NODE_GUID_HI | random32()); | ||
97 | } | ||
98 | |||
92 | __be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx) | 99 | __be64 mlx4_ib_get_new_demux_tid(struct mlx4_ib_demux_ctx *ctx) |
93 | { | 100 | { |
94 | return cpu_to_be64(atomic_inc_return(&ctx->tid)) | | 101 | return cpu_to_be64(atomic_inc_return(&ctx->tid)) | |
@@ -1962,6 +1969,13 @@ int mlx4_ib_init_sriov(struct mlx4_ib_dev *dev) | |||
1962 | return 0; | 1969 | return 0; |
1963 | } | 1970 | } |
1964 | 1971 | ||
1972 | for (i = 0; i < dev->dev->caps.sqp_demux; i++) { | ||
1973 | if (i == mlx4_master_func_num(dev->dev)) | ||
1974 | mlx4_put_slave_node_guid(dev->dev, i, dev->ib_dev.node_guid); | ||
1975 | else | ||
1976 | mlx4_put_slave_node_guid(dev->dev, i, mlx4_ib_gen_node_guid()); | ||
1977 | } | ||
1978 | |||
1965 | err = mlx4_ib_init_alias_guid_service(dev); | 1979 | err = mlx4_ib_init_alias_guid_service(dev); |
1966 | if (err) { | 1980 | if (err) { |
1967 | mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n"); | 1981 | mlx4_ib_warn(&dev->ib_dev, "Failed init alias guid process.\n"); |
diff --git a/drivers/infiniband/hw/mlx4/mlx4_ib.h b/drivers/infiniband/hw/mlx4/mlx4_ib.h index e57a220a4d55..e04cbc9a54a5 100644 --- a/drivers/infiniband/hw/mlx4/mlx4_ib.h +++ b/drivers/infiniband/hw/mlx4/mlx4_ib.h | |||
@@ -723,4 +723,7 @@ int mlx4_ib_device_register_sysfs(struct mlx4_ib_dev *device) ; | |||
723 | 723 | ||
724 | void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device); | 724 | void mlx4_ib_device_unregister_sysfs(struct mlx4_ib_dev *device); |
725 | 725 | ||
726 | __be64 mlx4_ib_gen_node_guid(void); | ||
727 | |||
728 | |||
726 | #endif /* MLX4_IB_H */ | 729 | #endif /* MLX4_IB_H */ |