Skip to content

Commit 9af9b89

Browse files
committed
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/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 5fcc17d + 1cc0a47 commit 9af9b89

File tree

7 files changed

+73
-28
lines changed

7 files changed

+73
-28
lines changed

drivers/net/ethernet/amazon/ena/ena_com.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
/* ENA adaptive interrupt moderation settings */
4848

4949
#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
5151
#define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1
5252

5353
#define ENA_HASH_KEY_SIZE 40
@@ -305,6 +305,8 @@ struct ena_com_dev {
305305
u16 stats_func; /* Selected function for extended statistic dump */
306306
u16 stats_queue; /* Selected queue for extended statistic dump */
307307

308+
u32 ena_min_poll_delay_us;
309+
308310
struct ena_com_mmio_read mmio_read;
309311

310312
struct ena_rss rss;
@@ -325,8 +327,6 @@ struct ena_com_dev {
325327
struct ena_intr_moder_entry *intr_moder_tbl;
326328

327329
struct ena_com_llq_info llq_info;
328-
329-
u32 ena_min_poll_delay_us;
330330
};
331331

332332
struct ena_com_dev_get_features_ctx {

drivers/net/ethernet/amazon/ena/ena_eth_com.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,42 +229,55 @@ static struct ena_eth_io_rx_cdesc_base *
229229
idx * io_cq->cdesc_entry_size_in_bytes);
230230
}
231231

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)
234235
{
236+
u16 count = io_cq->cur_rx_pkt_cdesc_count, head_masked;
235237
struct ena_eth_io_rx_cdesc_base *cdesc;
236-
u16 count = 0, head_masked;
237238
u32 last = 0;
238239

239240
do {
241+
u32 status;
242+
240243
cdesc = ena_com_get_next_rx_cdesc(io_cq);
241244
if (!cdesc)
242245
break;
246+
status = READ_ONCE(cdesc->status);
243247

244248
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+
}
245258
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;
248261
} while (!last);
249262

250263
if (last) {
251264
*first_cdesc_idx = io_cq->cur_rx_pkt_cdesc_start_idx;
252-
count += io_cq->cur_rx_pkt_cdesc_count;
253265

254266
head_masked = io_cq->head & (io_cq->q_depth - 1);
255267

268+
*num_descs = count;
256269
io_cq->cur_rx_pkt_cdesc_count = 0;
257270
io_cq->cur_rx_pkt_cdesc_start_idx = head_masked;
258271

259272
netdev_dbg(ena_com_io_cq_to_ena_dev(io_cq)->net_device,
260273
"ENA q_id: %d packets were completed. first desc idx %u descs# %d\n",
261274
io_cq->qid, *first_cdesc_idx, count);
262275
} else {
263-
io_cq->cur_rx_pkt_cdesc_count += count;
264-
count = 0;
276+
io_cq->cur_rx_pkt_cdesc_count = count;
277+
*num_descs = 0;
265278
}
266279

267-
return count;
280+
return 0;
268281
}
269282

