Author: sephe
Date: Fri Aug 12 08:29:26 2016
New Revision: 304002
URL: https://svnweb.freebsd.org/changeset/base/304002

Log:
  hyperv/hn: Simplify RXBUF disconnection.
  
  MFC after:    1 week
  Sponsored by: Microsoft
  Differential Revision:        https://reviews.freebsd.org/D7472

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

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Aug 12 08:21:02 2016        
(r304001)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Aug 12 08:29:26 2016        
(r304002)
@@ -384,32 +384,24 @@ cleanup:
 static int
 hv_nv_destroy_rx_buffer(netvsc_dev *net_dev)
 {
-       nvsp_msg *revoke_pkt;
        int ret = 0;
 
-       /*
-        * If we got a section count, it means we received a
-        * send_rx_buf_complete msg 
-        * (ie sent nvsp_msg_1_type_send_rx_buf msg) therefore,
-        * we need to send a revoke msg here
-        */
        if (net_dev->rx_section_count) {
-               /* Send the revoke receive buffer */
-               revoke_pkt = &net_dev->revoke_packet;
-               memset(revoke_pkt, 0, sizeof(nvsp_msg));
+               struct hn_nvs_rxbuf_disconn disconn;
 
-               revoke_pkt->hdr.msg_type = nvsp_msg_1_type_revoke_rx_buf;
-               revoke_pkt->msgs.vers_1_msgs.revoke_rx_buf.id =
-                   NETVSC_RECEIVE_BUFFER_ID;
+               /*
+                * Disconnect RXBUF from NVS.
+                */
+               memset(&disconn, 0, sizeof(disconn));
+               disconn.nvs_type = HN_NVS_TYPE_RXBUF_DISCONN;
+               disconn.nvs_sig = HN_NVS_RXBUF_SIG;
 
                ret = vmbus_chan_send(net_dev->sc->hn_prichan,
-                   VMBUS_CHANPKT_TYPE_INBAND, 0, revoke_pkt, sizeof(nvsp_msg),
+                   VMBUS_CHANPKT_TYPE_INBAND, 0, &disconn, sizeof(disconn),
                    (uint64_t)(uintptr_t)&hn_send_ctx_none);
-               /*
-                * If we failed here, we might as well return and have a leak 
-                * rather than continue and a bugchk
-                */
                if (ret != 0) {
+                       if_printf(net_dev->sc->hn_ifp,
+                           "send rxbuf disconn failed: %d\n", ret);
                        return (ret);
                }
                net_dev->rx_section_count = 0;

Modified: head/sys/dev/hyperv/netvsc/if_hnreg.h
==============================================================================
--- head/sys/dev/hyperv/netvsc/if_hnreg.h       Fri Aug 12 08:21:02 2016        
(r304001)
+++ head/sys/dev/hyperv/netvsc/if_hnreg.h       Fri Aug 12 08:29:26 2016        
(r304002)
@@ -42,6 +42,7 @@
 #define HN_NVS_TYPE_NDIS_INIT          100
 #define HN_NVS_TYPE_RXBUF_CONN         101
 #define HN_NVS_TYPE_RXBUF_CONNRESP     102
+#define HN_NVS_TYPE_RXBUF_DISCONN      103
 #define HN_NVS_TYPE_CHIM_CONN          104
 #define HN_NVS_TYPE_CHIM_CONNRESP      105
 #define HN_NVS_TYPE_NDIS_CONF          125
@@ -112,6 +113,14 @@ struct hn_nvs_rxbuf_connresp {
        struct hn_nvs_rxbuf_sect nvs_sect[];
 } __packed;
 
+/* No response */
+struct hn_nvs_rxbuf_disconn {
+       uint32_t        nvs_type;       /* HN_NVS_TYPE_RXBUF_DISCONN */
+       uint16_t        nvs_sig;        /* HN_NVS_RXBUF_SIG */
+       uint8_t         nvs_rsvd[26];
+} __packed;
+CTASSERT(sizeof(struct hn_nvs_rxbuf_disconn) >= HN_NVS_REQSIZE_MIN);
+
 struct hn_nvs_chim_conn {
        uint32_t        nvs_type;       /* HN_NVS_TYPE_CHIM_CONN */
        uint32_t        nvs_gpadl;      /* chimney buf vmbus GPADL */
_______________________________________________
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