Author: sephe
Date: Fri Mar  4 07:00:37 2016
New Revision: 296380
URL: https://svnweb.freebsd.org/changeset/base/296380

Log:
  hyperv/hn: Pass channel to send done callbacks.
  
  Mainly to strigent the data packet send done check.
  
  MFC after:    2 weeks
  Sponsored by: Microsoft OSTC

Modified:
  head/sys/dev/hyperv/netvsc/hv_net_vsc.c
  head/sys/dev/hyperv/netvsc/hv_net_vsc.h
  head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
  head/sys/dev/hyperv/netvsc/hv_rndis_filter.c

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Mar  4 06:52:11 2016        
(r296379)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Mar  4 07:00:37 2016        
(r296380)
@@ -64,7 +64,7 @@ static int  hv_nv_destroy_send_buffer(ne
 static int  hv_nv_destroy_rx_buffer(netvsc_dev *net_dev);
 static int  hv_nv_connect_to_vsp(struct hv_device *device);
 static void hv_nv_on_send_completion(netvsc_dev *net_dev,
-    struct hv_device *device, hv_vm_packet_descriptor *pkt);
+    struct hv_device *device, struct hv_vmbus_channel *, 
hv_vm_packet_descriptor *pkt);
 static void hv_nv_on_receive_completion(struct hv_vmbus_channel *chan,
     uint64_t tid, uint32_t status);
 static void hv_nv_on_receive(netvsc_dev *net_dev,
@@ -787,7 +787,8 @@ hv_nv_on_device_remove(struct hv_device 
  */
 static void
 hv_nv_on_send_completion(netvsc_dev *net_dev,
-    struct hv_device *device, hv_vm_packet_descriptor *pkt)
+    struct hv_device *device, struct hv_vmbus_channel *chan,
+    hv_vm_packet_descriptor *pkt)
 {
        nvsp_msg *nvsp_msg_pkt;
        netvsc_packet *net_vsc_pkt;
@@ -838,7 +839,7 @@ hv_nv_on_send_completion(netvsc_dev *net
                        }
                        
                        /* Notify the layer above us */
-                       net_vsc_pkt->compl.send.on_send_completion(
+                       net_vsc_pkt->compl.send.on_send_completion(chan,
                            net_vsc_pkt->compl.send.send_completion_context);
 
                }
@@ -1065,7 +1066,8 @@ hv_nv_on_channel_callback(void *xchan)
                                desc = (hv_vm_packet_descriptor *)buffer;
                                switch (desc->type) {
                                case HV_VMBUS_PACKET_TYPE_COMPLETION:
-                                       hv_nv_on_send_completion(net_dev, 
device, desc);
+                                       hv_nv_on_send_completion(net_dev, 
device,
+                                           chan, desc);
                                        break;
                                case 
HV_VMBUS_PACKET_TYPE_DATA_USING_TRANSFER_PAGES:
                                        hv_nv_on_receive(net_dev, device, chan, 
desc);

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Fri Mar  4 06:52:11 2016        
(r296379)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.h     Fri Mar  4 07:00:37 2016        
(r296380)
@@ -1077,8 +1077,9 @@ typedef struct netvsc_dev_ {
        uint32_t                                
vrss_send_table[VRSS_SEND_TABLE_SIZE];
 } netvsc_dev;
 
+struct hv_vmbus_channel;
 
-typedef void (*pfn_on_send_rx_completion)(void *);
+typedef void (*pfn_on_send_rx_completion)(struct hv_vmbus_channel *, void *);
 
 #define NETVSC_DEVICE_RING_BUFFER_SIZE (128 * PAGE_SIZE)
 #define NETVSC_PACKET_MAXPAGE          32 
@@ -1172,8 +1173,6 @@ struct hn_rx_ring {
 #define HN_TRUST_HCSUM_TCP     0x0002
 #define HN_TRUST_HCSUM_UDP     0x0004
 
-struct hv_vmbus_channel;
-
 struct hn_tx_ring {
 #ifndef HN_USE_TXDESC_BUFRING
        struct mtx      hn_txlist_spin;

Modified: head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Fri Mar  4 06:52:11 
2016        (r296379)
+++ head/sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c  Fri Mar  4 07:00:37 
2016        (r296380)
@@ -721,7 +721,7 @@ hn_txdesc_hold(struct hn_txdesc *txd)
 }
 
 static void
-hn_tx_done(void *xpkt)
+hn_tx_done(struct hv_vmbus_channel *chan, void *xpkt)
 {
        netvsc_packet *packet = xpkt;
        struct hn_txdesc *txd;
@@ -731,6 +731,11 @@ hn_tx_done(void *xpkt)
            packet->compl.send.send_completion_tid;
 
        txr = txd->txr;
+       KASSERT(txr->hn_chan == chan,
+           ("channel mismatch, on channel%u, should be channel%u",
+            chan->offer_msg.offer.sub_channel_index,
+            txr->hn_chan->offer_msg.offer.sub_channel_index));
+
        txr->hn_has_txeof = 1;
        hn_txdesc_put(txr, txd);
 }

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Fri Mar  4 06:52:11 
2016        (r296379)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Fri Mar  4 07:00:37 
2016        (r296380)
@@ -69,8 +69,8 @@ static int  hv_rf_set_packet_filter(rndi
 static int  hv_rf_init_device(rndis_device *device);
 static int  hv_rf_open_device(rndis_device *device);
 static int  hv_rf_close_device(rndis_device *device);
-static void hv_rf_on_send_request_completion(void *context);
-static void hv_rf_on_send_request_halt_completion(void *context);
+static void hv_rf_on_send_request_completion(struct hv_vmbus_channel *, void 
*context);
+static void hv_rf_on_send_request_halt_completion(struct hv_vmbus_channel *, 
void *context);
 int
 hv_rf_send_offload_request(struct hv_device *device,
     rndis_offload_params *offloads);
@@ -1158,7 +1158,8 @@ hv_rf_on_close(struct hv_device *device)
  * RNDIS filter on send request completion callback
  */
 static void 
-hv_rf_on_send_request_completion(void *context)
+hv_rf_on_send_request_completion(struct hv_vmbus_channel *chan __unused,
+    void *context __unused)
 {
 }
 
@@ -1166,7 +1167,8 @@ hv_rf_on_send_request_completion(void *c
  * RNDIS filter on send request (halt only) completion callback
  */
 static void 
-hv_rf_on_send_request_halt_completion(void *context)
+hv_rf_on_send_request_halt_completion(struct hv_vmbus_channel *chan __unused,
+    void *context)
 {
        rndis_request *request = context;
 
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to