Skip to content

Commit 0c3b7f4

Browse files
committed
Merge branch 'ionic-memory-usage-fixes'
Shannon Nelson says: ==================== ionic: memory usage fixes This patchset addresses some memory leaks and incorrect io reads. ==================== Link: https://lore.kernel.org/r/20201022235531.65956-1-snelson@pensando.io Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 4f3391c + 0c32a28 commit 0c3b7f4

File tree

8 files changed

+40
-55
lines changed

8 files changed

+40
-55
lines changed

drivers/net/ethernet/pensando/ionic/ionic_dev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ int ionic_set_vf_config(struct ionic *ionic, int vf, u8 attr, u8 *data)
333333
union ionic_dev_cmd cmd = {
334334
.vf_setattr.opcode = IONIC_CMD_VF_SETATTR,
335335
.vf_setattr.attr = attr,
336-
.vf_setattr.vf_index = vf,
336+
.vf_setattr.vf_index = cpu_to_le16(vf),
337337
};
338338
int err;
339339

@@ -391,7 +391,7 @@ void ionic_dev_cmd_queue_identify(struct ionic_dev *idev,
391391
{
392392
union ionic_dev_cmd cmd = {
393393
.q_identify.opcode = IONIC_CMD_Q_IDENTIFY,
394-
.q_identify.lif_type = lif_type,
394+
.q_identify.lif_type = cpu_to_le16(lif_type),
395395
.q_identify.type = qtype,
396396
.q_identify.ver = qver,
397397
};

drivers/net/ethernet/pensando/ionic/ionic_dev.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ struct ionic_dev_bar {
2929
int res_index;
3030
};
3131

32+
#ifndef __CHECKER__
3233
/* Registers */
3334
static_assert(sizeof(struct ionic_intr) == 32);
3435

@@ -119,6 +120,7 @@ static_assert(sizeof(struct ionic_vf_setattr_cmd) == 64);
119120
static_assert(sizeof(struct ionic_vf_setattr_comp) == 16);
120121
static_assert(sizeof(struct ionic_vf_getattr_cmd) == 64);
121122
static_assert(sizeof(struct ionic_vf_getattr_comp) == 16);
123+
#endif /* __CHECKER__ */
122124

123125
struct ionic_devinfo {
124126
u8 asic_type;

drivers/net/ethernet/pensando/ionic/ionic_fw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ static void ionic_dev_cmd_firmware_download(struct ionic_dev *idev, u64 addr,
2727
{
2828
union ionic_dev_cmd cmd = {
2929
.fw_download.opcode = IONIC_CMD_FW_DOWNLOAD,
30-
.fw_download.offset = offset,
31-
.fw_download.addr = addr,
32-
.fw_download.length = length
30+
.fw_download.offset = cpu_to_le32(offset),
31+
.fw_download.addr = cpu_to_le64(addr),
32+
.fw_download.length = cpu_to_le32(length),
3333
};
3434

3535
ionic_dev_cmd_go(idev, &cmd);

drivers/net/ethernet/pensando/ionic/ionic_lif.c

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,7 +1656,6 @@ static void ionic_txrx_deinit(struct ionic_lif *lif)
16561656
if (lif->rxqcqs) {
16571657
for (i = 0; i < lif->nxqs && lif->rxqcqs[i]; i++) {
16581658
ionic_lif_qcq_deinit(lif, lif->rxqcqs[i]);
1659-
ionic_rx_flush(&lif->rxqcqs[i]->cq);
16601659
ionic_rx_empty(&lif->rxqcqs[i]->q);
16611660
}
16621661
}
@@ -1915,11 +1914,11 @@ static int ionic_get_vf_config(struct net_device *netdev,
19151914
ret = -EINVAL;
19161915
} else {
19171916
ivf->vf = vf;
1918-
ivf->vlan = ionic->vfs[vf].vlanid;
1917+
ivf->vlan = le16_to_cpu(ionic->vfs[vf].vlanid);
19191918
ivf->qos = 0;
19201919
ivf->spoofchk = ionic->vfs[vf].spoofchk;
19211920
ivf->linkstate = ionic->vfs[vf].linkstate;
1922-
ivf->max_tx_rate = ionic->vfs[vf].maxrate;
1921+
ivf->max_tx_rate = le32_to_cpu(ionic->vfs[vf].maxrate);
19231922
ivf->trusted = ionic->vfs[vf].trusted;
19241923
ether_addr_copy(ivf->mac, ionic->vfs[vf].macaddr);
19251924
}
@@ -2019,7 +2018,7 @@ static int ionic_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan,
20192018
ret = ionic_set_vf_config(ionic, vf,
20202019
IONIC_VF_ATTR_VLAN, (u8 *)&vlan);
20212020
if (!ret)
2022-
ionic->vfs[vf].vlanid = vlan;
2021+
ionic->vfs[vf].vlanid = cpu_to_le16(vlan);
20232022
}
20242023

20252024
up_write(&ionic->vf_op_lock);
@@ -2048,7 +2047,7 @@ static int ionic_set_vf_rate(struct net_device *netdev, int vf,
20482047
ret = ionic_set_vf_config(ionic, vf,
20492048
IONIC_VF_ATTR_RATE, (u8 *)&tx_max);
20502049
if (!ret)
2051-
lif->ionic->vfs[vf].maxrate = tx_max;
2050+
lif->ionic->vfs[vf].maxrate = cpu_to_le32(tx_max);
20522051
}
20532052

20542053
up_write(&ionic->vf_op_lock);
@@ -2981,14 +2980,14 @@ void ionic_lif_unregister(struct ionic_lif *lif)
29812980

29822981
static void ionic_lif_queue_identify(struct ionic_lif *lif)
29832982
{
2983+
union ionic_q_identity __iomem *q_ident;
29842984
struct ionic *ionic = lif->ionic;
2985-
union ionic_q_identity *q_ident;
29862985
struct ionic_dev *idev;
29872986
int qtype;
29882987
int err;
29892988

29902989
idev = &lif->ionic->idev;
2991-
q_ident = (union ionic_q_identity *)&idev->dev_cmd_regs->data;
2990+
q_ident = (union ionic_q_identity __iomem *)&idev->dev_cmd_regs->data;
29922991

29932992
for (qtype = 0; qtype < ARRAY_SIZE(ionic_qtype_versions); qtype++) {
29942993
struct ionic_qtype_info *qti = &lif->qtype_info[qtype];
@@ -3011,14 +3010,14 @@ static void ionic_lif_queue_identify(struct ionic_lif *lif)
30113010
ionic_qtype_versions[qtype]);
30123011
err = ionic_dev_cmd_wait(ionic, DEVCMD_TIMEOUT);
30133012
if (!err) {
3014-
qti->version = q_ident->version;
3015-
qti->supported = q_ident->supported;
3016-
qti->features = le64_to_cpu(q_ident->features);
3017-
qti->desc_sz = le16_to_cpu(q_ident->desc_sz);
3018-
qti->comp_sz = le16_to_cpu(q_ident->comp_sz);
3019-
qti->sg_desc_sz = le16_to_cpu(q_ident->sg_desc_sz);
3020-
qti->max_sg_elems = le16_to_cpu(q_ident->max_sg_elems);
3021-
qti->sg_desc_stride = le16_to_cpu(q_ident->sg_desc_stride);
3013+
qti->version = readb(&q_ident->version);
3014+
qti->supported = readb(&q_ident->supported);
3015+
qti->features = readq(&q_ident->features);
3016+
qti->desc_sz = readw(&q_ident->desc_sz);
3017+
qti->comp_sz = readw(&q_ident->comp_sz);
3018+
qti->sg_desc_sz = readw(&q_ident->sg_desc_sz);
3019+
qti->max_sg_elems = readw(&q_ident->max_sg_elems);
3020+
qti->sg_desc_stride = readw(&q_ident->sg_desc_stride);
30223021
}
30233022
mutex_unlock(&ionic->dev_cmd_lock);
30243023

drivers/net/ethernet/pensando/ionic/ionic_main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ int ionic_adminq_post_wait(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
311311

312312
static void ionic_dev_cmd_clean(struct ionic *ionic)
313313
{
314-
union ionic_dev_cmd_regs *regs = ionic->idev.dev_cmd_regs;
314+
union __iomem ionic_dev_cmd_regs *regs = ionic->idev.dev_cmd_regs;
315315

316316
iowrite32(0, &regs->doorbell);
317317
memset_io(&regs->cmd, 0, sizeof(regs->cmd));
@@ -333,7 +333,7 @@ int ionic_dev_cmd_wait(struct ionic *ionic, unsigned long max_seconds)
333333
*/
334334
max_wait = jiffies + (max_seconds * HZ);
335335
try_again:
336-
opcode = idev->dev_cmd_regs->cmd.cmd.opcode;
336+
opcode = readb(&idev->dev_cmd_regs->cmd.cmd.opcode);
337337
start_time = jiffies;
338338
do {
339339
done = ionic_dev_cmd_done(idev);

drivers/net/ethernet/pensando/ionic/ionic_stats.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ extern const int ionic_num_stats_grps;
4949
(*((u64 *)(((u8 *)(base_ptr)) + (desc_ptr)->offset)))
5050

5151
#define IONIC_READ_STAT_LE64(base_ptr, desc_ptr) \
52-
__le64_to_cpu(*((u64 *)(((u8 *)(base_ptr)) + (desc_ptr)->offset)))
52+
__le64_to_cpu(*((__le64 *)(((u8 *)(base_ptr)) + (desc_ptr)->offset)))
5353

5454
struct ionic_stat_desc {
5555
char name[ETH_GSTRING_LEN];

drivers/net/ethernet/pensando/ionic/ionic_txrx.c

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ static void ionic_rx_clean(struct ionic_queue *q,
200200
if (likely(netdev->features & NETIF_F_RXCSUM)) {
201201
if (comp->csum_flags & IONIC_RXQ_COMP_CSUM_F_CALC) {
202202
skb->ip_summed = CHECKSUM_COMPLETE;
203-
skb->csum = (__wsum)le16_to_cpu(comp->csum);
203+
skb->csum = (__force __wsum)le16_to_cpu(comp->csum);
204204
stats->csum_complete++;
205205
}
206206
} else {
@@ -253,19 +253,6 @@ static bool ionic_rx_service(struct ionic_cq *cq, struct ionic_cq_info *cq_info)
253253
return true;
254254
}
255255

256-
void ionic_rx_flush(struct ionic_cq *cq)
257-
{
258-
struct ionic_dev *idev = &cq->lif->ionic->idev;
259-
u32 work_done;
260-
261-
work_done = ionic_cq_service(cq, cq->num_descs,
262-
ionic_rx_service, NULL, NULL);
263-
264-
if (work_done)
265-
ionic_intr_credits(idev->intr_ctrl, cq->bound_intr->index,
266-
work_done, IONIC_INTR_CRED_RESET_COALESCE);
267-
}
268-
269256
static int ionic_rx_page_alloc(struct ionic_queue *q,
270257
struct ionic_page_info *page_info)
271258
{
@@ -413,22 +400,20 @@ static void ionic_rx_fill_cb(void *arg)
413400
void ionic_rx_empty(struct ionic_queue *q)
414401
{
415402
struct ionic_desc_info *desc_info;
416-
struct ionic_rxq_desc *desc;
417-
unsigned int i;
418-
u16 idx;
419-
420-
idx = q->tail_idx;
421-
while (idx != q->head_idx) {
422-
desc_info = &q->info[idx];
423-
desc = desc_info->desc;
424-
desc->addr = 0;
425-
desc->len = 0;
403+
struct ionic_page_info *page_info;
404+
unsigned int i, j;
426405

427-
for (i = 0; i < desc_info->npages; i++)
428-
ionic_rx_page_free(q, &desc_info->pages[i]);
406+
for (i = 0; i < q->num_descs; i++) {
407+
desc_info = &q->info[i];
408+
for (j = 0; j < IONIC_RX_MAX_SG_ELEMS + 1; j++) {
409+
page_info = &desc_info->pages[j];
410+
if (page_info->page)
411+
ionic_rx_page_free(q, page_info);
412+
}
429413

414+
desc_info->npages = 0;
415+
desc_info->cb = NULL;
430416
desc_info->cb_arg = NULL;
431-
idx = (idx + 1) & (q->num_descs - 1);
432417
}
433418
}
434419

@@ -812,6 +797,7 @@ static int ionic_tx_tso(struct ionic_queue *q, struct sk_buff *skb)
812797
skb_frag_t *frag;
813798
bool start, done;
814799
bool outer_csum;
800+
dma_addr_t addr;
815801
bool has_vlan;
816802
u16 desc_len;
817803
u8 desc_nsge;
@@ -893,11 +879,10 @@ static int ionic_tx_tso(struct ionic_queue *q, struct sk_buff *skb)
893879
if (frag_left > 0) {
894880
len = min(frag_left, left);
895881
frag_left -= len;
896-
elem->addr =
897-
cpu_to_le64(ionic_tx_map_frag(q, frag,
898-
offset, len));
899-
if (dma_mapping_error(dev, elem->addr))
882+
addr = ionic_tx_map_frag(q, frag, offset, len);
883+
if (dma_mapping_error(dev, addr))
900884
goto err_out_abort;
885+
elem->addr = cpu_to_le64(addr);
901886
elem->len = cpu_to_le16(len);
902887
elem++;
903888
desc_nsge++;

drivers/net/ethernet/pensando/ionic/ionic_txrx.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#ifndef _IONIC_TXRX_H_
55
#define _IONIC_TXRX_H_
66

7-
void ionic_rx_flush(struct ionic_cq *cq);
87
void ionic_tx_flush(struct ionic_cq *cq);
98

109
void ionic_rx_fill(struct ionic_queue *q);

0 commit comments

Comments
 (0)