Skip to content

Commit 195c3d4

Browse files
Bharat Bhushandavem330
authored andcommitted
octeontx2-pf: map skb data as device writeable
Crypto hardware need write permission for in-place encrypt or decrypt operation on skb-data to support IPsec crypto offload. That patch uses skb_unshare to make skb data writeable for ipsec crypto offload and map skb fragment memory as device read-write. Signed-off-by: Bharat Bhushan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7ea2745 commit 195c3d4

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

drivers/net/ethernet/marvell/octeontx2/nic/otx2_txrx.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <linux/bpf.h>
1212
#include <linux/bpf_trace.h>
1313
#include <net/ip6_checksum.h>
14+
#include <net/xfrm.h>
1415

1516
#include "otx2_reg.h"
1617
#include "otx2_common.h"
@@ -83,10 +84,17 @@ static unsigned int frag_num(unsigned int i)
8384
static dma_addr_t otx2_dma_map_skb_frag(struct otx2_nic *pfvf,
8485
struct sk_buff *skb, int seg, int *len)
8586
{
87+
enum dma_data_direction dir = DMA_TO_DEVICE;
8688
const skb_frag_t *frag;
8789
struct page *page;
8890
int offset;
8991

92+
/* Crypto hardware need write permission for ipsec crypto offload */
93+
if (unlikely(xfrm_offload(skb))) {
94+
dir = DMA_BIDIRECTIONAL;
95+
skb = skb_unshare(skb, GFP_ATOMIC);
96+
}
97+
9098
/* First segment is always skb->data */
9199
if (!seg) {
92100
page = virt_to_page(skb->data);
@@ -98,16 +106,22 @@ static dma_addr_t otx2_dma_map_skb_frag(struct otx2_nic *pfvf,
98106
offset = skb_frag_off(frag);
99107
*len = skb_frag_size(frag);
100108
}
101-
return otx2_dma_map_page(pfvf, page, offset, *len, DMA_TO_DEVICE);
109+
return otx2_dma_map_page(pfvf, page, offset, *len, dir);
102110
}
103111

104112
static void otx2_dma_unmap_skb_frags(struct otx2_nic *pfvf, struct sg_list *sg)
105113
{
114+
enum dma_data_direction dir = DMA_TO_DEVICE;
115+
struct sk_buff *skb = NULL;
106116
int seg;
107117

118+
skb = (struct sk_buff *)sg->skb;
119+
if (unlikely(xfrm_offload(skb)))
120+
dir = DMA_BIDIRECTIONAL;
121+
108122
for (seg = 0; seg < sg->num_segs; seg++) {
109123
otx2_dma_unmap_page(pfvf, sg->dma_addr[seg],
110-
sg->size[seg], DMA_TO_DEVICE);
124+
sg->size[seg], dir);
111125
}
112126
sg->num_segs = 0;
113127
}

0 commit comments

Comments
 (0)