aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSunil Goutham <sgoutham@cavium.com>2017-05-02 09:06:51 -0400
committerDavid S. Miller <davem@davemloft.net>2017-05-02 15:41:20 -0400
commit5e848e4c5d77438e126c97702ec3bea477f550a9 (patch)
tree247528970eb0abd195b637de07eabdf45034e13f
parent5836b4429777bf57ca8fc02b154263aa54d97508 (diff)
net: thunderx: Optimize RBDR descriptor handling
Receive buffer's physical address or iova will anyway not go beyond 49bits, since it is the max supported HW address. As per perf, updating bitfields i.e buf_addr:42 in RBDR descriptor entry consumes lots of cpu cycles, hence changed it to a 64bit field with alignment requirements taken care of. Signed-off-by: Sunil Goutham <sgoutham@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_queues.c8
-rw-r--r--drivers/net/ethernet/cavium/thunder/q_struct.h10
2 files changed, 5 insertions, 13 deletions
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index 12f9709bb180..dfc85a169127 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -257,7 +257,7 @@ static int nicvf_init_rbdr(struct nicvf *nic, struct rbdr *rbdr,
257 } 257 }
258 258
259 desc = GET_RBDR_DESC(rbdr, idx); 259 desc = GET_RBDR_DESC(rbdr, idx);
260 desc->buf_addr = (u64)rbuf >> NICVF_RCV_BUF_ALIGN; 260 desc->buf_addr = (u64)rbuf & ~(NICVF_RCV_BUF_ALIGN_BYTES - 1);
261 } 261 }
262 262
263 nicvf_get_page(nic); 263 nicvf_get_page(nic);
@@ -286,7 +286,7 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
286 /* Release page references */ 286 /* Release page references */
287 while (head != tail) { 287 while (head != tail) {
288 desc = GET_RBDR_DESC(rbdr, head); 288 desc = GET_RBDR_DESC(rbdr, head);
289 buf_addr = ((u64)desc->buf_addr) << NICVF_RCV_BUF_ALIGN; 289 buf_addr = desc->buf_addr;
290 phys_addr = nicvf_iova_to_phys(nic, buf_addr); 290 phys_addr = nicvf_iova_to_phys(nic, buf_addr);
291 dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN, 291 dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN,
292 DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC); 292 DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
@@ -297,7 +297,7 @@ static void nicvf_free_rbdr(struct nicvf *nic, struct rbdr *rbdr)
297 } 297 }
298 /* Release buffer of tail desc */ 298 /* Release buffer of tail desc */
299 desc = GET_RBDR_DESC(rbdr, tail); 299 desc = GET_RBDR_DESC(rbdr, tail);
300 buf_addr = ((u64)desc->buf_addr) << NICVF_RCV_BUF_ALIGN; 300 buf_addr = desc->buf_addr;
301 phys_addr = nicvf_iova_to_phys(nic, buf_addr); 301 phys_addr = nicvf_iova_to_phys(nic, buf_addr);
302 dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN, 302 dma_unmap_page_attrs(&nic->pdev->dev, buf_addr, RCV_FRAG_LEN,
303 DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC); 303 DMA_FROM_DEVICE, DMA_ATTR_SKIP_CPU_SYNC);
@@ -364,7 +364,7 @@ refill:
364 break; 364 break;
365 365
366 desc = GET_RBDR_DESC(rbdr, tail); 366 desc = GET_RBDR_DESC(rbdr, tail);
367 desc->buf_addr = (u64)rbuf >> NICVF_RCV_BUF_ALIGN; 367 desc->buf_addr = (u64)rbuf & ~(NICVF_RCV_BUF_ALIGN_BYTES - 1);
368 refill_rb_cnt--; 368 refill_rb_cnt--;
369 new_rb++; 369 new_rb++;
370 } 370 }
diff --git a/drivers/net/ethernet/cavium/thunder/q_struct.h b/drivers/net/ethernet/cavium/thunder/q_struct.h
index f36347237a54..e47205aa87ea 100644
--- a/drivers/net/ethernet/cavium/thunder/q_struct.h
+++ b/drivers/net/ethernet/cavium/thunder/q_struct.h
@@ -359,15 +359,7 @@ union cq_desc_t {
359}; 359};
360 360
361struct rbdr_entry_t { 361struct rbdr_entry_t {
362#if defined(__BIG_ENDIAN_BITFIELD) 362 u64 buf_addr;
363 u64 rsvd0:15;
364 u64 buf_addr:42;
365 u64 cache_align:7;
366#elif defined(__LITTLE_ENDIAN_BITFIELD)
367 u64 cache_align:7;
368 u64 buf_addr:42;
369 u64 rsvd0:15;
370#endif
371}; 363};
372 364
373/* TCP reassembly context */ 365/* TCP reassembly context */