| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (c) 2016 Chelsio Communications, Inc. |
|---|
| 3 | | - * |
|---|
| 4 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 5 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 6 | | - * published by the Free Software Foundation. |
|---|
| 7 | 4 | */ |
|---|
| 8 | 5 | |
|---|
| 9 | 6 | #include <linux/workqueue.h> |
|---|
| .. | .. |
|---|
| 286 | 283 | } |
|---|
| 287 | 284 | } |
|---|
| 288 | 285 | |
|---|
| 289 | | -static bool cxgbit_lock_sock(struct cxgbit_sock *csk) |
|---|
| 290 | | -{ |
|---|
| 291 | | - spin_lock_bh(&csk->lock); |
|---|
| 292 | | - |
|---|
| 293 | | - if (before(csk->write_seq, csk->snd_una + csk->snd_win)) |
|---|
| 294 | | - csk->lock_owner = true; |
|---|
| 295 | | - |
|---|
| 296 | | - spin_unlock_bh(&csk->lock); |
|---|
| 297 | | - |
|---|
| 298 | | - return csk->lock_owner; |
|---|
| 299 | | -} |
|---|
| 300 | | - |
|---|
| 301 | 286 | static void cxgbit_unlock_sock(struct cxgbit_sock *csk) |
|---|
| 302 | 287 | { |
|---|
| 303 | 288 | struct sk_buff_head backlogq; |
|---|
| .. | .. |
|---|
| 327 | 312 | { |
|---|
| 328 | 313 | int ret = 0; |
|---|
| 329 | 314 | |
|---|
| 330 | | - wait_event_interruptible(csk->ack_waitq, cxgbit_lock_sock(csk)); |
|---|
| 315 | + spin_lock_bh(&csk->lock); |
|---|
| 316 | + csk->lock_owner = true; |
|---|
| 317 | + spin_unlock_bh(&csk->lock); |
|---|
| 331 | 318 | |
|---|
| 332 | 319 | if (unlikely((csk->com.state != CSK_STATE_ESTABLISHED) || |
|---|
| 333 | 320 | signal_pending(current))) { |
|---|
| 334 | 321 | __kfree_skb(skb); |
|---|
| 335 | 322 | __skb_queue_purge(&csk->ppodq); |
|---|
| 336 | 323 | ret = -1; |
|---|
| 337 | | - spin_lock_bh(&csk->lock); |
|---|
| 338 | | - if (csk->lock_owner) { |
|---|
| 339 | | - spin_unlock_bh(&csk->lock); |
|---|
| 340 | | - goto unlock; |
|---|
| 341 | | - } |
|---|
| 342 | | - spin_unlock_bh(&csk->lock); |
|---|
| 343 | | - return ret; |
|---|
| 324 | + goto unlock; |
|---|
| 344 | 325 | } |
|---|
| 345 | 326 | |
|---|
| 346 | 327 | csk->write_seq += skb->len + |
|---|
| .. | .. |
|---|
| 901 | 882 | skb_frag_t *dfrag = &ssi->frags[pdu_cb->dfrag_idx]; |
|---|
| 902 | 883 | |
|---|
| 903 | 884 | sg_init_table(&ccmd->sg, 1); |
|---|
| 904 | | - sg_set_page(&ccmd->sg, dfrag->page.p, skb_frag_size(dfrag), |
|---|
| 905 | | - dfrag->page_offset); |
|---|
| 906 | | - get_page(dfrag->page.p); |
|---|
| 885 | + sg_set_page(&ccmd->sg, skb_frag_page(dfrag), |
|---|
| 886 | + skb_frag_size(dfrag), skb_frag_off(dfrag)); |
|---|
| 887 | + get_page(skb_frag_page(dfrag)); |
|---|
| 907 | 888 | |
|---|
| 908 | 889 | cmd->se_cmd.t_data_sg = &ccmd->sg; |
|---|
| 909 | 890 | cmd->se_cmd.t_data_nents = 1; |
|---|
| .. | .. |
|---|
| 959 | 940 | target_put_sess_cmd(&cmd->se_cmd); |
|---|
| 960 | 941 | return 0; |
|---|
| 961 | 942 | } else if (cmd->unsolicited_data) { |
|---|
| 962 | | - iscsit_set_unsoliticed_dataout(cmd); |
|---|
| 943 | + iscsit_set_unsolicited_dataout(cmd); |
|---|
| 963 | 944 | } |
|---|
| 964 | 945 | |
|---|
| 965 | 946 | } else if (immed_ret == IMMEDIATE_DATA_ERL1_CRC_FAILURE) { |
|---|
| .. | .. |
|---|
| 1016 | 997 | struct scatterlist *sg_start; |
|---|
| 1017 | 998 | struct iscsi_conn *conn = csk->conn; |
|---|
| 1018 | 999 | struct iscsi_cmd *cmd = NULL; |
|---|
| 1000 | + struct cxgbit_cmd *ccmd; |
|---|
| 1001 | + struct cxgbi_task_tag_info *ttinfo; |
|---|
| 1019 | 1002 | struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_rx_pdu_cb(csk->skb); |
|---|
| 1020 | 1003 | struct iscsi_data *hdr = (struct iscsi_data *)pdu_cb->hdr; |
|---|
| 1021 | 1004 | u32 data_offset = be32_to_cpu(hdr->offset); |
|---|
| 1022 | | - u32 data_len = pdu_cb->dlen; |
|---|
| 1005 | + u32 data_len = ntoh24(hdr->dlength); |
|---|
| 1023 | 1006 | int rc, sg_nents, sg_off; |
|---|
| 1024 | 1007 | bool dcrc_err = false; |
|---|
| 1025 | 1008 | |
|---|
| 1026 | 1009 | if (pdu_cb->flags & PDUCBF_RX_DDP_CMP) { |
|---|
| 1027 | 1010 | u32 offset = be32_to_cpu(hdr->offset); |
|---|
| 1028 | 1011 | u32 ddp_data_len; |
|---|
| 1029 | | - u32 payload_length = ntoh24(hdr->dlength); |
|---|
| 1030 | 1012 | bool success = false; |
|---|
| 1031 | 1013 | |
|---|
| 1032 | 1014 | cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, 0); |
|---|
| .. | .. |
|---|
| 1041 | 1023 | cmd->data_sn = be32_to_cpu(hdr->datasn); |
|---|
| 1042 | 1024 | |
|---|
| 1043 | 1025 | rc = __iscsit_check_dataout_hdr(conn, (unsigned char *)hdr, |
|---|
| 1044 | | - cmd, payload_length, &success); |
|---|
| 1026 | + cmd, data_len, &success); |
|---|
| 1045 | 1027 | if (rc < 0) |
|---|
| 1046 | 1028 | return rc; |
|---|
| 1047 | 1029 | else if (!success) |
|---|
| .. | .. |
|---|
| 1077 | 1059 | sg_nents = max(1UL, DIV_ROUND_UP(skip + data_len, PAGE_SIZE)); |
|---|
| 1078 | 1060 | |
|---|
| 1079 | 1061 | cxgbit_skb_copy_to_sg(csk->skb, sg_start, sg_nents, skip); |
|---|
| 1062 | + } |
|---|
| 1063 | + |
|---|
| 1064 | + ccmd = iscsit_priv_cmd(cmd); |
|---|
| 1065 | + ttinfo = &ccmd->ttinfo; |
|---|
| 1066 | + |
|---|
| 1067 | + if (ccmd->release && ttinfo->sgl && |
|---|
| 1068 | + (cmd->se_cmd.data_length == (cmd->write_data_done + data_len))) { |
|---|
| 1069 | + struct cxgbit_device *cdev = csk->com.cdev; |
|---|
| 1070 | + struct cxgbi_ppm *ppm = cdev2ppm(cdev); |
|---|
| 1071 | + |
|---|
| 1072 | + dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, ttinfo->nents, |
|---|
| 1073 | + DMA_FROM_DEVICE); |
|---|
| 1074 | + ttinfo->nents = 0; |
|---|
| 1075 | + ttinfo->sgl = NULL; |
|---|
| 1080 | 1076 | } |
|---|
| 1081 | 1077 | |
|---|
| 1082 | 1078 | check_payload: |
|---|
| .. | .. |
|---|
| 1405 | 1401 | pdu_cb->ddigest, pdu_cb->frags); |
|---|
| 1406 | 1402 | for (i = 0; i < ssi->nr_frags; i++) |
|---|
| 1407 | 1403 | pr_info("skb 0x%p, frag %d, off %u, sz %u.\n", |
|---|
| 1408 | | - skb, i, ssi->frags[i].page_offset, ssi->frags[i].size); |
|---|
| 1404 | + skb, i, skb_frag_off(&ssi->frags[i]), |
|---|
| 1405 | + skb_frag_size(&ssi->frags[i])); |
|---|
| 1409 | 1406 | } |
|---|
| 1410 | 1407 | |
|---|
| 1411 | 1408 | static void cxgbit_lro_hskb_reset(struct cxgbit_sock *csk) |
|---|
| .. | .. |
|---|
| 1449 | 1446 | hpdu_cb->frags++; |
|---|
| 1450 | 1447 | hpdu_cb->hfrag_idx = hfrag_idx; |
|---|
| 1451 | 1448 | |
|---|
| 1452 | | - len = hssi->frags[hfrag_idx].size; |
|---|
| 1449 | + len = skb_frag_size(&hssi->frags[hfrag_idx]); |
|---|
| 1453 | 1450 | hskb->len += len; |
|---|
| 1454 | 1451 | hskb->data_len += len; |
|---|
| 1455 | 1452 | hskb->truesize += len; |
|---|
| .. | .. |
|---|
| 1469 | 1466 | |
|---|
| 1470 | 1467 | get_page(skb_frag_page(&hssi->frags[dfrag_idx])); |
|---|
| 1471 | 1468 | |
|---|
| 1472 | | - len += hssi->frags[dfrag_idx].size; |
|---|
| 1469 | + len += skb_frag_size(&hssi->frags[dfrag_idx]); |
|---|
| 1473 | 1470 | |
|---|
| 1474 | 1471 | hssi->nr_frags++; |
|---|
| 1475 | 1472 | hpdu_cb->frags++; |
|---|