Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'ena-driver-changes-may-2024'

David Arinzon says:

====================
ENA driver changes May 2024

This patchset contains several misc and minor
changes to the ENA driver.
====================

Link: https://lore.kernel.org/r/20240512134637.25299-1-darinzon@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+72 -27
+3 -3
drivers/net/ethernet/amazon/ena/ena_com.h
··· 47 47 /* ENA adaptive interrupt moderation settings */ 48 48 49 49 #define ENA_INTR_INITIAL_TX_INTERVAL_USECS 64 50 - #define ENA_INTR_INITIAL_RX_INTERVAL_USECS 0 50 + #define ENA_INTR_INITIAL_RX_INTERVAL_USECS 20 51 51 #define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1 52 52 53 53 #define ENA_HASH_KEY_SIZE 40 ··· 305 305 u16 stats_func; /* Selected function for extended statistic dump */ 306 306 u16 stats_queue; /* Selected queue for extended statistic dump */ 307 307 308 + u32 ena_min_poll_delay_us; 309 + 308 310 struct ena_com_mmio_read mmio_read; 309 311 310 312 struct ena_rss rss; ··· 327 325 struct ena_intr_moder_entry *intr_moder_tbl; 328 326 329 327 struct ena_com_llq_info llq_info; 330 - 331 - u32 ena_min_poll_delay_us; 332 328 }; 333 329 334 330 struct ena_com_dev_get_features_ctx {
+27 -10
drivers/net/ethernet/amazon/ena/ena_eth_com.c
··· 229 229 idx * io_cq->cdesc_entry_size_in_bytes); 230 230 } 231 231 232 - static u16 ena_com_cdesc_rx_pkt_get(struct ena_com_io_cq *io_cq, 233 - u16 *first_cdesc_idx) 232 + static int ena_com_cdesc_rx_pkt_get(struct ena_com_io_cq *io_cq, 233 + u16 *first_cdesc_idx, 234 + u16 *num_descs) 234 235 { 236 + u16 count = io_cq->cur_rx_pkt_cdesc_count, head_masked; 235 237 struct ena_eth_io_rx_cdesc_base *cdesc; 236 - u16 count = 0, head_masked; 237 238 u32 last = 0; 238 239 239 240 do { 241 + u32 status; 242 + 240 243 cdesc = ena_com_get_next_rx_cdesc(io_cq); 241 244 if (!cdesc) 242 245 break; 246 + status = READ_ONCE(cdesc->status); 243 247 244 248 ena_com_cq_inc_head(io_cq); 249 + if (unlikely((status & ENA_ETH_IO_RX_CDESC_BASE_FIRST_MASK) >> 250 + ENA_ETH_IO_RX_CDESC_BASE_FIRST_SHIFT && count != 0)) { 251 + struct ena_com_dev *dev = ena_com_io_cq_to_ena_dev(io_cq); 252 + 253 + netdev_err(dev->net_device, 254 + "First bit is on in descriptor #%d on q_id: %d, req_id: %u\n", 255 + count, io_cq->qid, cdesc->req_id); 256 + return -EFAULT; 257 + } 245 258 count++; 246 - last = (READ_ONCE(cdesc->status) & ENA_ETH_IO_RX_CDESC_BASE_LAST_MASK) >> 247 - ENA_ETH_IO_RX_CDESC_BASE_LAST_SHIFT; 259 + last = (status & ENA_ETH_IO_RX_CDESC_BASE_LAST_MASK) >> 260 + ENA_ETH_IO_RX_CDESC_BASE_LAST_SHIFT; 248 261 } while (!last); 249 262 250 263 if (last) { 251 264 *first_cdesc_idx = io_cq->cur_rx_pkt_cdesc_start_idx; 252 - count += io_cq->cur_rx_pkt_cdesc_count; 253 265 254 266 head_masked = io_cq->head & (io_cq->q_depth - 1); 255 267 268 + *num_descs = count; 256 269 io_cq->cur_rx_pkt_cdesc_count = 0; 257 270 io_cq->cur_rx_pkt_cdesc_start_idx = head_masked; 258 271 ··· 273 260 "ENA q_id: %d packets were completed. first desc idx %u descs# %d\n", 274 261 io_cq->qid, *first_cdesc_idx, count); 275 262 } else { 276 - io_cq->cur_rx_pkt_cdesc_count += count; 277 - count = 0; 263 + io_cq->cur_rx_pkt_cdesc_count = count; 264 + *num_descs = 0; 278 265 } 279 266 280 - return count; 267 + return 0; 281 268 } 282 269 283 270 static int ena_com_create_meta(struct ena_com_io_sq *io_sq, ··· 552 539 u16 cdesc_idx = 0; 553 540 u16 nb_hw_desc; 554 541 u16 i = 0; 542 + int rc; 555 543 556 544 WARN(io_cq->direction != ENA_COM_IO_QUEUE_DIRECTION_RX, "wrong Q type"); 557 545 558 - nb_hw_desc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx); 546 + rc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx, &nb_hw_desc); 547 + if (unlikely(rc != 0)) 548 + return -EFAULT; 549 + 559 550 if (nb_hw_desc == 0) { 560 551 ena_rx_ctx->descs = nb_hw_desc; 561 552 return 0;
+1 -1
drivers/net/ethernet/amazon/ena/ena_eth_com.h
··· 47 47 bool frag; 48 48 u32 hash; 49 49 u16 descs; 50 - int max_bufs; 50 + u16 max_bufs; 51 51 u8 pkt_offset; 52 52 }; 53 53
+12 -3
drivers/net/ethernet/amazon/ena/ena_ethtool.c
··· 49 49 ENA_STAT_GLOBAL_ENTRY(interface_up), 50 50 ENA_STAT_GLOBAL_ENTRY(interface_down), 51 51 ENA_STAT_GLOBAL_ENTRY(admin_q_pause), 52 + ENA_STAT_GLOBAL_ENTRY(reset_fail), 52 53 }; 53 54 54 55 static const struct ena_stats ena_stats_eni_strings[] = { ··· 460 459 struct ethtool_drvinfo *info) 461 460 { 462 461 struct ena_adapter *adapter = netdev_priv(dev); 462 + ssize_t ret = 0; 463 463 464 - strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); 465 - strscpy(info->bus_info, pci_name(adapter->pdev), 466 - sizeof(info->bus_info)); 464 + ret = strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver)); 465 + if (ret < 0) 466 + netif_dbg(adapter, drv, dev, 467 + "module name will be truncated, status = %zd\n", ret); 468 + 469 + ret = strscpy(info->bus_info, pci_name(adapter->pdev), 470 + sizeof(info->bus_info)); 471 + if (ret < 0) 472 + netif_dbg(adapter, drv, dev, 473 + "bus info will be truncated, status = %zd\n", ret); 467 474 } 468 475 469 476 static void ena_get_ringparam(struct net_device *netdev,
+27 -10
drivers/net/ethernet/amazon/ena/ena_netdev.c
··· 42 42 43 43 static int ena_rss_init_default(struct ena_adapter *adapter); 44 44 static void check_for_admin_com_state(struct ena_adapter *adapter); 45 - static void ena_destroy_device(struct ena_adapter *adapter, bool graceful); 45 + static int ena_destroy_device(struct ena_adapter *adapter, bool graceful); 46 46 static int ena_restore_device(struct ena_adapter *adapter); 47 47 48 48 static void ena_tx_timeout(struct net_device *dev, unsigned int txqueue) ··· 1347 1347 if (rc == -ENOSPC) { 1348 1348 ena_increase_stat(&rx_ring->rx_stats.bad_desc_num, 1, &rx_ring->syncp); 1349 1349 ena_reset_device(adapter, ENA_REGS_RESET_TOO_MANY_RX_DESCS); 1350 + } else if (rc == -EFAULT) { 1351 + ena_reset_device(adapter, ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED); 1350 1352 } else { 1351 1353 ena_increase_stat(&rx_ring->rx_stats.bad_req_id, 1, 1352 1354 &rx_ring->syncp); ··· 2703 2701 { 2704 2702 struct device *dev = &pdev->dev; 2705 2703 struct ena_admin_host_info *host_info; 2704 + ssize_t ret; 2706 2705 int rc; 2707 2706 2708 2707 /* Allocate only the host info */ ··· 2718 2715 host_info->bdf = pci_dev_id(pdev); 2719 2716 host_info->os_type = ENA_ADMIN_OS_LINUX; 2720 2717 host_info->kernel_ver = LINUX_VERSION_CODE; 2721 - strscpy(host_info->kernel_ver_str, utsname()->version, 2722 - sizeof(host_info->kernel_ver_str) - 1); 2718 + ret = strscpy(host_info->kernel_ver_str, utsname()->version, 2719 + sizeof(host_info->kernel_ver_str)); 2720 + if (ret < 0) 2721 + dev_dbg(dev, 2722 + "kernel version string will be truncated, status = %zd\n", ret); 2723 + 2723 2724 host_info->os_dist = 0; 2724 - strscpy(host_info->os_dist_str, utsname()->release, 2725 - sizeof(host_info->os_dist_str)); 2725 + ret = strscpy(host_info->os_dist_str, utsname()->release, 2726 + sizeof(host_info->os_dist_str)); 2727 + if (ret < 0) 2728 + dev_dbg(dev, 2729 + "OS distribution string will be truncated, status = %zd\n", ret); 2730 + 2726 2731 host_info->driver_version = 2727 2732 (DRV_MODULE_GEN_MAJOR) | 2728 2733 (DRV_MODULE_GEN_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT) | ··· 3246 3235 return rc; 3247 3236 } 3248 3237 3249 - static void ena_destroy_device(struct ena_adapter *adapter, bool graceful) 3238 + static int ena_destroy_device(struct ena_adapter *adapter, bool graceful) 3250 3239 { 3251 3240 struct net_device *netdev = adapter->netdev; 3252 3241 struct ena_com_dev *ena_dev = adapter->ena_dev; 3253 3242 bool dev_up; 3243 + int rc = 0; 3254 3244 3255 3245 if (!test_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags)) 3256 - return; 3246 + return 0; 3257 3247 3258 3248 netif_carrier_off(netdev); 3259 3249 ··· 3272 3260 * and device is up, ena_down() already reset the device. 3273 3261 */ 3274 3262 if (!(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags) && dev_up)) 3275 - ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason); 3263 + rc = ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason); 3276 3264 3277 3265 ena_free_mgmnt_irq(adapter); 3278 3266 ··· 3291 3279 3292 3280 clear_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags); 3293 3281 clear_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags); 3282 + 3283 + return rc; 3294 3284 } 3295 3285 3296 3286 static int ena_restore_device(struct ena_adapter *adapter) ··· 3369 3355 3370 3356 static void ena_fw_reset_device(struct work_struct *work) 3371 3357 { 3358 + int rc = 0; 3359 + 3372 3360 struct ena_adapter *adapter = 3373 3361 container_of(work, struct ena_adapter, reset_task); 3374 3362 3375 3363 rtnl_lock(); 3376 3364 3377 3365 if (likely(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags))) { 3378 - ena_destroy_device(adapter, false); 3379 - ena_restore_device(adapter); 3366 + rc |= ena_destroy_device(adapter, false); 3367 + rc |= ena_restore_device(adapter); 3368 + adapter->dev_stats.reset_fail += !!rc; 3380 3369 3381 3370 dev_err(&adapter->pdev->dev, "Device reset completed successfully\n"); 3382 3371 }
+1
drivers/net/ethernet/amazon/ena/ena_netdev.h
··· 290 290 u64 admin_q_pause; 291 291 u64 rx_drops; 292 292 u64 tx_drops; 293 + u64 reset_fail; 293 294 }; 294 295 295 296 enum ena_flags_t {
+1
drivers/net/ethernet/amazon/ena/ena_regs_defs.h
··· 22 22 ENA_REGS_RESET_GENERIC = 13, 23 23 ENA_REGS_RESET_MISS_INTERRUPT = 14, 24 24 ENA_REGS_RESET_SUSPECTED_POLL_STARVATION = 15, 25 + ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED = 16, 25 26 }; 26 27 27 28 /* ena_registers offsets */