1 /* 2 * Copyright (c) 2015, Mellanox Technologies. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions are met: 13 * 14 * - Redistributions of source code must retain the above 15 * copyright notice, this list of conditions and the following 16 * disclaimer. 17 * 18 * - Redistributions in binary form must reproduce the above 19 * copyright notice, this list of conditions and the following 20 * disclaimer in the documentation and/or other materials 21 * provided with the distribution. 22 * 23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30 * SOFTWARE. 31 */ 32 33 #include <linux/ip.h> 34 #include <linux/ipv6.h> 35 #include <linux/tcp.h> 36 #include <linux/bitmap.h> 37 #include <linux/filter.h> 38 #include <net/ip6_checksum.h> 39 #include <net/page_pool/helpers.h> 40 #include <net/inet_ecn.h> 41 #include <net/gro.h> 42 #include <net/udp.h> 43 #include <net/tcp.h> 44 #include <net/xdp_sock_drv.h> 45 #include "en.h" 46 #include "en/txrx.h" 47 #include "en_tc.h" 48 #include "eswitch.h" 49 #include "en_rep.h" 50 #include "en/rep/tc.h" 51 #include "ipoib/ipoib.h" 52 #include "en_accel/ipsec.h" 53 #include "en_accel/macsec.h" 54 #include "en_accel/psp_rxtx.h" 55 #include "en_accel/ipsec_rxtx.h" 56 #include "en_accel/ktls_txrx.h" 57 #include "en/xdp.h" 58 #include "en/xsk/rx.h" 59 #include "en/health.h" 60 #include "en/params.h" 61 #include "devlink.h" 62 #include "en/devlink.h" 63 64 static struct sk_buff * 65 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 66 struct mlx5_cqe64 *cqe, u16 cqe_bcnt, u32 head_offset, 67 u32 page_idx); 68 static struct sk_buff * 69 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 70 struct mlx5_cqe64 *cqe, u16 cqe_bcnt, u32 head_offset, 71 u32 page_idx); 72 static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); 73 static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); 74 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe); 75 76 const struct mlx5e_rx_handlers mlx5e_rx_handlers_nic = { 77 .handle_rx_cqe = mlx5e_handle_rx_cqe, 78 .handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq, 79 .handle_rx_cqe_mpwqe_shampo = mlx5e_handle_rx_cqe_mpwrq_shampo, 80 }; 81 82 static inline void mlx5e_read_cqe_slot(struct mlx5_cqwq *wq, 83 u32 cqcc, void *data) 84 { 85 u32 ci = mlx5_cqwq_ctr2ix(wq, cqcc); 86 87 memcpy(data, mlx5_cqwq_get_wqe(wq, ci), sizeof(struct mlx5_cqe64)); 88 } 89 90 static void mlx5e_read_enhanced_title_slot(struct mlx5e_rq *rq, 91 struct mlx5_cqe64 *cqe) 92 { 93 struct mlx5e_cq_decomp *cqd = &rq->cqd; 94 struct mlx5_cqe64 *title = &cqd->title; 95 96 memcpy(title, cqe, sizeof(struct mlx5_cqe64)); 97 98 if (likely(test_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &rq->state))) 99 return; 100 101 if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) 102 cqd->wqe_counter = mpwrq_get_cqe_stride_index(title) + 103 mpwrq_get_cqe_consumed_strides(title); 104 else 105 cqd->wqe_counter = 106 mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, be16_to_cpu(title->wqe_counter) + 1); 107 } 108 109 static inline void mlx5e_read_title_slot(struct mlx5e_rq *rq, 110 struct mlx5_cqwq *wq, 111 u32 cqcc) 112 { 113 struct mlx5e_cq_decomp *cqd = &rq->cqd; 114 struct mlx5_cqe64 *title = &cqd->title; 115 116 mlx5e_read_cqe_slot(wq, cqcc, title); 117 cqd->left = be32_to_cpu(title->byte_cnt); 118 cqd->wqe_counter = be16_to_cpu(title->wqe_counter); 119 rq->stats->cqe_compress_blks++; 120 } 121 122 static inline void mlx5e_read_mini_arr_slot(struct mlx5_cqwq *wq, 123 struct mlx5e_cq_decomp *cqd, 124 u32 cqcc) 125 { 126 mlx5e_read_cqe_slot(wq, cqcc, cqd->mini_arr); 127 cqd->mini_arr_idx = 0; 128 } 129 130 static inline void mlx5e_cqes_update_owner(struct mlx5_cqwq *wq, int n) 131 { 132 u32 cqcc = wq->cc; 133 u8 op_own = mlx5_cqwq_get_ctr_wrap_cnt(wq, cqcc) & 1; 134 u32 ci = mlx5_cqwq_ctr2ix(wq, cqcc); 135 u32 wq_sz = mlx5_cqwq_get_size(wq); 136 u32 ci_top = min_t(u32, wq_sz, ci + n); 137 138 for (; ci < ci_top; ci++, n--) { 139 struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(wq, ci); 140 141 cqe->op_own = op_own; 142 } 143 144 if (unlikely(ci == wq_sz)) { 145 op_own = !op_own; 146 for (ci = 0; ci < n; ci++) { 147 struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(wq, ci); 148 149 cqe->op_own = op_own; 150 } 151 } 152 } 153 154 static inline void mlx5e_decompress_cqe(struct mlx5e_rq *rq, 155 struct mlx5_cqwq *wq, 156 u32 cqcc) 157 { 158 struct mlx5e_cq_decomp *cqd = &rq->cqd; 159 struct mlx5_mini_cqe8 *mini_cqe = &cqd->mini_arr[cqd->mini_arr_idx]; 160 struct mlx5_cqe64 *title = &cqd->title; 161 162 title->byte_cnt = mini_cqe->byte_cnt; 163 title->check_sum = mini_cqe->checksum; 164 title->op_own &= 0xf0; 165 title->op_own |= 0x01 & (cqcc >> wq->fbc.log_sz); 166 167 /* state bit set implies linked-list striding RQ wq type and 168 * HW stride index capability supported 169 */ 170 if (test_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &rq->state)) { 171 title->wqe_counter = mini_cqe->stridx; 172 return; 173 } 174 175 /* HW stride index capability not supported */ 176 title->wqe_counter = cpu_to_be16(cqd->wqe_counter); 177 if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) 178 cqd->wqe_counter += mpwrq_get_cqe_consumed_strides(title); 179 else 180 cqd->wqe_counter = 181 mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, cqd->wqe_counter + 1); 182 } 183 184 static inline void mlx5e_decompress_cqe_no_hash(struct mlx5e_rq *rq, 185 struct mlx5_cqwq *wq, 186 u32 cqcc) 187 { 188 struct mlx5e_cq_decomp *cqd = &rq->cqd; 189 190 mlx5e_decompress_cqe(rq, wq, cqcc); 191 cqd->title.rss_hash_type = 0; 192 cqd->title.rss_hash_result = 0; 193 } 194 195 static u32 mlx5e_decompress_enhanced_cqe(struct mlx5e_rq *rq, 196 struct mlx5_cqwq *wq, 197 struct mlx5_cqe64 *cqe, 198 int budget_rem) 199 { 200 struct mlx5e_cq_decomp *cqd = &rq->cqd; 201 u32 cqcc, left; 202 u32 i; 203 204 left = get_cqe_enhanced_num_mini_cqes(cqe); 205 /* Here we avoid breaking the cqe compression session in the middle 206 * in case budget is not sufficient to handle all of it. In this case 207 * we return work_done == budget_rem to give 'busy' napi indication. 208 */ 209 if (unlikely(left > budget_rem)) 210 return budget_rem; 211 212 cqcc = wq->cc; 213 cqd->mini_arr_idx = 0; 214 memcpy(cqd->mini_arr, cqe, sizeof(struct mlx5_cqe64)); 215 for (i = 0; i < left; i++, cqd->mini_arr_idx++, cqcc++) { 216 mlx5e_decompress_cqe_no_hash(rq, wq, cqcc); 217 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq, 218 mlx5e_handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq_shampo, 219 rq, &cqd->title); 220 } 221 wq->cc = cqcc; 222 rq->stats->cqe_compress_pkts += left; 223 224 return left; 225 } 226 227 static inline u32 mlx5e_decompress_cqes_cont(struct mlx5e_rq *rq, 228 struct mlx5_cqwq *wq, 229 int update_owner_only, 230 int budget_rem) 231 { 232 struct mlx5e_cq_decomp *cqd = &rq->cqd; 233 u32 cqcc = wq->cc + update_owner_only; 234 u32 cqe_count; 235 u32 i; 236 237 cqe_count = min_t(u32, cqd->left, budget_rem); 238 239 for (i = update_owner_only; i < cqe_count; 240 i++, cqd->mini_arr_idx++, cqcc++) { 241 if (cqd->mini_arr_idx == MLX5_MINI_CQE_ARRAY_SIZE) 242 mlx5e_read_mini_arr_slot(wq, cqd, cqcc); 243 244 mlx5e_decompress_cqe_no_hash(rq, wq, cqcc); 245 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq, 246 mlx5e_handle_rx_cqe_mpwrq_shampo, mlx5e_handle_rx_cqe, 247 rq, &cqd->title); 248 } 249 mlx5e_cqes_update_owner(wq, cqcc - wq->cc); 250 wq->cc = cqcc; 251 cqd->left -= cqe_count; 252 rq->stats->cqe_compress_pkts += cqe_count; 253 254 return cqe_count; 255 } 256 257 static inline u32 mlx5e_decompress_cqes_start(struct mlx5e_rq *rq, 258 struct mlx5_cqwq *wq, 259 int budget_rem) 260 { 261 struct mlx5e_cq_decomp *cqd = &rq->cqd; 262 u32 cc = wq->cc; 263 264 mlx5e_read_title_slot(rq, wq, cc); 265 mlx5e_read_mini_arr_slot(wq, cqd, cc + 1); 266 mlx5e_decompress_cqe(rq, wq, cc); 267 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq, 268 mlx5e_handle_rx_cqe_mpwrq_shampo, mlx5e_handle_rx_cqe, 269 rq, &cqd->title); 270 cqd->mini_arr_idx++; 271 272 return mlx5e_decompress_cqes_cont(rq, wq, 1, budget_rem); 273 } 274 275 static int mlx5e_page_alloc_fragmented(struct page_pool *pp, 276 struct mlx5e_frag_page *frag_page) 277 { 278 netmem_ref netmem = page_pool_dev_alloc_netmems(pp); 279 280 if (unlikely(!netmem)) 281 return -ENOMEM; 282 283 page_pool_fragment_netmem(netmem, MLX5E_PAGECNT_BIAS_MAX); 284 285 *frag_page = (struct mlx5e_frag_page) { 286 .netmem = netmem, 287 .frags = 0, 288 }; 289 290 return 0; 291 } 292 293 static void mlx5e_page_release_fragmented(struct page_pool *pp, 294 struct mlx5e_frag_page *frag_page) 295 { 296 u16 drain_count = MLX5E_PAGECNT_BIAS_MAX - frag_page->frags; 297 netmem_ref netmem = frag_page->netmem; 298 299 if (page_pool_unref_netmem(netmem, drain_count) == 0) 300 page_pool_put_unrefed_netmem(pp, netmem, -1, true); 301 } 302 303 static int mlx5e_mpwqe_linear_page_refill(struct mlx5e_rq *rq) 304 { 305 struct mlx5e_mpw_linear_info *li = rq->mpwqe.linear_info; 306 307 if (likely(li->frag_page.frags < li->max_frags)) 308 return 0; 309 310 if (likely(li->frag_page.netmem)) { 311 mlx5e_page_release_fragmented(rq->page_pool, &li->frag_page); 312 li->frag_page.netmem = 0; 313 } 314 315 return mlx5e_page_alloc_fragmented(rq->page_pool, &li->frag_page); 316 } 317 318 static void *mlx5e_mpwqe_get_linear_page_frag(struct mlx5e_rq *rq) 319 { 320 struct mlx5e_mpw_linear_info *li = rq->mpwqe.linear_info; 321 u32 frag_offset; 322 323 if (unlikely(mlx5e_mpwqe_linear_page_refill(rq))) 324 return NULL; 325 326 frag_offset = li->frag_page.frags << MLX5E_XDP_LOG_MAX_LINEAR_SZ; 327 WARN_ON(frag_offset >= BIT(rq->mpwqe.page_shift)); 328 329 return netmem_address(li->frag_page.netmem) + frag_offset; 330 } 331 332 static inline int mlx5e_get_rx_frag(struct mlx5e_rq *rq, 333 struct mlx5e_wqe_frag_info *frag) 334 { 335 int err = 0; 336 337 if (!frag->offset) 338 /* On first frag (offset == 0), replenish page. 339 * Other frags that point to the same page (with a different 340 * offset) should just use the new one without replenishing again 341 * by themselves. 342 */ 343 err = mlx5e_page_alloc_fragmented(rq->page_pool, 344 frag->frag_page); 345 346 return err; 347 } 348 349 static bool mlx5e_frag_can_release(struct mlx5e_wqe_frag_info *frag) 350 { 351 #define CAN_RELEASE_MASK \ 352 (BIT(MLX5E_WQE_FRAG_LAST_IN_PAGE) | BIT(MLX5E_WQE_FRAG_SKIP_RELEASE)) 353 354 #define CAN_RELEASE_VALUE BIT(MLX5E_WQE_FRAG_LAST_IN_PAGE) 355 356 return (frag->flags & CAN_RELEASE_MASK) == CAN_RELEASE_VALUE; 357 } 358 359 static inline void mlx5e_put_rx_frag(struct mlx5e_rq *rq, 360 struct mlx5e_wqe_frag_info *frag) 361 { 362 if (mlx5e_frag_can_release(frag)) 363 mlx5e_page_release_fragmented(rq->page_pool, frag->frag_page); 364 } 365 366 static inline struct mlx5e_wqe_frag_info *get_frag(struct mlx5e_rq *rq, u16 ix) 367 { 368 return &rq->wqe.frags[ix << rq->wqe.info.log_num_frags]; 369 } 370 371 static int mlx5e_alloc_rx_wqe(struct mlx5e_rq *rq, struct mlx5e_rx_wqe_cyc *wqe, 372 u16 ix) 373 { 374 struct mlx5e_wqe_frag_info *frag = get_frag(rq, ix); 375 int err; 376 int i; 377 378 for (i = 0; i < rq->wqe.info.num_frags; i++, frag++) { 379 dma_addr_t addr; 380 u16 headroom; 381 382 err = mlx5e_get_rx_frag(rq, frag); 383 if (unlikely(err)) 384 goto free_frags; 385 386 frag->flags &= ~BIT(MLX5E_WQE_FRAG_SKIP_RELEASE); 387 388 headroom = i == 0 ? rq->buff.headroom : 0; 389 addr = page_pool_get_dma_addr_netmem(frag->frag_page->netmem); 390 wqe->data[i].addr = cpu_to_be64(addr + frag->offset + headroom); 391 } 392 393 return 0; 394 395 free_frags: 396 while (--i >= 0) 397 mlx5e_put_rx_frag(rq, --frag); 398 399 return err; 400 } 401 402 static inline void mlx5e_free_rx_wqe(struct mlx5e_rq *rq, 403 struct mlx5e_wqe_frag_info *wi) 404 { 405 int i; 406 407 for (i = 0; i < rq->wqe.info.num_frags; i++, wi++) 408 mlx5e_put_rx_frag(rq, wi); 409 } 410 411 static void mlx5e_xsk_free_rx_wqe(struct mlx5e_wqe_frag_info *wi) 412 { 413 if (wi->flags & BIT(MLX5E_WQE_FRAG_SKIP_RELEASE)) 414 return; 415 416 xsk_buff_free(*wi->xskp); 417 wi->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE); 418 } 419 420 static void mlx5e_dealloc_rx_wqe(struct mlx5e_rq *rq, u16 ix) 421 { 422 struct mlx5e_wqe_frag_info *wi = get_frag(rq, ix); 423 424 if (rq->xsk_pool) { 425 mlx5e_xsk_free_rx_wqe(wi); 426 } else { 427 mlx5e_free_rx_wqe(rq, wi); 428 429 /* Avoid a second release of the wqe pages: dealloc is called 430 * for the same missing wqes on regular RQ flush and on regular 431 * RQ close. This happens when XSK RQs come into play. 432 */ 433 for (int i = 0; i < rq->wqe.info.num_frags; i++, wi++) 434 wi->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE); 435 } 436 } 437 438 static void mlx5e_xsk_free_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk) 439 { 440 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 441 int i; 442 443 for (i = 0; i < wqe_bulk; i++) { 444 int j = mlx5_wq_cyc_ctr2ix(wq, ix + i); 445 struct mlx5e_wqe_frag_info *wi; 446 447 wi = get_frag(rq, j); 448 /* The page is always put into the Reuse Ring, because there 449 * is no way to return the page to the userspace when the 450 * interface goes down. 451 */ 452 mlx5e_xsk_free_rx_wqe(wi); 453 } 454 } 455 456 static void mlx5e_free_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk) 457 { 458 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 459 int i; 460 461 for (i = 0; i < wqe_bulk; i++) { 462 int j = mlx5_wq_cyc_ctr2ix(wq, ix + i); 463 struct mlx5e_wqe_frag_info *wi; 464 465 wi = get_frag(rq, j); 466 mlx5e_free_rx_wqe(rq, wi); 467 } 468 } 469 470 static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk) 471 { 472 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 473 int i; 474 475 for (i = 0; i < wqe_bulk; i++) { 476 int j = mlx5_wq_cyc_ctr2ix(wq, ix + i); 477 struct mlx5e_rx_wqe_cyc *wqe; 478 479 wqe = mlx5_wq_cyc_get_wqe(wq, j); 480 481 if (unlikely(mlx5e_alloc_rx_wqe(rq, wqe, j))) 482 break; 483 } 484 485 return i; 486 } 487 488 static int mlx5e_refill_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk) 489 { 490 int remaining = wqe_bulk; 491 int total_alloc = 0; 492 int refill_alloc; 493 int refill; 494 495 /* The WQE bulk is split into smaller bulks that are sized 496 * according to the page pool cache refill size to avoid overflowing 497 * the page pool cache due to too many page releases at once. 498 */ 499 do { 500 refill = min_t(u16, rq->wqe.info.refill_unit, remaining); 501 502 mlx5e_free_rx_wqes(rq, ix + total_alloc, refill); 503 refill_alloc = mlx5e_alloc_rx_wqes(rq, ix + total_alloc, refill); 504 if (unlikely(refill_alloc != refill)) 505 goto err_free; 506 507 total_alloc += refill_alloc; 508 remaining -= refill; 509 } while (remaining); 510 511 return total_alloc; 512 513 err_free: 514 mlx5e_free_rx_wqes(rq, ix, total_alloc + refill_alloc); 515 516 for (int i = 0; i < total_alloc + refill; i++) { 517 int j = mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, ix + i); 518 struct mlx5e_wqe_frag_info *frag; 519 520 frag = get_frag(rq, j); 521 for (int k = 0; k < rq->wqe.info.num_frags; k++, frag++) 522 frag->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE); 523 } 524 525 return 0; 526 } 527 528 static void 529 mlx5e_add_skb_shared_info_frag(struct mlx5e_rq *rq, struct skb_shared_info *sinfo, 530 struct xdp_buff *xdp, struct mlx5e_frag_page *frag_page, 531 u32 frag_offset, u32 len) 532 { 533 netmem_ref netmem = frag_page->netmem; 534 skb_frag_t *frag; 535 536 dma_addr_t addr = page_pool_get_dma_addr_netmem(netmem); 537 538 dma_sync_single_for_cpu(rq->pdev, addr + frag_offset, len, rq->buff.map_dir); 539 if (!xdp_buff_has_frags(xdp)) { 540 /* Init on the first fragment to avoid cold cache access 541 * when possible. 542 */ 543 sinfo->nr_frags = 0; 544 sinfo->xdp_frags_size = 0; 545 xdp_buff_set_frags_flag(xdp); 546 } 547 548 frag = &sinfo->frags[sinfo->nr_frags++]; 549 skb_frag_fill_netmem_desc(frag, netmem, frag_offset, len); 550 551 if (netmem_is_pfmemalloc(netmem)) 552 xdp_buff_set_frag_pfmemalloc(xdp); 553 sinfo->xdp_frags_size += len; 554 } 555 556 static inline void 557 mlx5e_add_skb_frag(struct mlx5e_rq *rq, struct sk_buff *skb, 558 struct mlx5e_frag_page *frag_page, 559 u32 frag_offset, u32 len, 560 unsigned int truesize) 561 { 562 dma_addr_t addr = page_pool_get_dma_addr_netmem(frag_page->netmem); 563 u8 next_frag = skb_shinfo(skb)->nr_frags; 564 netmem_ref netmem = frag_page->netmem; 565 566 dma_sync_single_for_cpu(rq->pdev, addr + frag_offset, len, 567 rq->buff.map_dir); 568 569 if (skb_can_coalesce_netmem(skb, next_frag, netmem, frag_offset)) { 570 skb_coalesce_rx_frag(skb, next_frag - 1, len, truesize); 571 return; 572 } 573 574 frag_page->frags++; 575 skb_add_rx_frag_netmem(skb, next_frag, netmem, 576 frag_offset, len, truesize); 577 } 578 579 static inline void 580 mlx5e_copy_skb_header(struct mlx5e_rq *rq, struct sk_buff *skb, 581 netmem_ref netmem, dma_addr_t addr, 582 int offset_from, int dma_offset, u32 headlen) 583 { 584 const void *from = netmem_address(netmem) + offset_from; 585 /* Aligning len to sizeof(long) optimizes memcpy performance */ 586 unsigned int len = ALIGN(headlen, sizeof(long)); 587 588 dma_sync_single_for_cpu(rq->pdev, addr + dma_offset, len, 589 rq->buff.map_dir); 590 skb_copy_to_linear_data(skb, from, len); 591 } 592 593 static void 594 mlx5e_free_rx_mpwqe(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi) 595 { 596 bool no_xdp_xmit; 597 int i; 598 599 /* A common case for AF_XDP. */ 600 if (bitmap_full(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe)) 601 return; 602 603 no_xdp_xmit = bitmap_empty(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe); 604 605 if (rq->xsk_pool) { 606 struct xdp_buff **xsk_buffs = wi->alloc_units.xsk_buffs; 607 608 /* The page is always put into the Reuse Ring, because there 609 * is no way to return the page to userspace when the interface 610 * goes down. 611 */ 612 for (i = 0; i < rq->mpwqe.pages_per_wqe; i++) 613 if (no_xdp_xmit || !test_bit(i, wi->skip_release_bitmap)) 614 xsk_buff_free(xsk_buffs[i]); 615 } else { 616 for (i = 0; i < rq->mpwqe.pages_per_wqe; i++) { 617 if (no_xdp_xmit || !test_bit(i, wi->skip_release_bitmap)) { 618 struct mlx5e_frag_page *frag_page; 619 620 frag_page = &wi->alloc_units.frag_pages[i]; 621 mlx5e_page_release_fragmented(rq->page_pool, 622 frag_page); 623 } 624 } 625 } 626 } 627 628 static void mlx5e_post_rx_mpwqe(struct mlx5e_rq *rq, u8 n) 629 { 630 struct mlx5_wq_ll *wq = &rq->mpwqe.wq; 631 632 do { 633 u16 next_wqe_index = mlx5_wq_ll_get_wqe_next_ix(wq, wq->head); 634 635 mlx5_wq_ll_push(wq, next_wqe_index); 636 } while (--n); 637 638 /* ensure wqes are visible to device before updating doorbell record */ 639 dma_wmb(); 640 641 mlx5_wq_ll_update_db_record(wq); 642 } 643 644 static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix) 645 { 646 struct mlx5e_mpw_info *wi = mlx5e_get_mpw_info(rq, ix); 647 struct mlx5e_icosq *sq = rq->icosq; 648 struct mlx5e_frag_page *frag_page; 649 struct mlx5_wq_cyc *wq = &sq->wq; 650 struct mlx5e_umr_wqe *umr_wqe; 651 u32 offset; /* 17-bit value with MTT. */ 652 bool sync_locked; 653 u16 pi; 654 int err; 655 int i; 656 657 sync_locked = mlx5e_icosq_sync_lock(sq); 658 pi = mlx5e_icosq_get_next_pi(sq, rq->mpwqe.umr_wqebbs); 659 umr_wqe = mlx5_wq_cyc_get_wqe(wq, pi); 660 memcpy(umr_wqe, &rq->mpwqe.umr_wqe, sizeof(struct mlx5e_umr_wqe)); 661 662 frag_page = &wi->alloc_units.frag_pages[0]; 663 664 for (i = 0; i < rq->mpwqe.pages_per_wqe; i++, frag_page++) { 665 dma_addr_t addr; 666 667 err = mlx5e_page_alloc_fragmented(rq->page_pool, frag_page); 668 if (unlikely(err)) 669 goto err_unmap; 670 671 addr = page_pool_get_dma_addr_netmem(frag_page->netmem); 672 umr_wqe->inline_mtts[i] = (struct mlx5_mtt) { 673 .ptag = cpu_to_be64(addr | MLX5_EN_WR), 674 }; 675 } 676 677 /* Pad if needed, in case the value set to ucseg->xlt_octowords 678 * in mlx5e_build_umr_wqe() needed alignment. 679 */ 680 if (rq->mpwqe.pages_per_wqe & (MLX5_UMR_MTT_NUM_ENTRIES_ALIGNMENT - 1)) { 681 int pad = ALIGN(rq->mpwqe.pages_per_wqe, MLX5_UMR_MTT_NUM_ENTRIES_ALIGNMENT) - 682 rq->mpwqe.pages_per_wqe; 683 684 memset(&umr_wqe->inline_mtts[rq->mpwqe.pages_per_wqe], 0, 685 sizeof(*umr_wqe->inline_mtts) * pad); 686 } 687 688 bitmap_zero(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe); 689 wi->consumed_strides = 0; 690 691 umr_wqe->hdr.ctrl.opmod_idx_opcode = 692 cpu_to_be32((sq->pc << MLX5_WQE_CTRL_WQE_INDEX_SHIFT) | 693 MLX5_OPCODE_UMR); 694 695 offset = (ix * rq->mpwqe.mtts_per_wqe) * sizeof(struct mlx5_mtt) / MLX5_OCTWORD; 696 umr_wqe->hdr.uctrl.xlt_offset = cpu_to_be16(offset); 697 698 sq->db.wqe_info[pi] = (struct mlx5e_icosq_wqe_info) { 699 .wqe_type = MLX5E_ICOSQ_WQE_UMR_RX, 700 .num_wqebbs = rq->mpwqe.umr_wqebbs, 701 .umr.rq = rq, 702 }; 703 704 sq->pc += rq->mpwqe.umr_wqebbs; 705 mlx5e_icosq_sync_unlock(sq, sync_locked); 706 707 sq->doorbell_cseg = &umr_wqe->hdr.ctrl; 708 709 return 0; 710 711 err_unmap: 712 mlx5e_icosq_sync_unlock(sq, sync_locked); 713 while (--i >= 0) { 714 frag_page--; 715 mlx5e_page_release_fragmented(rq->page_pool, frag_page); 716 } 717 718 bitmap_fill(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe); 719 720 rq->stats->buff_alloc_err++; 721 722 return err; 723 } 724 725 static void mlx5e_dealloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix) 726 { 727 struct mlx5e_mpw_info *wi = mlx5e_get_mpw_info(rq, ix); 728 /* This function is called on rq/netdev close. */ 729 mlx5e_free_rx_mpwqe(rq, wi); 730 731 /* Avoid a second release of the wqe pages: dealloc is called also 732 * for missing wqes on an already flushed RQ. 733 */ 734 bitmap_fill(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe); 735 } 736 737 void mlx5e_mpwqe_dealloc_linear_page(struct mlx5e_rq *rq) 738 { 739 struct mlx5e_mpw_linear_info *li = rq->mpwqe.linear_info; 740 741 if (!li || !li->frag_page.netmem) 742 return; 743 744 mlx5e_page_release_fragmented(rq->page_pool, &li->frag_page); 745 746 /* Recovery flow can call this function and then alloc again, so leave 747 * things in a good state for re-allocation. 748 */ 749 li->frag_page.netmem = 0; 750 li->frag_page.frags = li->max_frags; 751 } 752 753 INDIRECT_CALLABLE_SCOPE bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq) 754 { 755 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 756 int wqe_bulk, count; 757 bool busy = false; 758 u16 head; 759 760 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state))) 761 return false; 762 763 if (mlx5_wq_cyc_missing(wq) < rq->wqe.info.wqe_bulk) 764 return false; 765 766 if (rq->page_pool) 767 page_pool_nid_changed(rq->page_pool, numa_mem_id()); 768 769 wqe_bulk = mlx5_wq_cyc_missing(wq); 770 head = mlx5_wq_cyc_get_head(wq); 771 772 /* Don't allow any newly allocated WQEs to share the same page with old 773 * WQEs that aren't completed yet. Stop earlier. 774 */ 775 wqe_bulk -= (head + wqe_bulk) & rq->wqe.info.wqe_index_mask; 776 777 if (!rq->xsk_pool) { 778 count = mlx5e_refill_rx_wqes(rq, head, wqe_bulk); 779 } else if (likely(!dma_dev_need_sync(rq->pdev))) { 780 mlx5e_xsk_free_rx_wqes(rq, head, wqe_bulk); 781 count = mlx5e_xsk_alloc_rx_wqes_batched(rq, head, wqe_bulk); 782 } else { 783 mlx5e_xsk_free_rx_wqes(rq, head, wqe_bulk); 784 /* If dma_need_sync is true, it's more efficient to call 785 * xsk_buff_alloc in a loop, rather than xsk_buff_alloc_batch, 786 * because the latter does the same check and returns only one 787 * frame. 788 */ 789 count = mlx5e_xsk_alloc_rx_wqes(rq, head, wqe_bulk); 790 } 791 792 mlx5_wq_cyc_push_n(wq, count); 793 if (unlikely(count != wqe_bulk)) { 794 rq->stats->buff_alloc_err++; 795 busy = true; 796 } 797 798 /* ensure wqes are visible to device before updating doorbell record */ 799 dma_wmb(); 800 801 mlx5_wq_cyc_update_db_record(wq); 802 803 return busy; 804 } 805 806 void mlx5e_free_icosq_descs(struct mlx5e_icosq *sq) 807 { 808 u16 sqcc; 809 810 sqcc = sq->cc; 811 812 while (sqcc != sq->pc) { 813 struct mlx5e_icosq_wqe_info *wi; 814 u16 ci; 815 816 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc); 817 wi = &sq->db.wqe_info[ci]; 818 sqcc += wi->num_wqebbs; 819 #ifdef CONFIG_MLX5_EN_TLS 820 switch (wi->wqe_type) { 821 case MLX5E_ICOSQ_WQE_SET_PSV_TLS: 822 mlx5e_ktls_handle_ctx_completion(wi); 823 break; 824 case MLX5E_ICOSQ_WQE_GET_PSV_TLS: 825 mlx5e_ktls_handle_get_psv_completion(wi, sq); 826 break; 827 } 828 #endif 829 } 830 sq->cc = sqcc; 831 } 832 833 int mlx5e_poll_ico_cq(struct mlx5e_cq *cq) 834 { 835 struct mlx5e_icosq *sq = container_of(cq, struct mlx5e_icosq, cq); 836 struct mlx5_cqe64 *cqe; 837 u16 sqcc; 838 int i; 839 840 if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state))) 841 return 0; 842 843 cqe = mlx5_cqwq_get_cqe(&cq->wq); 844 if (likely(!cqe)) 845 return 0; 846 847 /* sq->cc must be updated only after mlx5_cqwq_update_db_record(), 848 * otherwise a cq overrun may occur 849 */ 850 sqcc = sq->cc; 851 852 i = 0; 853 do { 854 u16 wqe_counter; 855 bool last_wqe; 856 857 mlx5_cqwq_pop(&cq->wq); 858 859 wqe_counter = be16_to_cpu(cqe->wqe_counter); 860 861 do { 862 struct mlx5e_icosq_wqe_info *wi; 863 u16 ci; 864 865 last_wqe = (sqcc == wqe_counter); 866 867 ci = mlx5_wq_cyc_ctr2ix(&sq->wq, sqcc); 868 wi = &sq->db.wqe_info[ci]; 869 sqcc += wi->num_wqebbs; 870 871 if (last_wqe && unlikely(get_cqe_opcode(cqe) != MLX5_CQE_REQ)) { 872 netdev_WARN_ONCE(cq->netdev, 873 "Bad OP in ICOSQ CQE: 0x%x\n", 874 get_cqe_opcode(cqe)); 875 #ifdef CONFIG_MLX5_EN_TLS 876 if (wi->wqe_type == MLX5E_ICOSQ_WQE_GET_PSV_TLS) 877 mlx5e_ktls_rx_resync_async_request_cancel(wi); 878 #endif 879 mlx5e_dump_error_cqe(&sq->cq, sq->sqn, 880 (struct mlx5_err_cqe *)cqe); 881 mlx5_wq_cyc_wqe_dump(&sq->wq, ci, wi->num_wqebbs); 882 if (!test_and_set_bit(MLX5E_SQ_STATE_RECOVERING, &sq->state)) 883 queue_work(cq->workqueue, &sq->recover_work); 884 break; 885 } 886 887 switch (wi->wqe_type) { 888 case MLX5E_ICOSQ_WQE_UMR_RX: 889 wi->umr.rq->mpwqe.umr_completed++; 890 break; 891 case MLX5E_ICOSQ_WQE_NOP: 892 break; 893 #ifdef CONFIG_MLX5_EN_TLS 894 case MLX5E_ICOSQ_WQE_UMR_TLS: 895 break; 896 case MLX5E_ICOSQ_WQE_SET_PSV_TLS: 897 mlx5e_ktls_handle_ctx_completion(wi); 898 break; 899 case MLX5E_ICOSQ_WQE_GET_PSV_TLS: 900 mlx5e_ktls_handle_get_psv_completion(wi, sq); 901 break; 902 #endif 903 default: 904 netdev_WARN_ONCE(cq->netdev, 905 "Bad WQE type in ICOSQ WQE info: 0x%x\n", 906 wi->wqe_type); 907 } 908 } while (!last_wqe); 909 } while ((++i < MLX5E_TX_CQ_POLL_BUDGET) && (cqe = mlx5_cqwq_get_cqe(&cq->wq))); 910 911 sq->cc = sqcc; 912 913 mlx5_cqwq_update_db_record(&cq->wq); 914 915 return i; 916 } 917 918 static void mlx5e_reclaim_mpwqe_pages(struct mlx5e_rq *rq, int head, 919 int reclaim) 920 { 921 struct mlx5_wq_ll *wq = &rq->mpwqe.wq; 922 923 for (int i = 0; i < reclaim; i++) { 924 head = mlx5_wq_ll_get_wqe_next_ix(wq, head); 925 926 mlx5e_dealloc_rx_mpwqe(rq, head); 927 } 928 } 929 930 INDIRECT_CALLABLE_SCOPE bool mlx5e_post_rx_mpwqes(struct mlx5e_rq *rq) 931 { 932 struct mlx5_wq_ll *wq = &rq->mpwqe.wq; 933 u8 umr_completed = rq->mpwqe.umr_completed; 934 struct mlx5e_icosq *sq = rq->icosq; 935 bool reclaimed = false; 936 int alloc_err = 0; 937 u8 missing, i; 938 u16 head; 939 940 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state))) 941 return false; 942 943 if (umr_completed) { 944 mlx5e_post_rx_mpwqe(rq, umr_completed); 945 rq->mpwqe.umr_in_progress -= umr_completed; 946 rq->mpwqe.umr_completed = 0; 947 } 948 949 missing = mlx5_wq_ll_missing(wq) - rq->mpwqe.umr_in_progress; 950 951 if (unlikely(rq->mpwqe.umr_in_progress > rq->mpwqe.umr_last_bulk)) 952 rq->stats->congst_umr++; 953 954 if (likely(missing < rq->mpwqe.min_wqe_bulk)) 955 return false; 956 957 if (rq->page_pool) 958 page_pool_nid_changed(rq->page_pool, numa_mem_id()); 959 if (rq->hd_page_pool) 960 page_pool_nid_changed(rq->hd_page_pool, numa_mem_id()); 961 962 head = rq->mpwqe.actual_wq_head; 963 i = missing; 964 do { 965 struct mlx5e_mpw_info *wi = mlx5e_get_mpw_info(rq, head); 966 967 /* Deferred free for better page pool cache usage. */ 968 mlx5e_free_rx_mpwqe(rq, wi); 969 970 retry: 971 alloc_err = rq->xsk_pool ? mlx5e_xsk_alloc_rx_mpwqe(rq, head) : 972 mlx5e_alloc_rx_mpwqe(rq, head); 973 if (unlikely(alloc_err)) { 974 int reclaim = i - 1; 975 976 if (reclaimed || !reclaim) 977 break; 978 979 mlx5e_reclaim_mpwqe_pages(rq, head, reclaim); 980 reclaimed = true; 981 982 goto retry; 983 } 984 head = mlx5_wq_ll_get_wqe_next_ix(wq, head); 985 } while (--i); 986 987 rq->mpwqe.umr_last_bulk = missing - i; 988 if (sq->doorbell_cseg) { 989 mlx5e_notify_hw(&sq->wq, sq->pc, sq->uar_map, sq->doorbell_cseg); 990 sq->doorbell_cseg = NULL; 991 } 992 993 rq->mpwqe.umr_in_progress += rq->mpwqe.umr_last_bulk; 994 rq->mpwqe.actual_wq_head = head; 995 996 /* If XSK Fill Ring doesn't have enough frames, report the error, so 997 * that one of the actions can be performed: 998 * 1. If need_wakeup is used, signal that the application has to kick 999 * the driver when it refills the Fill Ring. 1000 * 2. Otherwise, busy poll by rescheduling the NAPI poll. 1001 */ 1002 if (unlikely(alloc_err == -ENOMEM && rq->xsk_pool)) 1003 return true; 1004 1005 return false; 1006 } 1007 1008 static void mlx5e_lro_update_tcp_hdr(struct mlx5_cqe64 *cqe, struct tcphdr *tcp) 1009 { 1010 u8 l4_hdr_type = get_cqe_l4_hdr_type(cqe); 1011 u8 tcp_ack = (l4_hdr_type == CQE_L4_HDR_TYPE_TCP_ACK_NO_DATA) || 1012 (l4_hdr_type == CQE_L4_HDR_TYPE_TCP_ACK_AND_DATA); 1013 1014 tcp->check = 0; 1015 tcp->psh = get_cqe_lro_tcppsh(cqe); 1016 1017 if (tcp_ack) { 1018 tcp->ack = 1; 1019 tcp->ack_seq = cqe->lro.ack_seq_num; 1020 tcp->window = cqe->lro.tcp_win; 1021 } 1022 } 1023 1024 static unsigned int mlx5e_lro_update_hdr(struct sk_buff *skb, 1025 struct mlx5_cqe64 *cqe, 1026 u32 cqe_bcnt) 1027 { 1028 struct ethhdr *eth = (struct ethhdr *)(skb->data); 1029 struct tcphdr *tcp; 1030 int network_depth = 0; 1031 __wsum check; 1032 __be16 proto; 1033 u16 tot_len; 1034 void *ip_p; 1035 1036 proto = __vlan_get_protocol(skb, eth->h_proto, &network_depth); 1037 1038 tot_len = cqe_bcnt - network_depth; 1039 ip_p = skb->data + network_depth; 1040 1041 if (proto == htons(ETH_P_IP)) { 1042 struct iphdr *ipv4 = ip_p; 1043 1044 tcp = ip_p + sizeof(struct iphdr); 1045 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4; 1046 1047 ipv4->ttl = cqe->lro.min_ttl; 1048 ipv4->tot_len = cpu_to_be16(tot_len); 1049 ipv4->check = 0; 1050 ipv4->check = ip_fast_csum((unsigned char *)ipv4, 1051 ipv4->ihl); 1052 1053 mlx5e_lro_update_tcp_hdr(cqe, tcp); 1054 check = csum_partial(tcp, tcp->doff * 4, 1055 csum_unfold((__force __sum16)cqe->check_sum)); 1056 /* Almost done, don't forget the pseudo header */ 1057 tcp->check = tcp_v4_check(tot_len - sizeof(struct iphdr), 1058 ipv4->saddr, ipv4->daddr, check); 1059 } else { 1060 u16 payload_len = tot_len - sizeof(struct ipv6hdr); 1061 struct ipv6hdr *ipv6 = ip_p; 1062 1063 tcp = ip_p + sizeof(struct ipv6hdr); 1064 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6; 1065 1066 ipv6->hop_limit = cqe->lro.min_ttl; 1067 ipv6->payload_len = cpu_to_be16(payload_len); 1068 1069 mlx5e_lro_update_tcp_hdr(cqe, tcp); 1070 check = csum_partial(tcp, tcp->doff * 4, 1071 csum_unfold((__force __sum16)cqe->check_sum)); 1072 /* Almost done, don't forget the pseudo header */ 1073 tcp->check = tcp_v6_check(payload_len, &ipv6->saddr, 1074 &ipv6->daddr, check); 1075 } 1076 1077 return (unsigned int)((unsigned char *)tcp + tcp->doff * 4 - skb->data); 1078 } 1079 1080 static void mlx5e_shampo_update_ipv4_udp_hdr(struct mlx5e_rq *rq, struct iphdr *ipv4) 1081 { 1082 int udp_off = rq->hw_gro_data->fk.control.thoff; 1083 struct sk_buff *skb = rq->hw_gro_data->skb; 1084 struct udphdr *uh; 1085 1086 uh = (struct udphdr *)(skb->data + udp_off); 1087 udp_set_len_short(uh, skb->len - udp_off); 1088 1089 if (uh->check) 1090 uh->check = ~udp_v4_check(skb->len - udp_off, ipv4->saddr, 1091 ipv4->daddr, 0); 1092 1093 skb->csum_start = (unsigned char *)uh - skb->head; 1094 skb->csum_offset = offsetof(struct udphdr, check); 1095 1096 skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_L4; 1097 } 1098 1099 static void mlx5e_shampo_update_ipv6_udp_hdr(struct mlx5e_rq *rq, struct ipv6hdr *ipv6) 1100 { 1101 int udp_off = rq->hw_gro_data->fk.control.thoff; 1102 struct sk_buff *skb = rq->hw_gro_data->skb; 1103 struct udphdr *uh; 1104 1105 uh = (struct udphdr *)(skb->data + udp_off); 1106 udp_set_len_short(uh, skb->len - udp_off); 1107 1108 if (uh->check) 1109 uh->check = ~udp_v6_check(skb->len - udp_off, &ipv6->saddr, 1110 &ipv6->daddr, 0); 1111 1112 skb->csum_start = (unsigned char *)uh - skb->head; 1113 skb->csum_offset = offsetof(struct udphdr, check); 1114 1115 skb_shinfo(skb)->gso_type |= SKB_GSO_UDP_L4; 1116 } 1117 1118 static void mlx5e_shampo_get_hd_buf_info(struct mlx5e_rq *rq, 1119 struct mlx5_cqe64 *cqe, 1120 struct mlx5e_dma_info **di, 1121 u32 *head_offset) 1122 { 1123 u32 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe); 1124 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo; 1125 u32 di_index; 1126 1127 di_index = header_index >> MLX5E_SHAMPO_LOG_WQ_HEADER_PER_PAGE; 1128 *di = &shampo->hd_buf_pages[di_index]; 1129 *head_offset = (header_index & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1)) * 1130 BIT(MLX5E_SHAMPO_LOG_HEADER_ENTRY_SIZE); 1131 } 1132 1133 static void *mlx5e_shampo_get_hdr(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, 1134 int len) 1135 { 1136 struct mlx5e_dma_info *di; 1137 u32 head_offset; 1138 1139 mlx5e_shampo_get_hd_buf_info(rq, cqe, &di, &head_offset); 1140 1141 dma_sync_single_range_for_cpu(rq->pdev, di->addr, head_offset, 1142 len, rq->buff.map_dir); 1143 1144 return page_address(di->page) + head_offset; 1145 } 1146 1147 static void mlx5e_shampo_update_fin_psh_flags(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, 1148 struct tcphdr *skb_tcp_hd) 1149 { 1150 int nhoff = ETH_HLEN + rq->hw_gro_data->fk.control.thoff; 1151 int len = nhoff + sizeof(struct tcphdr); 1152 struct tcphdr *last_tcp_hd; 1153 void *last_hd_addr; 1154 1155 last_hd_addr = mlx5e_shampo_get_hdr(rq, cqe, len); 1156 last_tcp_hd = (struct tcphdr *)(last_hd_addr + nhoff); 1157 1158 tcp_flag_word(skb_tcp_hd) |= tcp_flag_word(last_tcp_hd) & (TCP_FLAG_FIN | TCP_FLAG_PSH); 1159 } 1160 1161 static void mlx5e_shampo_update_ipv4_tcp_hdr(struct mlx5e_rq *rq, struct iphdr *ipv4, 1162 struct mlx5_cqe64 *cqe, bool match) 1163 { 1164 int tcp_off = rq->hw_gro_data->fk.control.thoff; 1165 struct sk_buff *skb = rq->hw_gro_data->skb; 1166 struct tcphdr *tcp; 1167 1168 tcp = (struct tcphdr *)(skb->data + tcp_off); 1169 if (match) 1170 mlx5e_shampo_update_fin_psh_flags(rq, cqe, tcp); 1171 1172 tcp->check = ~tcp_v4_check(skb->len - tcp_off, ipv4->saddr, 1173 ipv4->daddr, 0); 1174 skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV4; 1175 if (ntohs(ipv4->id) == rq->hw_gro_data->second_ip_id) { 1176 bool encap = rq->hw_gro_data->fk.control.flags & FLOW_DIS_ENCAPSULATION; 1177 1178 skb_shinfo(skb)->gso_type |= encap ? SKB_GSO_TCP_FIXEDID_INNER : 1179 SKB_GSO_TCP_FIXEDID; 1180 } 1181 1182 skb->csum_start = (unsigned char *)tcp - skb->head; 1183 skb->csum_offset = offsetof(struct tcphdr, check); 1184 } 1185 1186 static void mlx5e_shampo_update_ipv6_tcp_hdr(struct mlx5e_rq *rq, struct ipv6hdr *ipv6, 1187 struct mlx5_cqe64 *cqe, bool match) 1188 { 1189 int tcp_off = rq->hw_gro_data->fk.control.thoff; 1190 struct sk_buff *skb = rq->hw_gro_data->skb; 1191 struct tcphdr *tcp; 1192 1193 tcp = (struct tcphdr *)(skb->data + tcp_off); 1194 if (match) 1195 mlx5e_shampo_update_fin_psh_flags(rq, cqe, tcp); 1196 1197 tcp->check = ~tcp_v6_check(skb->len - tcp_off, &ipv6->saddr, 1198 &ipv6->daddr, 0); 1199 skb_shinfo(skb)->gso_type |= SKB_GSO_TCPV6; 1200 skb->csum_start = (unsigned char *)tcp - skb->head; 1201 skb->csum_offset = offsetof(struct tcphdr, check); 1202 } 1203 1204 static void mlx5e_shampo_update_hdr(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, bool match) 1205 { 1206 bool is_ipv4 = (rq->hw_gro_data->fk.basic.n_proto == htons(ETH_P_IP)); 1207 struct sk_buff *skb = rq->hw_gro_data->skb; 1208 1209 skb_shinfo(skb)->gso_segs = NAPI_GRO_CB(skb)->count; 1210 skb->ip_summed = CHECKSUM_PARTIAL; 1211 1212 if (is_ipv4) { 1213 int nhoff = rq->hw_gro_data->fk.control.thoff - sizeof(struct iphdr); 1214 struct iphdr *ipv4 = (struct iphdr *)(skb->data + nhoff); 1215 __be16 newlen = htons(skb->len - nhoff); 1216 1217 csum_replace2(&ipv4->check, ipv4->tot_len, newlen); 1218 ipv4->tot_len = newlen; 1219 1220 if (ipv4->protocol == IPPROTO_TCP) 1221 mlx5e_shampo_update_ipv4_tcp_hdr(rq, ipv4, cqe, match); 1222 else 1223 mlx5e_shampo_update_ipv4_udp_hdr(rq, ipv4); 1224 } else { 1225 int nhoff = rq->hw_gro_data->fk.control.thoff - sizeof(struct ipv6hdr); 1226 struct ipv6hdr *ipv6 = (struct ipv6hdr *)(skb->data + nhoff); 1227 1228 ipv6->payload_len = htons(skb->len - nhoff - sizeof(*ipv6)); 1229 1230 if (ipv6->nexthdr == IPPROTO_TCP) 1231 mlx5e_shampo_update_ipv6_tcp_hdr(rq, ipv6, cqe, match); 1232 else 1233 mlx5e_shampo_update_ipv6_udp_hdr(rq, ipv6); 1234 } 1235 } 1236 1237 static inline void mlx5e_skb_set_hash(struct mlx5_cqe64 *cqe, 1238 struct sk_buff *skb) 1239 { 1240 u8 cht = cqe->rss_hash_type; 1241 int ht = (cht & CQE_RSS_HTYPE_L4) ? PKT_HASH_TYPE_L4 : 1242 (cht & CQE_RSS_HTYPE_IP) ? PKT_HASH_TYPE_L3 : 1243 PKT_HASH_TYPE_NONE; 1244 skb_set_hash(skb, be32_to_cpu(cqe->rss_hash_result), ht); 1245 } 1246 1247 static inline bool is_last_ethertype_ip(struct sk_buff *skb, int *network_depth, 1248 __be16 *proto) 1249 { 1250 *proto = ((struct ethhdr *)skb->data)->h_proto; 1251 *proto = __vlan_get_protocol(skb, *proto, network_depth); 1252 1253 if (*proto == htons(ETH_P_IP)) 1254 return pskb_may_pull(skb, *network_depth + sizeof(struct iphdr)); 1255 1256 if (*proto == htons(ETH_P_IPV6)) 1257 return pskb_may_pull(skb, *network_depth + sizeof(struct ipv6hdr)); 1258 1259 return false; 1260 } 1261 1262 static inline void mlx5e_enable_ecn(struct mlx5e_rq *rq, struct sk_buff *skb) 1263 { 1264 int network_depth = 0; 1265 __be16 proto; 1266 void *ip; 1267 int rc; 1268 1269 if (unlikely(!is_last_ethertype_ip(skb, &network_depth, &proto))) 1270 return; 1271 1272 ip = skb->data + network_depth; 1273 rc = ((proto == htons(ETH_P_IP)) ? IP_ECN_set_ce((struct iphdr *)ip) : 1274 IP6_ECN_set_ce(skb, (struct ipv6hdr *)ip)); 1275 1276 rq->stats->ecn_mark += !!rc; 1277 } 1278 1279 static u8 get_ip_proto(struct sk_buff *skb, int network_depth, __be16 proto) 1280 { 1281 void *ip_p = skb->data + network_depth; 1282 1283 return (proto == htons(ETH_P_IP)) ? ((struct iphdr *)ip_p)->protocol : 1284 ((struct ipv6hdr *)ip_p)->nexthdr; 1285 } 1286 1287 #define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN) 1288 1289 #define MAX_PADDING 8 1290 1291 static void 1292 tail_padding_csum_slow(struct sk_buff *skb, int offset, int len, 1293 struct mlx5e_rq_stats *stats) 1294 { 1295 stats->csum_complete_tail_slow++; 1296 skb->csum = csum_block_add(skb->csum, 1297 skb_checksum(skb, offset, len, 0), 1298 offset); 1299 } 1300 1301 static void 1302 tail_padding_csum(struct sk_buff *skb, int offset, 1303 struct mlx5e_rq_stats *stats) 1304 { 1305 u8 tail_padding[MAX_PADDING]; 1306 int len = skb->len - offset; 1307 void *tail; 1308 1309 if (unlikely(len > MAX_PADDING)) { 1310 tail_padding_csum_slow(skb, offset, len, stats); 1311 return; 1312 } 1313 1314 tail = skb_header_pointer(skb, offset, len, tail_padding); 1315 if (unlikely(!tail)) { 1316 tail_padding_csum_slow(skb, offset, len, stats); 1317 return; 1318 } 1319 1320 stats->csum_complete_tail++; 1321 skb->csum = csum_block_add(skb->csum, csum_partial(tail, len, 0), offset); 1322 } 1323 1324 static void 1325 mlx5e_skb_csum_fixup(struct sk_buff *skb, int network_depth, __be16 proto, 1326 struct mlx5e_rq_stats *stats) 1327 { 1328 struct ipv6hdr *ip6; 1329 struct iphdr *ip4; 1330 int pkt_len; 1331 1332 /* Fixup vlan headers, if any */ 1333 if (network_depth > ETH_HLEN) 1334 /* CQE csum is calculated from the IP header and does 1335 * not cover VLAN headers (if present). This will add 1336 * the checksum manually. 1337 */ 1338 skb->csum = csum_partial(skb->data + ETH_HLEN, 1339 network_depth - ETH_HLEN, 1340 skb->csum); 1341 1342 /* Fixup tail padding, if any */ 1343 switch (proto) { 1344 case htons(ETH_P_IP): 1345 ip4 = (struct iphdr *)(skb->data + network_depth); 1346 pkt_len = network_depth + ntohs(ip4->tot_len); 1347 break; 1348 case htons(ETH_P_IPV6): 1349 ip6 = (struct ipv6hdr *)(skb->data + network_depth); 1350 pkt_len = network_depth + sizeof(*ip6) + ntohs(ip6->payload_len); 1351 break; 1352 default: 1353 return; 1354 } 1355 1356 if (likely(pkt_len >= skb->len)) 1357 return; 1358 1359 tail_padding_csum(skb, pkt_len, stats); 1360 } 1361 1362 static inline void mlx5e_handle_csum(struct net_device *netdev, 1363 struct mlx5_cqe64 *cqe, 1364 struct mlx5e_rq *rq, 1365 struct sk_buff *skb, 1366 bool lro) 1367 { 1368 struct mlx5e_rq_stats *stats = rq->stats; 1369 int network_depth = 0; 1370 __be16 proto; 1371 1372 if (unlikely(!(netdev->features & NETIF_F_RXCSUM))) 1373 goto csum_none; 1374 1375 if (lro) { 1376 skb->ip_summed = CHECKSUM_UNNECESSARY; 1377 stats->csum_unnecessary++; 1378 return; 1379 } 1380 1381 /* True when explicitly set via priv flag, or XDP prog is loaded */ 1382 if (test_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &rq->state) || 1383 get_cqe_tls_offload(cqe)) 1384 goto csum_unnecessary; 1385 1386 /* CQE csum doesn't cover padding octets in short ethernet 1387 * frames. And the pad field is appended prior to calculating 1388 * and appending the FCS field. 1389 * 1390 * Detecting these padded frames requires to verify and parse 1391 * IP headers, so we simply force all those small frames to be 1392 * CHECKSUM_UNNECESSARY even if they are not padded. 1393 */ 1394 if (short_frame(skb->len)) 1395 goto csum_unnecessary; 1396 1397 if (likely(is_last_ethertype_ip(skb, &network_depth, &proto))) { 1398 if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP)) 1399 goto csum_unnecessary; 1400 1401 stats->csum_complete++; 1402 skb->ip_summed = CHECKSUM_COMPLETE; 1403 skb->csum = csum_unfold((__force __sum16)cqe->check_sum); 1404 1405 if (unlikely(mlx5e_psp_is_rx_flow(cqe))) { 1406 /* TBD: PSP csum complete corrections for now chose csum_unnecessary path */ 1407 goto csum_unnecessary; 1408 } 1409 1410 if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state)) 1411 return; /* CQE csum covers all received bytes */ 1412 1413 /* csum might need some fixups ...*/ 1414 mlx5e_skb_csum_fixup(skb, network_depth, proto, stats); 1415 return; 1416 } 1417 1418 csum_unnecessary: 1419 if (likely((cqe->hds_ip_ext & CQE_L3_OK) && 1420 (cqe->hds_ip_ext & CQE_L4_OK))) { 1421 skb->ip_summed = CHECKSUM_UNNECESSARY; 1422 if (cqe_is_tunneled(cqe)) { 1423 skb->csum_level = 1; 1424 skb->encapsulation = 1; 1425 stats->csum_unnecessary_inner++; 1426 return; 1427 } 1428 stats->csum_unnecessary++; 1429 return; 1430 } 1431 csum_none: 1432 skb->ip_summed = CHECKSUM_NONE; 1433 stats->csum_none++; 1434 } 1435 1436 #define MLX5E_CE_BIT_MASK 0x80 1437 1438 static inline bool mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe, 1439 u32 cqe_bcnt, 1440 struct mlx5e_rq *rq, 1441 struct sk_buff *skb) 1442 { 1443 u8 lro_num_seg = get_cqe_lro_num_seg(cqe); 1444 struct mlx5e_rq_stats *stats = rq->stats; 1445 struct net_device *netdev = rq->netdev; 1446 1447 skb->mac_len = ETH_HLEN; 1448 1449 if (unlikely(get_cqe_tls_offload(cqe))) 1450 mlx5e_ktls_handle_rx_skb(rq, skb, cqe, &cqe_bcnt); 1451 1452 if (unlikely(mlx5e_psp_is_rx_flow(cqe))) { 1453 if (mlx5e_psp_offload_handle_rx_skb(netdev, skb, cqe)) 1454 return true; 1455 } 1456 1457 if (unlikely(mlx5_ipsec_is_rx_flow(cqe))) 1458 mlx5e_ipsec_offload_handle_rx_skb(netdev, skb, 1459 be32_to_cpu(cqe->ft_metadata)); 1460 1461 if (unlikely(mlx5e_macsec_is_rx_flow(cqe))) 1462 mlx5e_macsec_offload_handle_rx_skb(netdev, skb, cqe); 1463 1464 if (lro_num_seg > 1) { 1465 unsigned int hdrlen = mlx5e_lro_update_hdr(skb, cqe, cqe_bcnt); 1466 1467 skb_shinfo(skb)->gso_size = DIV_ROUND_UP(cqe_bcnt - hdrlen, lro_num_seg); 1468 skb_shinfo(skb)->gso_segs = lro_num_seg; 1469 /* Subtract one since we already counted this as one 1470 * "regular" packet in mlx5e_complete_rx_cqe() 1471 */ 1472 stats->packets += lro_num_seg - 1; 1473 stats->lro_packets++; 1474 stats->lro_bytes += cqe_bcnt; 1475 } 1476 1477 if (unlikely(mlx5e_rx_hw_stamp(rq->hwtstamp_config))) 1478 skb_hwtstamps(skb)->hwtstamp = mlx5e_cqe_ts_to_ns(rq->ptp_cyc2time, 1479 rq->clock, get_cqe_ts(cqe)); 1480 skb_record_rx_queue(skb, rq->ix); 1481 1482 if (likely(netdev->features & NETIF_F_RXHASH)) 1483 mlx5e_skb_set_hash(cqe, skb); 1484 1485 if (cqe_has_vlan(cqe)) { 1486 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), 1487 be16_to_cpu(cqe->vlan_info)); 1488 stats->removed_vlan_packets++; 1489 } 1490 1491 skb->mark = be32_to_cpu(cqe->sop_drop_qpn) & MLX5E_TC_FLOW_ID_MASK; 1492 1493 mlx5e_handle_csum(netdev, cqe, rq, skb, !!lro_num_seg); 1494 /* checking CE bit in cqe - MSB in ml_path field */ 1495 if (unlikely(cqe->ml_path & MLX5E_CE_BIT_MASK)) 1496 mlx5e_enable_ecn(rq, skb); 1497 1498 skb->protocol = eth_type_trans(skb, netdev); 1499 1500 if (unlikely(mlx5e_skb_is_multicast(skb))) 1501 stats->mcast_packets++; 1502 1503 return false; 1504 } 1505 1506 static bool mlx5e_shampo_complete_rx_cqe(struct mlx5e_rq *rq, 1507 struct mlx5_cqe64 *cqe, 1508 u32 cqe_bcnt, 1509 struct sk_buff *skb) 1510 { 1511 struct mlx5e_rq_stats *stats = rq->stats; 1512 1513 stats->packets++; 1514 stats->bytes += cqe_bcnt; 1515 if (NAPI_GRO_CB(skb)->count != 1) 1516 return false; 1517 1518 if (mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb)) 1519 return true; 1520 1521 skb_reset_network_header(skb); 1522 if (!skb_flow_dissect_flow_keys(skb, &rq->hw_gro_data->fk, 0)) { 1523 napi_gro_receive(rq->cq.napi, skb); 1524 rq->hw_gro_data->skb = NULL; 1525 } 1526 return false; 1527 } 1528 1529 static inline bool mlx5e_complete_rx_cqe(struct mlx5e_rq *rq, 1530 struct mlx5_cqe64 *cqe, 1531 u32 cqe_bcnt, 1532 struct sk_buff *skb) 1533 { 1534 struct mlx5e_rq_stats *stats = rq->stats; 1535 1536 stats->packets++; 1537 stats->bytes += cqe_bcnt; 1538 return mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb); 1539 } 1540 1541 static inline 1542 struct sk_buff *mlx5e_build_linear_skb(struct mlx5e_rq *rq, void *va, 1543 u32 frag_size, u16 headroom, 1544 u32 cqe_bcnt, u32 metasize) 1545 { 1546 struct sk_buff *skb = napi_build_skb(va, frag_size); 1547 1548 if (unlikely(!skb)) { 1549 rq->stats->buff_alloc_err++; 1550 return NULL; 1551 } 1552 1553 skb_reserve(skb, headroom); 1554 skb_put(skb, cqe_bcnt); 1555 1556 if (metasize) 1557 skb_metadata_set(skb, metasize); 1558 1559 return skb; 1560 } 1561 1562 static void mlx5e_fill_mxbuf(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, 1563 void *va, u16 headroom, u32 frame_sz, u32 len, 1564 struct mlx5e_xdp_buff *mxbuf) 1565 { 1566 xdp_init_buff(&mxbuf->xdp, frame_sz, &rq->xdp_rxq); 1567 xdp_prepare_buff(&mxbuf->xdp, va, headroom, len, true); 1568 mxbuf->cqe = cqe; 1569 mxbuf->rq = rq; 1570 } 1571 1572 static struct sk_buff * 1573 mlx5e_skb_from_cqe_linear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi, 1574 struct mlx5_cqe64 *cqe, u32 cqe_bcnt) 1575 { 1576 struct mlx5e_frag_page *frag_page = wi->frag_page; 1577 u16 rx_headroom = rq->buff.headroom; 1578 struct bpf_prog *prog; 1579 struct sk_buff *skb; 1580 u32 metasize = 0; 1581 void *va, *data; 1582 dma_addr_t addr; 1583 u32 frag_size; 1584 1585 va = netmem_address(frag_page->netmem) + wi->offset; 1586 data = va + rx_headroom; 1587 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt); 1588 1589 addr = page_pool_get_dma_addr_netmem(frag_page->netmem); 1590 dma_sync_single_range_for_cpu(rq->pdev, addr, wi->offset, 1591 frag_size, rq->buff.map_dir); 1592 net_prefetch(data); 1593 1594 prog = rcu_dereference(rq->xdp_prog); 1595 if (prog) { 1596 struct mlx5e_xdp_buff *mxbuf = &rq->mxbuf; 1597 1598 net_prefetchw(va); /* xdp_frame data area */ 1599 mlx5e_fill_mxbuf(rq, cqe, va, rx_headroom, rq->buff.frame0_sz, 1600 cqe_bcnt, mxbuf); 1601 if (mlx5e_xdp_handle(rq, prog, mxbuf)) 1602 return NULL; /* page/packet was consumed by XDP */ 1603 1604 rx_headroom = mxbuf->xdp.data - mxbuf->xdp.data_hard_start; 1605 metasize = mxbuf->xdp.data - mxbuf->xdp.data_meta; 1606 cqe_bcnt = mxbuf->xdp.data_end - mxbuf->xdp.data; 1607 } 1608 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt); 1609 skb = mlx5e_build_linear_skb(rq, va, frag_size, rx_headroom, cqe_bcnt, metasize); 1610 if (unlikely(!skb)) 1611 return NULL; 1612 1613 /* queue up for recycling/reuse */ 1614 skb_mark_for_recycle(skb); 1615 frag_page->frags++; 1616 1617 return skb; 1618 } 1619 1620 static struct sk_buff * 1621 mlx5e_skb_from_cqe_nonlinear(struct mlx5e_rq *rq, struct mlx5e_wqe_frag_info *wi, 1622 struct mlx5_cqe64 *cqe, u32 cqe_bcnt) 1623 { 1624 struct mlx5e_rq_frag_info *frag_info = &rq->wqe.info.arr[0]; 1625 struct mlx5e_xdp_buff *mxbuf = &rq->mxbuf; 1626 struct mlx5e_wqe_frag_info *head_wi = wi; 1627 u16 rx_headroom = rq->buff.headroom; 1628 struct mlx5e_frag_page *frag_page; 1629 struct skb_shared_info *sinfo; 1630 u32 frag_consumed_bytes; 1631 struct bpf_prog *prog; 1632 u8 nr_frags_free = 0; 1633 struct sk_buff *skb; 1634 dma_addr_t addr; 1635 u32 truesize; 1636 void *va; 1637 1638 frag_page = wi->frag_page; 1639 1640 va = netmem_address(frag_page->netmem) + wi->offset; 1641 frag_consumed_bytes = min_t(u32, frag_info->frag_size, cqe_bcnt); 1642 1643 addr = page_pool_get_dma_addr_netmem(frag_page->netmem); 1644 dma_sync_single_range_for_cpu(rq->pdev, addr, wi->offset, 1645 rq->buff.frame0_sz, rq->buff.map_dir); 1646 net_prefetchw(va); /* xdp_frame data area */ 1647 net_prefetch(va + rx_headroom); 1648 1649 mlx5e_fill_mxbuf(rq, cqe, va, rx_headroom, rq->buff.frame0_sz, 1650 frag_consumed_bytes, mxbuf); 1651 sinfo = xdp_get_shared_info_from_buff(&mxbuf->xdp); 1652 truesize = 0; 1653 1654 cqe_bcnt -= frag_consumed_bytes; 1655 frag_info++; 1656 wi++; 1657 1658 while (cqe_bcnt) { 1659 frag_page = wi->frag_page; 1660 1661 frag_consumed_bytes = min_t(u32, frag_info->frag_size, cqe_bcnt); 1662 1663 mlx5e_add_skb_shared_info_frag(rq, sinfo, &mxbuf->xdp, 1664 frag_page, wi->offset, 1665 frag_consumed_bytes); 1666 truesize += frag_info->frag_stride; 1667 1668 cqe_bcnt -= frag_consumed_bytes; 1669 frag_info++; 1670 wi++; 1671 } 1672 1673 prog = rcu_dereference(rq->xdp_prog); 1674 if (prog) { 1675 u8 old_nr_frags = sinfo->nr_frags; 1676 1677 if (mlx5e_xdp_handle(rq, prog, mxbuf)) { 1678 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, 1679 rq->flags)) { 1680 struct mlx5e_wqe_frag_info *pwi; 1681 1682 for (pwi = head_wi; pwi < wi; pwi++) 1683 pwi->frag_page->frags++; 1684 } 1685 return NULL; /* page/packet was consumed by XDP */ 1686 } 1687 1688 nr_frags_free = old_nr_frags - sinfo->nr_frags; 1689 if (unlikely(nr_frags_free)) 1690 truesize -= nr_frags_free * frag_info->frag_stride; 1691 } 1692 1693 skb = mlx5e_build_linear_skb( 1694 rq, mxbuf->xdp.data_hard_start, rq->buff.frame0_sz, 1695 mxbuf->xdp.data - mxbuf->xdp.data_hard_start, 1696 mxbuf->xdp.data_end - mxbuf->xdp.data, 1697 mxbuf->xdp.data - mxbuf->xdp.data_meta); 1698 if (unlikely(!skb)) 1699 return NULL; 1700 1701 skb_mark_for_recycle(skb); 1702 head_wi->frag_page->frags++; 1703 1704 if (xdp_buff_has_frags(&mxbuf->xdp)) { 1705 /* sinfo->nr_frags is reset by build_skb, calculate again. */ 1706 xdp_update_skb_frags_info(skb, wi - head_wi - nr_frags_free - 1, 1707 sinfo->xdp_frags_size, truesize, 1708 xdp_buff_get_skb_flags(&mxbuf->xdp)); 1709 1710 for (struct mlx5e_wqe_frag_info *pwi = head_wi + 1; pwi < wi; pwi++) 1711 pwi->frag_page->frags++; 1712 } 1713 1714 return skb; 1715 } 1716 1717 static void trigger_report(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1718 { 1719 struct mlx5_err_cqe *err_cqe = (struct mlx5_err_cqe *)cqe; 1720 struct mlx5e_priv *priv = rq->priv; 1721 1722 if (cqe_syndrome_needs_recover(err_cqe->syndrome) && 1723 !test_and_set_bit(MLX5E_RQ_STATE_RECOVERING, &rq->state)) { 1724 mlx5e_dump_error_cqe(&rq->cq, rq->rqn, err_cqe); 1725 queue_work(priv->wq, &rq->recover_work); 1726 } 1727 } 1728 1729 static void mlx5e_handle_rx_err_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1730 { 1731 trigger_report(rq, cqe); 1732 rq->stats->wqe_err++; 1733 } 1734 1735 static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1736 { 1737 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 1738 struct mlx5e_wqe_frag_info *wi; 1739 struct sk_buff *skb; 1740 u32 cqe_bcnt; 1741 u16 ci; 1742 1743 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter)); 1744 wi = get_frag(rq, ci); 1745 cqe_bcnt = be32_to_cpu(cqe->byte_cnt); 1746 1747 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 1748 mlx5e_handle_rx_err_cqe(rq, cqe); 1749 goto wq_cyc_pop; 1750 } 1751 1752 skb = INDIRECT_CALL_3(rq->wqe.skb_from_cqe, 1753 mlx5e_skb_from_cqe_linear, 1754 mlx5e_skb_from_cqe_nonlinear, 1755 mlx5e_xsk_skb_from_cqe_linear, 1756 rq, wi, cqe, cqe_bcnt); 1757 if (!skb) { 1758 /* probably for XDP */ 1759 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) 1760 wi->frag_page->frags++; 1761 goto wq_cyc_pop; 1762 } 1763 1764 if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb)) 1765 goto wq_cyc_pop; 1766 1767 if (mlx5e_cqe_regb_chain(cqe)) 1768 if (!mlx5e_tc_update_skb_nic(cqe, skb)) { 1769 dev_kfree_skb_any(skb); 1770 goto wq_cyc_pop; 1771 } 1772 1773 napi_gro_receive(rq->cq.napi, skb); 1774 1775 wq_cyc_pop: 1776 mlx5_wq_cyc_pop(wq); 1777 } 1778 1779 #ifdef CONFIG_MLX5_ESWITCH 1780 static void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1781 { 1782 struct net_device *netdev = rq->netdev; 1783 struct mlx5e_priv *priv = netdev_priv(netdev); 1784 struct mlx5e_rep_priv *rpriv = priv->ppriv; 1785 struct mlx5_eswitch_rep *rep = rpriv->rep; 1786 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 1787 struct mlx5e_wqe_frag_info *wi; 1788 struct sk_buff *skb; 1789 u32 cqe_bcnt; 1790 u16 ci; 1791 1792 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter)); 1793 wi = get_frag(rq, ci); 1794 cqe_bcnt = be32_to_cpu(cqe->byte_cnt); 1795 1796 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 1797 mlx5e_handle_rx_err_cqe(rq, cqe); 1798 goto wq_cyc_pop; 1799 } 1800 1801 skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe, 1802 mlx5e_skb_from_cqe_linear, 1803 mlx5e_skb_from_cqe_nonlinear, 1804 rq, wi, cqe, cqe_bcnt); 1805 if (!skb) { 1806 /* probably for XDP */ 1807 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) 1808 wi->frag_page->frags++; 1809 goto wq_cyc_pop; 1810 } 1811 1812 if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb)) 1813 goto wq_cyc_pop; 1814 1815 if (rep->vlan && skb_vlan_tag_present(skb)) 1816 skb_vlan_pop(skb); 1817 1818 mlx5e_rep_tc_receive(cqe, rq, skb); 1819 1820 wq_cyc_pop: 1821 mlx5_wq_cyc_pop(wq); 1822 } 1823 1824 static void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 1825 { 1826 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe); 1827 u16 wqe_id = be16_to_cpu(cqe->wqe_id); 1828 struct mlx5e_mpw_info *wi = mlx5e_get_mpw_info(rq, wqe_id); 1829 u16 stride_ix = mpwrq_get_cqe_stride_index(cqe); 1830 u32 wqe_offset = stride_ix << rq->mpwqe.log_stride_sz; 1831 u32 head_offset = wqe_offset & ((1 << rq->mpwqe.page_shift) - 1); 1832 u32 page_idx = wqe_offset >> rq->mpwqe.page_shift; 1833 struct mlx5e_rx_wqe_ll *wqe; 1834 struct mlx5_wq_ll *wq; 1835 struct sk_buff *skb; 1836 u16 cqe_bcnt; 1837 1838 wi->consumed_strides += cstrides; 1839 1840 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 1841 mlx5e_handle_rx_err_cqe(rq, cqe); 1842 goto mpwrq_cqe_out; 1843 } 1844 1845 if (unlikely(mpwrq_is_filler_cqe(cqe))) { 1846 struct mlx5e_rq_stats *stats = rq->stats; 1847 1848 stats->mpwqe_filler_cqes++; 1849 stats->mpwqe_filler_strides += cstrides; 1850 goto mpwrq_cqe_out; 1851 } 1852 1853 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe); 1854 1855 skb = INDIRECT_CALL_2(rq->mpwqe.skb_from_cqe_mpwrq, 1856 mlx5e_skb_from_cqe_mpwrq_linear, 1857 mlx5e_skb_from_cqe_mpwrq_nonlinear, 1858 rq, wi, cqe, cqe_bcnt, head_offset, page_idx); 1859 if (!skb) 1860 goto mpwrq_cqe_out; 1861 1862 if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb)) 1863 goto mpwrq_cqe_out; 1864 1865 mlx5e_rep_tc_receive(cqe, rq, skb); 1866 1867 mpwrq_cqe_out: 1868 if (likely(wi->consumed_strides < rq->mpwqe.num_strides)) 1869 return; 1870 1871 wq = &rq->mpwqe.wq; 1872 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id); 1873 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index); 1874 } 1875 1876 const struct mlx5e_rx_handlers mlx5e_rx_handlers_rep = { 1877 .handle_rx_cqe = mlx5e_handle_rx_cqe_rep, 1878 .handle_rx_cqe_mpwqe = mlx5e_handle_rx_cqe_mpwrq_rep, 1879 }; 1880 #endif 1881 1882 static void 1883 mlx5e_shampo_fill_skb_data(struct sk_buff *skb, struct mlx5e_rq *rq, 1884 struct mlx5e_frag_page *frag_page, 1885 u32 data_bcnt, u32 data_offset) 1886 { 1887 u32 page_size = BIT(rq->mpwqe.page_shift); 1888 1889 net_prefetchw(skb->data); 1890 1891 do { 1892 /* Non-linear mode, hence non-XSK, which always uses PAGE_SIZE. */ 1893 u32 pg_consumed_bytes = min_t(u32, page_size - data_offset, 1894 data_bcnt); 1895 unsigned int truesize = pg_consumed_bytes; 1896 1897 mlx5e_add_skb_frag(rq, skb, frag_page, data_offset, 1898 pg_consumed_bytes, truesize); 1899 1900 data_bcnt -= pg_consumed_bytes; 1901 data_offset = 0; 1902 frag_page++; 1903 } while (data_bcnt); 1904 } 1905 1906 static struct sk_buff * 1907 mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 1908 struct mlx5_cqe64 *cqe, u16 cqe_bcnt, u32 head_offset, 1909 u32 page_idx) 1910 { 1911 struct mlx5e_frag_page *frag_page = &wi->alloc_units.frag_pages[page_idx]; 1912 struct mlx5e_frag_page *head_page = frag_page; 1913 struct mlx5e_frag_page *linear_page = NULL; 1914 struct mlx5e_xdp_buff *mxbuf = &rq->mxbuf; 1915 u32 page_size = BIT(rq->mpwqe.page_shift); 1916 u32 frag_offset = head_offset; 1917 u32 byte_cnt = cqe_bcnt; 1918 struct skb_shared_info *sinfo; 1919 unsigned int truesize = 0; 1920 u32 pg_consumed_bytes; 1921 struct bpf_prog *prog; 1922 void *va, *head_addr; 1923 struct sk_buff *skb; 1924 u32 linear_frame_sz; 1925 u16 linear_data_len; 1926 u16 linear_hr; 1927 u16 headlen; 1928 1929 if (unlikely(cqe_bcnt > rq->hw_mtu)) { 1930 u8 lro_num_seg = get_cqe_lro_num_seg(cqe); 1931 1932 if (lro_num_seg <= 1) { 1933 rq->stats->oversize_pkts_sw_drop++; 1934 return NULL; 1935 } 1936 } 1937 1938 prog = rcu_dereference(rq->xdp_prog); 1939 1940 head_addr = netmem_address(head_page->netmem) + head_offset; 1941 1942 if (prog) { 1943 /* area for bpf_xdp_[store|load]_bytes */ 1944 net_prefetchw(head_addr); 1945 1946 va = mlx5e_mpwqe_get_linear_page_frag(rq); 1947 if (!va) { 1948 rq->stats->buff_alloc_err++; 1949 return NULL; 1950 } 1951 1952 net_prefetchw(va); /* xdp_frame data area */ 1953 linear_hr = XDP_PACKET_HEADROOM; 1954 linear_data_len = 0; 1955 linear_frame_sz = MLX5_SKB_FRAG_SZ(linear_hr + MLX5E_RX_MAX_HEAD); 1956 linear_page = &rq->mpwqe.linear_info->frag_page; 1957 } else { 1958 dma_addr_t addr; 1959 1960 skb = napi_alloc_skb(rq->cq.napi, 1961 ALIGN(MLX5E_RX_MAX_HEAD, sizeof(long))); 1962 if (unlikely(!skb)) { 1963 rq->stats->buff_alloc_err++; 1964 return NULL; 1965 } 1966 skb_mark_for_recycle(skb); 1967 va = skb->head; 1968 net_prefetchw(va); /* xdp_frame data area */ 1969 net_prefetchw(skb->data); 1970 1971 headlen = min(MLX5E_RX_MAX_HEAD, cqe_bcnt); 1972 addr = page_pool_get_dma_addr_netmem(head_page->netmem); 1973 dma_sync_single_for_cpu(rq->pdev, addr + head_offset, 1974 ALIGN(headlen, sizeof(long)), 1975 rq->buff.map_dir); 1976 1977 headlen = eth_get_headlen(rq->netdev, head_addr, headlen); 1978 1979 frag_offset += headlen; 1980 byte_cnt -= headlen; 1981 linear_hr = skb_headroom(skb); 1982 linear_data_len = headlen; 1983 linear_frame_sz = MLX5_SKB_FRAG_SZ(skb_end_offset(skb)); 1984 if (unlikely(frag_offset >= page_size)) { 1985 frag_page++; 1986 frag_offset -= page_size; 1987 } 1988 } 1989 1990 mlx5e_fill_mxbuf(rq, cqe, va, linear_hr, linear_frame_sz, 1991 linear_data_len, mxbuf); 1992 1993 sinfo = xdp_get_shared_info_from_buff(&mxbuf->xdp); 1994 1995 while (byte_cnt) { 1996 /* Non-linear mode, hence non-XSK, which always uses PAGE_SIZE. */ 1997 pg_consumed_bytes = 1998 min_t(u32, page_size - frag_offset, byte_cnt); 1999 2000 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state)) 2001 truesize += pg_consumed_bytes; 2002 else 2003 truesize += ALIGN(pg_consumed_bytes, BIT(rq->mpwqe.log_stride_sz)); 2004 2005 mlx5e_add_skb_shared_info_frag(rq, sinfo, &mxbuf->xdp, 2006 frag_page, frag_offset, 2007 pg_consumed_bytes); 2008 byte_cnt -= pg_consumed_bytes; 2009 frag_offset = 0; 2010 frag_page++; 2011 } 2012 2013 if (prog) { 2014 u8 nr_frags_free, old_nr_frags = sinfo->nr_frags; 2015 u8 new_nr_frags; 2016 u32 len; 2017 2018 if (mlx5e_xdp_handle(rq, prog, mxbuf)) { 2019 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) { 2020 struct mlx5e_frag_page *pfp; 2021 2022 for (pfp = head_page; pfp < frag_page; pfp++) 2023 pfp->frags++; 2024 2025 linear_page->frags++; 2026 } 2027 return NULL; /* page/packet was consumed by XDP */ 2028 } 2029 2030 new_nr_frags = sinfo->nr_frags; 2031 nr_frags_free = old_nr_frags - new_nr_frags; 2032 if (unlikely(nr_frags_free)) 2033 truesize -= (nr_frags_free - 1) * page_size + 2034 ALIGN(pg_consumed_bytes, 2035 BIT(rq->mpwqe.log_stride_sz)); 2036 2037 len = mxbuf->xdp.data_end - mxbuf->xdp.data; 2038 2039 skb = mlx5e_build_linear_skb( 2040 rq, mxbuf->xdp.data_hard_start, linear_frame_sz, 2041 mxbuf->xdp.data - mxbuf->xdp.data_hard_start, len, 2042 mxbuf->xdp.data - mxbuf->xdp.data_meta); 2043 if (unlikely(!skb)) 2044 return NULL; 2045 2046 skb_mark_for_recycle(skb); 2047 linear_page->frags++; 2048 2049 if (xdp_buff_has_frags(&mxbuf->xdp)) { 2050 struct mlx5e_frag_page *pagep; 2051 2052 /* sinfo->nr_frags is reset by build_skb, calculate again. */ 2053 xdp_update_skb_frags_info(skb, new_nr_frags, 2054 sinfo->xdp_frags_size, 2055 truesize, 2056 xdp_buff_get_skb_flags(&mxbuf->xdp)); 2057 2058 pagep = head_page; 2059 do 2060 pagep->frags++; 2061 while (++pagep < frag_page); 2062 2063 if (len < ETH_HLEN) 2064 __pskb_pull_tail(skb, min(ETH_HLEN - len, 2065 skb->data_len)); 2066 } 2067 } else { 2068 if (xdp_buff_has_frags(&mxbuf->xdp)) { 2069 struct mlx5e_frag_page *pagep; 2070 2071 xdp_update_skb_frags_info(skb, sinfo->nr_frags, 2072 sinfo->xdp_frags_size, 2073 truesize, 2074 xdp_buff_get_skb_flags(&mxbuf->xdp)); 2075 2076 pagep = frag_page - sinfo->nr_frags; 2077 do 2078 pagep->frags++; 2079 while (++pagep < frag_page); 2080 } 2081 2082 /* copy header */ 2083 skb_copy_to_linear_data(skb, head_addr, 2084 ALIGN(headlen, sizeof(long))); 2085 2086 /* skb linear part was allocated with headlen and aligned to long */ 2087 skb->tail += headlen; 2088 skb->len += headlen; 2089 } 2090 2091 return skb; 2092 } 2093 2094 static struct sk_buff * 2095 mlx5e_skb_from_cqe_mpwrq_linear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 2096 struct mlx5_cqe64 *cqe, u16 cqe_bcnt, u32 head_offset, 2097 u32 page_idx) 2098 { 2099 struct mlx5e_frag_page *frag_page = &wi->alloc_units.frag_pages[page_idx]; 2100 u16 rx_headroom = rq->buff.headroom; 2101 struct bpf_prog *prog; 2102 struct sk_buff *skb; 2103 u32 metasize = 0; 2104 void *va, *data; 2105 dma_addr_t addr; 2106 u32 frag_size; 2107 2108 /* Check packet size. Note LRO doesn't use linear SKB */ 2109 if (unlikely(cqe_bcnt > rq->hw_mtu)) { 2110 rq->stats->oversize_pkts_sw_drop++; 2111 return NULL; 2112 } 2113 2114 va = netmem_address(frag_page->netmem) + head_offset; 2115 data = va + rx_headroom; 2116 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt); 2117 2118 addr = page_pool_get_dma_addr_netmem(frag_page->netmem); 2119 dma_sync_single_range_for_cpu(rq->pdev, addr, head_offset, 2120 frag_size, rq->buff.map_dir); 2121 net_prefetch(data); 2122 2123 prog = rcu_dereference(rq->xdp_prog); 2124 if (prog) { 2125 struct mlx5e_xdp_buff *mxbuf = &rq->mxbuf; 2126 2127 net_prefetchw(va); /* xdp_frame data area */ 2128 mlx5e_fill_mxbuf(rq, cqe, va, rx_headroom, rq->buff.frame0_sz, 2129 cqe_bcnt, mxbuf); 2130 if (mlx5e_xdp_handle(rq, prog, mxbuf)) { 2131 if (__test_and_clear_bit(MLX5E_RQ_FLAG_XDP_XMIT, rq->flags)) 2132 frag_page->frags++; 2133 return NULL; /* page/packet was consumed by XDP */ 2134 } 2135 2136 rx_headroom = mxbuf->xdp.data - mxbuf->xdp.data_hard_start; 2137 metasize = mxbuf->xdp.data - mxbuf->xdp.data_meta; 2138 cqe_bcnt = mxbuf->xdp.data_end - mxbuf->xdp.data; 2139 } 2140 frag_size = MLX5_SKB_FRAG_SZ(rx_headroom + cqe_bcnt); 2141 skb = mlx5e_build_linear_skb(rq, va, frag_size, rx_headroom, cqe_bcnt, metasize); 2142 if (unlikely(!skb)) 2143 return NULL; 2144 2145 /* queue up for recycling/reuse */ 2146 skb_mark_for_recycle(skb); 2147 frag_page->frags++; 2148 2149 return skb; 2150 } 2151 2152 static struct sk_buff * 2153 mlx5e_skb_from_cqe_shampo(struct mlx5e_rq *rq, struct mlx5e_mpw_info *wi, 2154 struct mlx5_cqe64 *cqe, u16 header_index) 2155 { 2156 u16 head_size = cqe->shampo.header_size; 2157 struct mlx5e_dma_info *di; 2158 struct sk_buff *skb; 2159 u32 head_offset; 2160 int len; 2161 2162 len = ALIGN(head_size, sizeof(long)); 2163 skb = napi_alloc_skb(rq->cq.napi, len); 2164 if (unlikely(!skb)) { 2165 rq->stats->buff_alloc_err++; 2166 return NULL; 2167 } 2168 2169 net_prefetchw(skb->data); 2170 2171 mlx5e_shampo_get_hd_buf_info(rq, cqe, &di, &head_offset); 2172 mlx5e_copy_skb_header(rq, skb, page_to_netmem(di->page), di->addr, 2173 head_offset, head_offset, len); 2174 __skb_put(skb, head_size); 2175 2176 /* queue up for recycling/reuse */ 2177 skb_mark_for_recycle(skb); 2178 2179 return skb; 2180 } 2181 2182 static void 2183 mlx5e_shampo_align_fragment(struct sk_buff *skb, u8 log_stride_sz) 2184 { 2185 skb_frag_t *last_frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1]; 2186 unsigned int frag_size = skb_frag_size(last_frag); 2187 unsigned int frag_truesize; 2188 2189 frag_truesize = ALIGN(frag_size, BIT(log_stride_sz)); 2190 skb->truesize += frag_truesize - frag_size; 2191 } 2192 2193 static void 2194 mlx5e_shampo_flush_skb(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe, bool match) 2195 { 2196 struct sk_buff *skb = rq->hw_gro_data->skb; 2197 struct mlx5e_rq_stats *stats = rq->stats; 2198 u16 gro_count = NAPI_GRO_CB(skb)->count; 2199 2200 if (likely(skb_shinfo(skb)->nr_frags)) 2201 mlx5e_shampo_align_fragment(skb, rq->mpwqe.log_stride_sz); 2202 if (gro_count > 1) { 2203 stats->gro_skbs++; 2204 stats->gro_packets += gro_count; 2205 stats->gro_bytes += skb->data_len + skb_headlen(skb) * gro_count; 2206 2207 mlx5e_shampo_update_hdr(rq, cqe, match); 2208 } else { 2209 skb_shinfo(skb)->gso_size = 0; 2210 } 2211 napi_gro_receive(rq->cq.napi, skb); 2212 rq->hw_gro_data->skb = NULL; 2213 } 2214 2215 static bool mlx5e_hw_gro_skb_has_enough_space(struct sk_buff *skb, 2216 u16 data_bcnt, 2217 u32 page_size) 2218 { 2219 int nr_frags = skb_shinfo(skb)->nr_frags; 2220 2221 if (page_size >= GRO_LEGACY_MAX_SIZE) 2222 return skb->len + data_bcnt <= GRO_LEGACY_MAX_SIZE; 2223 else 2224 return page_size * nr_frags + data_bcnt <= GRO_LEGACY_MAX_SIZE; 2225 } 2226 2227 static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 2228 { 2229 u16 data_bcnt = mpwrq_get_cqe_byte_cnt(cqe) - cqe->shampo.header_size; 2230 u16 header_index = mlx5e_shampo_get_cqe_header_index(rq, cqe); 2231 u32 wqe_offset = be32_to_cpu(cqe->shampo.data_offset); 2232 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe); 2233 u32 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe); 2234 u16 wqe_id = be16_to_cpu(cqe->wqe_id); 2235 u16 head_size = cqe->shampo.header_size; 2236 struct sk_buff **skb = &rq->hw_gro_data->skb; 2237 bool flush = cqe->shampo.flush; 2238 bool match = cqe->shampo.match; 2239 u32 page_size = BIT(rq->mpwqe.page_shift); 2240 struct mlx5e_rq_stats *stats = rq->stats; 2241 struct mlx5e_rx_wqe_ll *wqe; 2242 struct mlx5e_mpw_info *wi; 2243 struct mlx5_wq_ll *wq; 2244 u32 data_offset; 2245 u32 page_idx; 2246 2247 wi = mlx5e_get_mpw_info(rq, wqe_id); 2248 wi->consumed_strides += cstrides; 2249 2250 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 2251 mlx5e_handle_rx_err_cqe(rq, cqe); 2252 goto mpwrq_cqe_out; 2253 } 2254 2255 if (unlikely(mpwrq_is_filler_cqe(cqe))) { 2256 stats->mpwqe_filler_cqes++; 2257 stats->mpwqe_filler_strides += cstrides; 2258 goto mpwrq_cqe_out; 2259 } 2260 2261 data_offset = wqe_offset & (page_size - 1); 2262 page_idx = wqe_offset >> rq->mpwqe.page_shift; 2263 if (unlikely(cqe_bcnt <= ETH_ZLEN + 2 * VLAN_HLEN)) { 2264 match = false; 2265 flush = true; 2266 } 2267 2268 if (*skb && 2269 !(match && mlx5e_hw_gro_skb_has_enough_space(*skb, data_bcnt, 2270 page_size))) { 2271 match = false; 2272 mlx5e_shampo_flush_skb(rq, cqe, match); 2273 } 2274 2275 if (!*skb) { 2276 if (likely(head_size)) { 2277 *skb = mlx5e_skb_from_cqe_shampo(rq, wi, cqe, header_index); 2278 } else { 2279 struct mlx5e_frag_page *frag_page; 2280 2281 frag_page = &wi->alloc_units.frag_pages[page_idx]; 2282 /* Drop packets with header in unreadable data area to 2283 * prevent the kernel from touching it. 2284 */ 2285 if (unlikely(netmem_is_net_iov(frag_page->netmem))) 2286 goto mpwrq_cqe_out; 2287 *skb = mlx5e_skb_from_cqe_mpwrq_nonlinear(rq, wi, cqe, 2288 cqe_bcnt, 2289 data_offset, 2290 page_idx); 2291 } 2292 2293 if (unlikely(!*skb)) 2294 goto mpwrq_cqe_out; 2295 2296 NAPI_GRO_CB(*skb)->count = 1; 2297 skb_shinfo(*skb)->gso_size = cqe_bcnt - head_size; 2298 } else { 2299 NAPI_GRO_CB(*skb)->count++; 2300 2301 if (NAPI_GRO_CB(*skb)->count == 2 && 2302 rq->hw_gro_data->fk.basic.n_proto == htons(ETH_P_IP)) { 2303 int len = ETH_HLEN + rq->hw_gro_data->fk.control.thoff; 2304 int nhoff = len - sizeof(struct iphdr); 2305 void *last_hd_addr; 2306 struct iphdr *iph; 2307 2308 last_hd_addr = mlx5e_shampo_get_hdr(rq, cqe, len); 2309 iph = (struct iphdr *)(last_hd_addr + nhoff); 2310 rq->hw_gro_data->second_ip_id = ntohs(iph->id); 2311 } 2312 } 2313 2314 if (likely(head_size)) { 2315 if (data_bcnt) { 2316 struct mlx5e_frag_page *frag_page; 2317 2318 frag_page = &wi->alloc_units.frag_pages[page_idx]; 2319 mlx5e_shampo_fill_skb_data(*skb, rq, frag_page, data_bcnt, data_offset); 2320 } else { 2321 stats->hds_nodata_packets++; 2322 stats->hds_nodata_bytes += head_size; 2323 } 2324 } else { 2325 stats->hds_nosplit_packets++; 2326 stats->hds_nosplit_bytes += data_bcnt; 2327 } 2328 2329 if (mlx5e_shampo_complete_rx_cqe(rq, cqe, cqe_bcnt, *skb)) { 2330 *skb = NULL; 2331 goto mpwrq_cqe_out; 2332 } 2333 if (flush && rq->hw_gro_data->skb) 2334 mlx5e_shampo_flush_skb(rq, cqe, match); 2335 mpwrq_cqe_out: 2336 if (likely(wi->consumed_strides < rq->mpwqe.num_strides)) 2337 return; 2338 2339 if (unlikely(!cstrides)) 2340 return; 2341 2342 wq = &rq->mpwqe.wq; 2343 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id); 2344 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index); 2345 } 2346 2347 static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 2348 { 2349 u16 cstrides = mpwrq_get_cqe_consumed_strides(cqe); 2350 u16 wqe_id = be16_to_cpu(cqe->wqe_id); 2351 struct mlx5e_mpw_info *wi = mlx5e_get_mpw_info(rq, wqe_id); 2352 u16 stride_ix = mpwrq_get_cqe_stride_index(cqe); 2353 u32 wqe_offset = stride_ix << rq->mpwqe.log_stride_sz; 2354 u32 head_offset = wqe_offset & ((1 << rq->mpwqe.page_shift) - 1); 2355 u32 page_idx = wqe_offset >> rq->mpwqe.page_shift; 2356 struct mlx5e_rx_wqe_ll *wqe; 2357 struct mlx5_wq_ll *wq; 2358 struct sk_buff *skb; 2359 u16 cqe_bcnt; 2360 2361 wi->consumed_strides += cstrides; 2362 2363 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 2364 mlx5e_handle_rx_err_cqe(rq, cqe); 2365 goto mpwrq_cqe_out; 2366 } 2367 2368 if (unlikely(mpwrq_is_filler_cqe(cqe))) { 2369 struct mlx5e_rq_stats *stats = rq->stats; 2370 2371 stats->mpwqe_filler_cqes++; 2372 stats->mpwqe_filler_strides += cstrides; 2373 goto mpwrq_cqe_out; 2374 } 2375 2376 cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe); 2377 2378 skb = INDIRECT_CALL_3(rq->mpwqe.skb_from_cqe_mpwrq, 2379 mlx5e_skb_from_cqe_mpwrq_linear, 2380 mlx5e_skb_from_cqe_mpwrq_nonlinear, 2381 mlx5e_xsk_skb_from_cqe_mpwrq_linear, 2382 rq, wi, cqe, cqe_bcnt, head_offset, 2383 page_idx); 2384 if (!skb) 2385 goto mpwrq_cqe_out; 2386 2387 if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb)) 2388 goto mpwrq_cqe_out; 2389 2390 if (mlx5e_cqe_regb_chain(cqe)) 2391 if (!mlx5e_tc_update_skb_nic(cqe, skb)) { 2392 dev_kfree_skb_any(skb); 2393 goto mpwrq_cqe_out; 2394 } 2395 2396 napi_gro_receive(rq->cq.napi, skb); 2397 2398 mpwrq_cqe_out: 2399 if (likely(wi->consumed_strides < rq->mpwqe.num_strides)) 2400 return; 2401 2402 wq = &rq->mpwqe.wq; 2403 wqe = mlx5_wq_ll_get_wqe(wq, wqe_id); 2404 mlx5_wq_ll_pop(wq, cqe->wqe_id, &wqe->next.next_wqe_index); 2405 } 2406 2407 static int mlx5e_rx_cq_process_enhanced_cqe_comp(struct mlx5e_rq *rq, 2408 struct mlx5_cqwq *cqwq, 2409 int budget_rem) 2410 { 2411 struct mlx5_cqe64 *cqe, *title_cqe = NULL; 2412 struct mlx5e_cq_decomp *cqd = &rq->cqd; 2413 int work_done = 0; 2414 2415 cqe = mlx5_cqwq_get_cqe_enhanced_comp(cqwq); 2416 if (!cqe) 2417 return work_done; 2418 2419 if (cqd->last_cqe_title && 2420 (mlx5_get_cqe_format(cqe) == MLX5_COMPRESSED)) { 2421 rq->stats->cqe_compress_blks++; 2422 cqd->last_cqe_title = false; 2423 } 2424 2425 do { 2426 if (mlx5_get_cqe_format(cqe) == MLX5_COMPRESSED) { 2427 if (title_cqe) { 2428 mlx5e_read_enhanced_title_slot(rq, title_cqe); 2429 title_cqe = NULL; 2430 rq->stats->cqe_compress_blks++; 2431 } 2432 work_done += 2433 mlx5e_decompress_enhanced_cqe(rq, cqwq, cqe, 2434 budget_rem - work_done); 2435 continue; 2436 } 2437 title_cqe = cqe; 2438 mlx5_cqwq_pop(cqwq); 2439 2440 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq, 2441 mlx5e_handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq_shampo, 2442 rq, cqe); 2443 work_done++; 2444 } while (work_done < budget_rem && 2445 (cqe = mlx5_cqwq_get_cqe_enhanced_comp(cqwq))); 2446 2447 /* last cqe might be title on next poll bulk */ 2448 if (title_cqe) { 2449 mlx5e_read_enhanced_title_slot(rq, title_cqe); 2450 cqd->last_cqe_title = true; 2451 } 2452 2453 return work_done; 2454 } 2455 2456 static int mlx5e_rx_cq_process_basic_cqe_comp(struct mlx5e_rq *rq, 2457 struct mlx5_cqwq *cqwq, 2458 int budget_rem) 2459 { 2460 struct mlx5_cqe64 *cqe; 2461 int work_done = 0; 2462 2463 if (rq->cqd.left) 2464 work_done += mlx5e_decompress_cqes_cont(rq, cqwq, 0, budget_rem); 2465 2466 while (work_done < budget_rem && (cqe = mlx5_cqwq_get_cqe(cqwq))) { 2467 if (mlx5_get_cqe_format(cqe) == MLX5_COMPRESSED) { 2468 work_done += 2469 mlx5e_decompress_cqes_start(rq, cqwq, 2470 budget_rem - work_done); 2471 continue; 2472 } 2473 2474 mlx5_cqwq_pop(cqwq); 2475 INDIRECT_CALL_3(rq->handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq, 2476 mlx5e_handle_rx_cqe, mlx5e_handle_rx_cqe_mpwrq_shampo, 2477 rq, cqe); 2478 work_done++; 2479 } 2480 2481 return work_done; 2482 } 2483 2484 int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget) 2485 { 2486 struct mlx5e_rq *rq = container_of(cq, struct mlx5e_rq, cq); 2487 struct mlx5_cqwq *cqwq = &cq->wq; 2488 int work_done; 2489 2490 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state))) 2491 return 0; 2492 2493 if (test_bit(MLX5E_RQ_STATE_MINI_CQE_ENHANCED, &rq->state)) 2494 work_done = mlx5e_rx_cq_process_enhanced_cqe_comp(rq, cqwq, 2495 budget); 2496 else 2497 work_done = mlx5e_rx_cq_process_basic_cqe_comp(rq, cqwq, 2498 budget); 2499 2500 if (work_done == 0) 2501 return 0; 2502 2503 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state) && rq->hw_gro_data->skb) 2504 mlx5e_shampo_flush_skb(rq, NULL, false); 2505 2506 if (rcu_access_pointer(rq->xdp_prog)) 2507 mlx5e_xdp_rx_poll_complete(rq); 2508 2509 mlx5_cqwq_update_db_record(cqwq); 2510 2511 /* ensure cq space is freed before enabling more cqes */ 2512 wmb(); 2513 2514 return work_done; 2515 } 2516 2517 #ifdef CONFIG_MLX5_CORE_IPOIB 2518 2519 #define MLX5_IB_GRH_SGID_OFFSET 8 2520 #define MLX5_IB_GRH_DGID_OFFSET 24 2521 #define MLX5_GID_SIZE 16 2522 2523 static inline void mlx5i_complete_rx_cqe(struct mlx5e_rq *rq, 2524 struct mlx5_cqe64 *cqe, 2525 u32 cqe_bcnt, 2526 struct sk_buff *skb) 2527 { 2528 struct mlx5e_rq_stats *stats; 2529 struct net_device *netdev; 2530 struct mlx5e_priv *priv; 2531 char *pseudo_header; 2532 u32 flags_rqpn; 2533 u32 qpn; 2534 u8 *dgid; 2535 u8 g; 2536 2537 qpn = be32_to_cpu(cqe->sop_drop_qpn) & 0xffffff; 2538 netdev = mlx5i_pkey_get_netdev(rq->netdev, qpn); 2539 2540 /* No mapping present, cannot process SKB. This might happen if a child 2541 * interface is going down while having unprocessed CQEs on parent RQ 2542 */ 2543 if (unlikely(!netdev)) { 2544 /* TODO: add drop counters support */ 2545 skb->dev = NULL; 2546 pr_warn_once("Unable to map QPN %u to dev - dropping skb\n", qpn); 2547 return; 2548 } 2549 2550 priv = mlx5i_epriv(netdev); 2551 stats = &priv->channel_stats[rq->ix]->rq; 2552 2553 flags_rqpn = be32_to_cpu(cqe->flags_rqpn); 2554 g = (flags_rqpn >> 28) & 3; 2555 dgid = skb->data + MLX5_IB_GRH_DGID_OFFSET; 2556 if ((!g) || dgid[0] != 0xff) 2557 skb->pkt_type = PACKET_HOST; 2558 else if (memcmp(dgid, netdev->broadcast + 4, MLX5_GID_SIZE) == 0) 2559 skb->pkt_type = PACKET_BROADCAST; 2560 else 2561 skb->pkt_type = PACKET_MULTICAST; 2562 2563 /* Drop packets that this interface sent, ie multicast packets 2564 * that the HCA has replicated. 2565 */ 2566 if (g && (qpn == (flags_rqpn & 0xffffff)) && 2567 (memcmp(netdev->dev_addr + 4, skb->data + MLX5_IB_GRH_SGID_OFFSET, 2568 MLX5_GID_SIZE) == 0)) { 2569 skb->dev = NULL; 2570 return; 2571 } 2572 2573 skb_pull(skb, MLX5_IB_GRH_BYTES); 2574 2575 skb->protocol = *((__be16 *)(skb->data)); 2576 2577 if (netdev->features & NETIF_F_RXCSUM) { 2578 skb->ip_summed = CHECKSUM_COMPLETE; 2579 skb->csum = csum_unfold((__force __sum16)cqe->check_sum); 2580 stats->csum_complete++; 2581 } else { 2582 skb->ip_summed = CHECKSUM_NONE; 2583 stats->csum_none++; 2584 } 2585 2586 if (unlikely(mlx5e_rx_hw_stamp(&priv->hwtstamp_config))) 2587 skb_hwtstamps(skb)->hwtstamp = mlx5e_cqe_ts_to_ns(rq->ptp_cyc2time, 2588 rq->clock, get_cqe_ts(cqe)); 2589 skb_record_rx_queue(skb, rq->ix); 2590 2591 if (likely(netdev->features & NETIF_F_RXHASH)) 2592 mlx5e_skb_set_hash(cqe, skb); 2593 2594 /* 20 bytes of ipoib header and 4 for encap existing */ 2595 pseudo_header = skb_push(skb, MLX5_IPOIB_PSEUDO_LEN); 2596 memset(pseudo_header, 0, MLX5_IPOIB_PSEUDO_LEN); 2597 skb_reset_mac_header(skb); 2598 skb_pull(skb, MLX5_IPOIB_HARD_LEN); 2599 2600 skb->dev = netdev; 2601 2602 stats->packets++; 2603 stats->bytes += cqe_bcnt; 2604 } 2605 2606 static void mlx5i_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 2607 { 2608 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 2609 struct mlx5e_wqe_frag_info *wi; 2610 struct sk_buff *skb; 2611 u32 cqe_bcnt; 2612 u16 ci; 2613 2614 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter)); 2615 wi = get_frag(rq, ci); 2616 cqe_bcnt = be32_to_cpu(cqe->byte_cnt); 2617 2618 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 2619 rq->stats->wqe_err++; 2620 goto wq_cyc_pop; 2621 } 2622 2623 skb = INDIRECT_CALL_2(rq->wqe.skb_from_cqe, 2624 mlx5e_skb_from_cqe_linear, 2625 mlx5e_skb_from_cqe_nonlinear, 2626 rq, wi, cqe, cqe_bcnt); 2627 if (!skb) 2628 goto wq_cyc_pop; 2629 2630 mlx5i_complete_rx_cqe(rq, cqe, cqe_bcnt, skb); 2631 if (unlikely(!skb->dev)) { 2632 dev_kfree_skb_any(skb); 2633 goto wq_cyc_pop; 2634 } 2635 napi_gro_receive(rq->cq.napi, skb); 2636 2637 wq_cyc_pop: 2638 mlx5_wq_cyc_pop(wq); 2639 } 2640 2641 const struct mlx5e_rx_handlers mlx5i_rx_handlers = { 2642 .handle_rx_cqe = mlx5i_handle_rx_cqe, 2643 .handle_rx_cqe_mpwqe = NULL, /* Not supported */ 2644 }; 2645 #endif /* CONFIG_MLX5_CORE_IPOIB */ 2646 2647 int mlx5e_rq_set_handlers(struct mlx5e_rq *rq, struct mlx5e_params *params, bool xsk) 2648 { 2649 struct net_device *netdev = rq->netdev; 2650 struct mlx5_core_dev *mdev = rq->mdev; 2651 struct mlx5e_priv *priv = rq->priv; 2652 2653 switch (rq->wq_type) { 2654 case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ: 2655 rq->mpwqe.skb_from_cqe_mpwrq = xsk ? 2656 mlx5e_xsk_skb_from_cqe_mpwrq_linear : 2657 mlx5e_rx_mpwqe_is_linear_skb(mdev, params, NULL) ? 2658 mlx5e_skb_from_cqe_mpwrq_linear : 2659 mlx5e_skb_from_cqe_mpwrq_nonlinear; 2660 rq->post_wqes = mlx5e_post_rx_mpwqes; 2661 rq->dealloc_wqe = mlx5e_dealloc_rx_mpwqe; 2662 2663 if (params->packet_merge.type == MLX5E_PACKET_MERGE_SHAMPO) { 2664 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe_mpwqe_shampo; 2665 if (!rq->handle_rx_cqe) { 2666 netdev_err(netdev, "RX handler of SHAMPO MPWQE RQ is not set\n"); 2667 return -EINVAL; 2668 } 2669 } else { 2670 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe_mpwqe; 2671 if (!rq->handle_rx_cqe) { 2672 netdev_err(netdev, "RX handler of MPWQE RQ is not set\n"); 2673 return -EINVAL; 2674 } 2675 } 2676 2677 break; 2678 default: /* MLX5_WQ_TYPE_CYCLIC */ 2679 rq->wqe.skb_from_cqe = xsk ? 2680 mlx5e_xsk_skb_from_cqe_linear : 2681 mlx5e_rx_is_linear_skb(mdev, params, NULL) ? 2682 mlx5e_skb_from_cqe_linear : 2683 mlx5e_skb_from_cqe_nonlinear; 2684 rq->post_wqes = mlx5e_post_rx_wqes; 2685 rq->dealloc_wqe = mlx5e_dealloc_rx_wqe; 2686 rq->handle_rx_cqe = priv->profile->rx_handlers->handle_rx_cqe; 2687 if (!rq->handle_rx_cqe) { 2688 netdev_err(netdev, "RX handler of RQ is not set\n"); 2689 return -EINVAL; 2690 } 2691 } 2692 2693 return 0; 2694 } 2695 2696 static void mlx5e_trap_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) 2697 { 2698 struct mlx5_wq_cyc *wq = &rq->wqe.wq; 2699 struct mlx5e_wqe_frag_info *wi; 2700 struct sk_buff *skb; 2701 u32 cqe_bcnt; 2702 u16 trap_id; 2703 u16 ci; 2704 2705 trap_id = get_cqe_flow_tag(cqe); 2706 ci = mlx5_wq_cyc_ctr2ix(wq, be16_to_cpu(cqe->wqe_counter)); 2707 wi = get_frag(rq, ci); 2708 cqe_bcnt = be32_to_cpu(cqe->byte_cnt); 2709 2710 if (unlikely(MLX5E_RX_ERR_CQE(cqe))) { 2711 rq->stats->wqe_err++; 2712 goto wq_cyc_pop; 2713 } 2714 2715 skb = mlx5e_skb_from_cqe_nonlinear(rq, wi, cqe, cqe_bcnt); 2716 if (!skb) 2717 goto wq_cyc_pop; 2718 2719 if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb)) 2720 goto wq_cyc_pop; 2721 skb_push(skb, ETH_HLEN); 2722 2723 mlx5_devlink_trap_report(rq->mdev, trap_id, skb, 2724 rq->netdev->devlink_port); 2725 dev_kfree_skb_any(skb); 2726 2727 wq_cyc_pop: 2728 mlx5_wq_cyc_pop(wq); 2729 } 2730 2731 void mlx5e_rq_set_trap_handlers(struct mlx5e_rq *rq, struct mlx5e_params *params) 2732 { 2733 rq->wqe.skb_from_cqe = mlx5e_rx_is_linear_skb(rq->mdev, params, NULL) ? 2734 mlx5e_skb_from_cqe_linear : 2735 mlx5e_skb_from_cqe_nonlinear; 2736 rq->post_wqes = mlx5e_post_rx_wqes; 2737 rq->dealloc_wqe = mlx5e_dealloc_rx_wqe; 2738 rq->handle_rx_cqe = mlx5e_trap_handle_rx_cqe; 2739 } 2740