Author: sephe
Date: Mon Jan 25 05:33:18 2016
New Revision: 294705
URL: https://svnweb.freebsd.org/changeset/base/294705

Log:
  hyperv/vmbus: Avoid extra copy of page information.
  
  The page information array could contain up to 32 elements (i.e. 512B).
  And on network side w/ TSO, 11+ (176B+) elements, i.e. ~44K TSO packet,
  in the page information array is quite common.
  
  This saves us some cpu cycles.
  
  Reviewed by:          adrian, delphij
  Approved by:          adrian (mentor)
  Sponsored by:         Microsoft OSTC
  Differential Revision:        https://reviews.freebsd.org/D4992

Modified:
  head/sys/dev/hyperv/vmbus/hv_channel.c

Modified: head/sys/dev/hyperv/vmbus/hv_channel.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_channel.c      Mon Jan 25 05:28:19 2016        
(r294704)
+++ head/sys/dev/hyperv/vmbus/hv_channel.c      Mon Jan 25 05:33:18 2016        
(r294705)
@@ -665,11 +665,11 @@ hv_vmbus_channel_send_packet_pagebuffer(
 {
 
        int                                     ret = 0;
-       int                                     i = 0;
        boolean_t                               need_sig;
        uint32_t                                packet_len;
+       uint32_t                                page_buflen;
        uint32_t                                packetLen_aligned;
-       hv_vmbus_sg_buffer_list                 buffer_list[3];
+       hv_vmbus_sg_buffer_list                 buffer_list[4];
        hv_vmbus_channel_packet_page_buffer     desc;
        uint32_t                                descSize;
        uint64_t                                alignedData = 0;
@@ -681,36 +681,33 @@ hv_vmbus_channel_send_packet_pagebuffer(
         * Adjust the size down since hv_vmbus_channel_packet_page_buffer
         *  is the largest size we support
         */
-       descSize = sizeof(hv_vmbus_channel_packet_page_buffer) -
-                       ((HV_MAX_PAGE_BUFFER_COUNT - page_count) *
-                       sizeof(hv_vmbus_page_buffer));
-       packet_len = descSize + buffer_len;
+       descSize = __offsetof(hv_vmbus_channel_packet_page_buffer, range);
+       page_buflen = sizeof(hv_vmbus_page_buffer) * page_count;
+       packet_len = descSize + page_buflen + buffer_len;
        packetLen_aligned = HV_ALIGN_UP(packet_len, sizeof(uint64_t));
 
        /* Setup the descriptor */
        desc.type = HV_VMBUS_PACKET_TYPE_DATA_USING_GPA_DIRECT;
        desc.flags = HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED;
-       desc.data_offset8 = descSize >> 3; /* in 8-bytes granularity */
+       /* in 8-bytes granularity */
+       desc.data_offset8 = (descSize + page_buflen) >> 3;
        desc.length8 = (uint16_t) (packetLen_aligned >> 3);
        desc.transaction_id = request_id;
        desc.range_count = page_count;
 
-       for (i = 0; i < page_count; i++) {
-               desc.range[i].length = page_buffers[i].length;
-               desc.range[i].offset = page_buffers[i].offset;
-               desc.range[i].pfn = page_buffers[i].pfn;
-       }
-
        buffer_list[0].data = &desc;
        buffer_list[0].length = descSize;
 
-       buffer_list[1].data = buffer;
-       buffer_list[1].length = buffer_len;
+       buffer_list[1].data = page_buffers;
+       buffer_list[1].length = page_buflen;
 
-       buffer_list[2].data = &alignedData;
-       buffer_list[2].length = packetLen_aligned - packet_len;
+       buffer_list[2].data = buffer;
+       buffer_list[2].length = buffer_len;
 
-       ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 3,
+       buffer_list[3].data = &alignedData;
+       buffer_list[3].length = packetLen_aligned - packet_len;
+
+       ret = hv_ring_buffer_write(&channel->outbound, buffer_list, 4,
            &need_sig);
 
        /* TODO: We should determine if this is optional */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to