* Find a MR from cache. If not found, register a new MR. */
| 124 | * Find a MR from cache. If not found, register a new MR. |
| 125 | */ |
| 126 | struct mana_mr_cache * |
| 127 | mana_find_pmd_mr(struct mana_mr_btree *local_mr_btree, struct mana_priv *priv, |
| 128 | struct rte_mbuf *mbuf) |
| 129 | { |
| 130 | struct rte_mempool *pool = mbuf->pool; |
| 131 | int ret, second_try = 0; |
| 132 | struct mana_mr_cache *mr; |
| 133 | uint16_t idx; |
| 134 | |
| 135 | DP_LOG(DEBUG, "finding mr for mbuf addr %p len %d", |
| 136 | mbuf->buf_addr, mbuf->buf_len); |
| 137 | |
| 138 | try_again: |
| 139 | /* First try to find the MR in local queue tree */ |
| 140 | ret = mana_mr_btree_lookup(local_mr_btree, &idx, |
| 141 | (uintptr_t)mbuf->buf_addr, mbuf->buf_len, |
| 142 | &mr); |
| 143 | if (ret) |
| 144 | return NULL; |
| 145 | |
| 146 | if (mr) { |
| 147 | DP_LOG(DEBUG, "Local mr lkey %u addr 0x%" PRIxPTR " len %zu", |
| 148 | mr->lkey, mr->addr, mr->len); |
| 149 | return mr; |
| 150 | } |
| 151 | |
| 152 | /* If not found, try to find the MR in global tree */ |
| 153 | rte_spinlock_lock(&priv->mr_btree_lock); |
| 154 | ret = mana_mr_btree_lookup(&priv->mr_btree, &idx, |
| 155 | (uintptr_t)mbuf->buf_addr, |
| 156 | mbuf->buf_len, &mr); |
| 157 | rte_spinlock_unlock(&priv->mr_btree_lock); |
| 158 | |
| 159 | if (ret) |
| 160 | return NULL; |
| 161 | |
| 162 | /* If found in the global tree, add it to the local tree */ |
| 163 | if (mr) { |
| 164 | ret = mana_mr_btree_insert(local_mr_btree, mr); |
| 165 | if (ret) { |
| 166 | DP_LOG(ERR, "Failed to add MR to local tree."); |
| 167 | return NULL; |
| 168 | } |
| 169 | |
| 170 | DP_LOG(DEBUG, |
| 171 | "Added local MR key %u addr 0x%" PRIxPTR " len %zu", |
| 172 | mr->lkey, mr->addr, mr->len); |
| 173 | return mr; |
| 174 | } |
| 175 | |
| 176 | if (second_try) { |
| 177 | DP_LOG(ERR, "Internal error second try failed"); |
| 178 | return NULL; |
| 179 | } |
| 180 | |
| 181 | ret = mana_new_pmd_mr(local_mr_btree, priv, pool); |
| 182 | if (ret) { |
| 183 | DP_LOG(ERR, "Failed to allocate MR ret %d addr %p len %d", |
no test coverage detected