270283
static int ena_com_create_meta(struct ena_com_io_sq *io_sq,
@@ -539,10 +552,14 @@ int ena_com_rx_pkt(struct ena_com_io_cq *io_cq,
539552
u16 cdesc_idx = 0;
540553
u16 nb_hw_desc;
541554
u16 i = 0;
555+
int rc;
542556

543557
WARN(io_cq->direction != ENA_COM_IO_QUEUE_DIRECTION_RX, "wrong Q type");
544558

545-
nb_hw_desc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx);
559+
rc = ena_com_cdesc_rx_pkt_get(io_cq, &cdesc_idx, &nb_hw_desc);
560+
if (unlikely(rc != 0))
561+
return -EFAULT;
562+
546563
if (nb_hw_desc == 0) {
547564
ena_rx_ctx->descs = nb_hw_desc;
548565
return 0;

drivers/net/ethernet/amazon/ena/ena_eth_com.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct ena_com_rx_ctx {
4747
bool frag;
4848
u32 hash;
4949
u16 descs;
50-
int max_bufs;
50+
u16 max_bufs;
5151
u8 pkt_offset;
5252
};
5353

drivers/net/ethernet/amazon/ena/ena_ethtool.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ static const struct ena_stats ena_stats_global_strings[] = {
4949
ENA_STAT_GLOBAL_ENTRY(interface_up),
5050
ENA_STAT_GLOBAL_ENTRY(interface_down),
5151
ENA_STAT_GLOBAL_ENTRY(admin_q_pause),
52+
ENA_STAT_GLOBAL_ENTRY(reset_fail),
5253
};
5354

5455
static const struct ena_stats ena_stats_eni_strings[] = {
@@ -459,10 +460,18 @@ static void ena_get_drvinfo(struct net_device *dev,
459460
struct ethtool_drvinfo *info)
460461
{
461462
struct ena_adapter *adapter = netdev_priv(dev);
462-
463-
strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
464-
strscpy(info->bus_info, pci_name(adapter->pdev),
465-
sizeof(info->bus_info));
463+
ssize_t ret = 0;
464+
465+
ret = strscpy(info->driver, DRV_MODULE_NAME, sizeof(info->driver));
466+
if (ret < 0)
467+
netif_dbg(adapter, drv, dev,
468+
"module name will be truncated, status = %zd\n", ret);
469+
470+
ret = strscpy(info->bus_info, pci_name(adapter->pdev),
471+
sizeof(info->bus_info));
472+
if (ret < 0)
473+
netif_dbg(adapter, drv, dev,
474+
"bus info will be truncated, status = %zd\n", ret);
466475
}
467476

468477
static void ena_get_ringparam(struct net_device *netdev,

drivers/net/ethernet/amazon/ena/ena_netdev.c

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ MODULE_DEVICE_TABLE(pci, ena_pci_tbl);
4242

4343
static int ena_rss_init_default(struct ena_adapter *adapter);
4444
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);
4646
static int ena_restore_device(struct ena_adapter *adapter);
4747

4848
static void ena_tx_timeout(struct net_device *dev, unsigned int txqueue)
@@ -1347,6 +1347,8 @@ static int ena_clean_rx_irq(struct ena_ring *rx_ring, struct napi_struct *napi,
13471347
if (rc == -ENOSPC) {
13481348
ena_increase_stat(&rx_ring->rx_stats.bad_desc_num, 1, &rx_ring->syncp);
13491349
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);
13501352
} else {
13511353
ena_increase_stat(&rx_ring->rx_stats.bad_req_id, 1,
13521354
&rx_ring->syncp);
@@ -2701,6 +2703,7 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pd
27012703
{
27022704
struct device *dev = &pdev->dev;
27032705
struct ena_admin_host_info *host_info;
2706+
ssize_t ret;
27042707
int rc;
27052708

27062709
/* Allocate only the host info */
@@ -2715,11 +2718,19 @@ static void ena_config_host_info(struct ena_com_dev *ena_dev, struct pci_dev *pd
27152718
host_info->bdf = pci_dev_id(pdev);
27162719
host_info->os_type = ENA_ADMIN_OS_LINUX;
27172720
host_info->kernel_ver = LINUX_VERSION_CODE;
2718-
strscpy(host_info->kernel_ver_str, utsname()->version,
2719-
sizeof(host_info->kernel_ver_str) - 1);
2721+
ret = strscpy(host_info->kernel_ver_str, utsname()->version,
2722+
sizeof(host_info->kernel_ver_str));
2723+
if (ret < 0)
2724+
dev_dbg(dev,
2725+
"kernel version string will be truncated, status = %zd\n", ret);
2726+
27202727
host_info->os_dist = 0;
2721-
strscpy(host_info->os_dist_str, utsname()->release,
2722-
sizeof(host_info->os_dist_str));
2728+
ret = strscpy(host_info->os_dist_str, utsname()->release,
2729+
sizeof(host_info->os_dist_str));
2730+
if (ret < 0)
2731+
dev_dbg(dev,
2732+
"OS distribution string will be truncated, status = %zd\n", ret);
2733+
27232734
host_info->driver_version =
27242735
(DRV_MODULE_GEN_MAJOR) |
27252736
(DRV_MODULE_GEN_MINOR << ENA_ADMIN_HOST_INFO_MINOR_SHIFT) |
@@ -3235,14 +3246,15 @@ static int ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *adapter)
32353246
return rc;
32363247
}
32373248

3238-
static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
3249+
static int ena_destroy_device(struct ena_adapter *adapter, bool graceful)
32393250
{
32403251
struct net_device *netdev = adapter->netdev;
32413252
struct ena_com_dev *ena_dev = adapter->ena_dev;
32423253
bool dev_up;
3254+
int rc = 0;
32433255

32443256
if (!test_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags))
3245-
return;
3257+
return 0;
32463258

32473259
netif_carrier_off(netdev);
32483260

@@ -3260,7 +3272,7 @@ static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
32603272
* and device is up, ena_down() already reset the device.
32613273
*/
32623274
if (!(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags) && dev_up))
3263-
ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason);
3275+
rc = ena_com_dev_reset(adapter->ena_dev, adapter->reset_reason);
32643276

32653277
ena_free_mgmnt_irq(adapter);
32663278

@@ -3279,6 +3291,8 @@ static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
32793291

32803292
clear_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags);
32813293
clear_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags);
3294+
3295+
return rc;
32823296
}
32833297

32843298
static int ena_restore_device(struct ena_adapter *adapter)
@@ -3355,14 +3369,17 @@ static int ena_restore_device(struct ena_adapter *adapter)
33553369

33563370
static void ena_fw_reset_device(struct work_struct *work)
33573371
{
3372+
int rc = 0;
3373+
33583374
struct ena_adapter *adapter =
33593375
container_of(work, struct ena_adapter, reset_task);
33603376

33613377
rtnl_lock();
33623378

33633379
if (likely(test_bit(ENA_FLAG_TRIGGER_RESET, &adapter->flags))) {
3364-
ena_destroy_device(adapter, false);
3365-
ena_restore_device(adapter);
3380+
rc |= ena_destroy_device(adapter, false);
3381+
rc |= ena_restore_device(adapter);
3382+
adapter->dev_stats.reset_fail += !!rc;
33663383

33673384
dev_err(&adapter->pdev->dev, "Device reset completed successfully\n");
33683385
}

drivers/net/ethernet/amazon/ena/ena_netdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ struct ena_stats_dev {
290290
u64 admin_q_pause;
291291
u64 rx_drops;
292292
u64 tx_drops;
293+
u64 reset_fail;
293294
};
294295

295296
enum ena_flags_t {

drivers/net/ethernet/amazon/ena/ena_regs_defs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ enum ena_regs_reset_reason_types {
2222
ENA_REGS_RESET_GENERIC = 13,
2323
ENA_REGS_RESET_MISS_INTERRUPT = 14,
2424
ENA_REGS_RESET_SUSPECTED_POLL_STARVATION = 15,
25+
ENA_REGS_RESET_RX_DESCRIPTOR_MALFORMED = 16,
2526
};
2627

2728
/* ena_registers offsets */

0 commit comments

Comments
 (0)