diff options
author | Sagi Grimberg <sagig@mellanox.com> | 2014-02-23 07:19:10 -0500 |
---|---|---|
committer | Roland Dreier <roland@purestorage.com> | 2014-03-07 14:26:49 -0500 |
commit | 3bcdb17a5e88288ead90be3c107e754a6075a5b0 (patch) | |
tree | 622f8951b185bc090d4b0943786e5cb504f105e6 | |
parent | 2ac45934f8700e0c2a579f6ee85a56c6e9ea89d5 (diff) |
IB/mlx5: Keep mlx5 MRs in a radix tree under device
This will be useful when processing signature errors on a specific
key. The mlx5 driver will lookup the matching mlx5 memory region
structure and mark it as dirty (contains signature errors).
Signed-off-by: Sagi Grimberg <sagig@mellanox.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/main.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/mr.c | 24 | ||||
-rw-r--r-- | include/linux/mlx5/driver.h | 18 |
3 files changed, 43 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c index a064f06e0cb8..96a0617f7609 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c | |||
@@ -446,6 +446,7 @@ int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev) | |||
446 | mlx5_init_cq_table(dev); | 446 | mlx5_init_cq_table(dev); |
447 | mlx5_init_qp_table(dev); | 447 | mlx5_init_qp_table(dev); |
448 | mlx5_init_srq_table(dev); | 448 | mlx5_init_srq_table(dev); |
449 | mlx5_init_mr_table(dev); | ||
449 | 450 | ||
450 | return 0; | 451 | return 0; |
451 | 452 | ||
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mr.c b/drivers/net/ethernet/mellanox/mlx5/core/mr.c index bb746bbe73c6..4cc927649404 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/mr.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/mr.c | |||
@@ -36,11 +36,24 @@ | |||
36 | #include <linux/mlx5/cmd.h> | 36 | #include <linux/mlx5/cmd.h> |
37 | #include "mlx5_core.h" | 37 | #include "mlx5_core.h" |
38 | 38 | ||
39 | void mlx5_init_mr_table(struct mlx5_core_dev *dev) | ||
40 | { | ||
41 | struct mlx5_mr_table *table = &dev->priv.mr_table; | ||
42 | |||
43 | rwlock_init(&table->lock); | ||
44 | INIT_RADIX_TREE(&table->tree, GFP_ATOMIC); | ||
45 | } | ||
46 | |||
47 | void mlx5_cleanup_mr_table(struct mlx5_core_dev *dev) | ||
48 | { | ||
49 | } | ||
50 | |||
39 | int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, | 51 | int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, |
40 | struct mlx5_create_mkey_mbox_in *in, int inlen, | 52 | struct mlx5_create_mkey_mbox_in *in, int inlen, |
41 | mlx5_cmd_cbk_t callback, void *context, | 53 | mlx5_cmd_cbk_t callback, void *context, |
42 | struct mlx5_create_mkey_mbox_out *out) | 54 | struct mlx5_create_mkey_mbox_out *out) |
43 | { | 55 | { |
56 | struct mlx5_mr_table *table = &dev->priv.mr_table; | ||
44 | struct mlx5_create_mkey_mbox_out lout; | 57 | struct mlx5_create_mkey_mbox_out lout; |
45 | int err; | 58 | int err; |
46 | u8 key; | 59 | u8 key; |
@@ -73,14 +86,21 @@ int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, | |||
73 | mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n", | 86 | mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n", |
74 | be32_to_cpu(lout.mkey), key, mr->key); | 87 | be32_to_cpu(lout.mkey), key, mr->key); |
75 | 88 | ||
89 | /* connect to MR tree */ | ||
90 | write_lock_irq(&table->lock); | ||
91 | err = radix_tree_insert(&table->tree, mlx5_base_mkey(mr->key), mr); | ||
92 | write_unlock_irq(&table->lock); | ||
93 | |||
76 | return err; | 94 | return err; |
77 | } | 95 | } |
78 | EXPORT_SYMBOL(mlx5_core_create_mkey); | 96 | EXPORT_SYMBOL(mlx5_core_create_mkey); |
79 | 97 | ||
80 | int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr) | 98 | int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr) |
81 | { | 99 | { |
100 | struct mlx5_mr_table *table = &dev->priv.mr_table; | ||
82 | struct mlx5_destroy_mkey_mbox_in in; | 101 | struct mlx5_destroy_mkey_mbox_in in; |
83 | struct mlx5_destroy_mkey_mbox_out out; | 102 | struct mlx5_destroy_mkey_mbox_out out; |
103 | unsigned long flags; | ||
84 | int err; | 104 | int err; |
85 | 105 | ||
86 | memset(&in, 0, sizeof(in)); | 106 | memset(&in, 0, sizeof(in)); |
@@ -95,6 +115,10 @@ int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr) | |||
95 | if (out.hdr.status) | 115 | if (out.hdr.status) |
96 | return mlx5_cmd_status_to_err(&out.hdr); | 116 | return mlx5_cmd_status_to_err(&out.hdr); |
97 | 117 | ||
118 | write_lock_irqsave(&table->lock, flags); | ||
119 | radix_tree_delete(&table->tree, mlx5_base_mkey(mr->key)); | ||
120 | write_unlock_irqrestore(&table->lock, flags); | ||
121 | |||
98 | return err; | 122 | return err; |
99 | } | 123 | } |
100 | EXPORT_SYMBOL(mlx5_core_destroy_mkey); | 124 | EXPORT_SYMBOL(mlx5_core_destroy_mkey); |
diff --git a/include/linux/mlx5/driver.h b/include/linux/mlx5/driver.h index e1cb657ccade..e562e01e59c7 100644 --- a/include/linux/mlx5/driver.h +++ b/include/linux/mlx5/driver.h | |||
@@ -491,6 +491,13 @@ struct mlx5_srq_table { | |||
491 | struct radix_tree_root tree; | 491 | struct radix_tree_root tree; |
492 | }; | 492 | }; |
493 | 493 | ||
494 | struct mlx5_mr_table { | ||
495 | /* protect radix tree | ||
496 | */ | ||
497 | rwlock_t lock; | ||
498 | struct radix_tree_root tree; | ||
499 | }; | ||
500 | |||
494 | struct mlx5_priv { | 501 | struct mlx5_priv { |
495 | char name[MLX5_MAX_NAME_LEN]; | 502 | char name[MLX5_MAX_NAME_LEN]; |
496 | struct mlx5_eq_table eq_table; | 503 | struct mlx5_eq_table eq_table; |
@@ -520,6 +527,10 @@ struct mlx5_priv { | |||
520 | struct mlx5_cq_table cq_table; | 527 | struct mlx5_cq_table cq_table; |
521 | /* end: cq staff */ | 528 | /* end: cq staff */ |
522 | 529 | ||
530 | /* start: mr staff */ | ||
531 | struct mlx5_mr_table mr_table; | ||
532 | /* end: mr staff */ | ||
533 | |||
523 | /* start: alloc staff */ | 534 | /* start: alloc staff */ |
524 | struct mutex pgdir_mutex; | 535 | struct mutex pgdir_mutex; |
525 | struct list_head pgdir_list; | 536 | struct list_head pgdir_list; |
@@ -667,6 +678,11 @@ static inline void mlx5_vfree(const void *addr) | |||
667 | kfree(addr); | 678 | kfree(addr); |
668 | } | 679 | } |
669 | 680 | ||
681 | static inline u32 mlx5_base_mkey(const u32 key) | ||
682 | { | ||
683 | return key & 0xffffff00u; | ||
684 | } | ||
685 | |||
670 | int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev); | 686 | int mlx5_dev_init(struct mlx5_core_dev *dev, struct pci_dev *pdev); |
671 | void mlx5_dev_cleanup(struct mlx5_core_dev *dev); | 687 | void mlx5_dev_cleanup(struct mlx5_core_dev *dev); |
672 | int mlx5_cmd_init(struct mlx5_core_dev *dev); | 688 | int mlx5_cmd_init(struct mlx5_core_dev *dev); |
@@ -701,6 +717,8 @@ int mlx5_core_query_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq, | |||
701 | struct mlx5_query_srq_mbox_out *out); | 717 | struct mlx5_query_srq_mbox_out *out); |
702 | int mlx5_core_arm_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq, | 718 | int mlx5_core_arm_srq(struct mlx5_core_dev *dev, struct mlx5_core_srq *srq, |
703 | u16 lwm, int is_srq); | 719 | u16 lwm, int is_srq); |
720 | void mlx5_init_mr_table(struct mlx5_core_dev *dev); | ||
721 | void mlx5_cleanup_mr_table(struct mlx5_core_dev *dev); | ||
704 | int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, | 722 | int mlx5_core_create_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mr *mr, |
705 | struct mlx5_create_mkey_mbox_in *in, int inlen, | 723 | struct mlx5_create_mkey_mbox_in *in, int inlen, |
706 | mlx5_cmd_cbk_t callback, void *context, | 724 | mlx5_cmd_cbk_t callback, void *context, |