Author: sephe
Date: Fri Feb  5 07:20:31 2016
New Revision: 295308
URL: https://svnweb.freebsd.org/changeset/base/295308

Log:
  hyperv: Use WAITOK in the places where we can wait
  
  And convert rndis non-hot path spinlock to mutex.
  
  Submitted by: Jun Su <junsu microsoft com>
  Reviewed by:  adrian, sephe
  Approved by:  adrian (mentor)
  MFC after:    1 week
  Sponsored by: Microsoft OSTC
  Differential Revision:        https://reviews.freebsd.org/D5081

Modified:
  head/sys/dev/hyperv/netvsc/hv_net_vsc.c
  head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
  head/sys/dev/hyperv/vmbus/hv_connection.c
  head/sys/dev/hyperv/vmbus/hv_hv.c
  head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c

Modified: head/sys/dev/hyperv/netvsc/hv_net_vsc.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Feb  5 07:09:58 2016        
(r295307)
+++ head/sys/dev/hyperv/netvsc/hv_net_vsc.c     Fri Feb  5 07:20:31 2016        
(r295308)
@@ -74,10 +74,7 @@ hv_nv_alloc_net_device(struct hv_device 
        netvsc_dev *net_dev;
        hn_softc_t *sc = device_get_softc(device->device);
 
-       net_dev = malloc(sizeof(netvsc_dev), M_NETVSC, M_NOWAIT | M_ZERO);
-       if (net_dev == NULL) {
-               return (NULL);
-       }
+       net_dev = malloc(sizeof(netvsc_dev), M_NETVSC, M_WAITOK | M_ZERO);
 
        net_dev->dev = device;
        net_dev->destroy = FALSE;
@@ -224,11 +221,7 @@ hv_nv_init_rx_buffer_with_net_vsp(struct
            init_pkt->msgs.vers_1_msgs.send_rx_buf_complete.num_sections;
 
        net_dev->rx_sections = malloc(net_dev->rx_section_count *
-           sizeof(nvsp_1_rx_buf_section), M_NETVSC, M_NOWAIT);
-       if (net_dev->rx_sections == NULL) {
-               ret = EINVAL;
-               goto cleanup;
-       }
+           sizeof(nvsp_1_rx_buf_section), M_NETVSC, M_WAITOK);
        memcpy(net_dev->rx_sections, 
            init_pkt->msgs.vers_1_msgs.send_rx_buf_complete.sections,
            net_dev->rx_section_count * sizeof(nvsp_1_rx_buf_section));
@@ -326,11 +319,7 @@ hv_nv_init_send_buffer_with_net_vsp(stru
            BITS_PER_LONG);
        net_dev->send_section_bitsmap =
            malloc(net_dev->bitsmap_words * sizeof(long), M_NETVSC,
-           M_NOWAIT | M_ZERO);
-       if (NULL == net_dev->send_section_bitsmap) {
-               ret = ENOMEM;
-               goto cleanup;
-       }
+           M_WAITOK | M_ZERO);
 
        goto exit;
 

Modified: head/sys/dev/hyperv/netvsc/hv_rndis_filter.c
==============================================================================
--- head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Fri Feb  5 07:09:58 
2016        (r295307)
+++ head/sys/dev/hyperv/netvsc/hv_rndis_filter.c        Fri Feb  5 07:20:31 
2016        (r295308)
@@ -135,12 +135,9 @@ hv_get_rndis_device(void)
 {
        rndis_device *device;
 
-       device = malloc(sizeof(rndis_device), M_NETVSC, M_NOWAIT | M_ZERO);
-       if (device == NULL) {
-               return (NULL);
-       }
+       device = malloc(sizeof(rndis_device), M_NETVSC, M_WAITOK | M_ZERO);
 
-       mtx_init(&device->req_lock, "HV-FRL", NULL, MTX_SPIN | MTX_RECURSE);
+       mtx_init(&device->req_lock, "HV-FRL", NULL, MTX_DEF);
 
        /* Same effect as STAILQ_HEAD_INITIALIZER() static initializer */
        STAILQ_INIT(&device->myrequest_list);
@@ -171,10 +168,7 @@ hv_rndis_request(rndis_device *device, u
        rndis_msg *rndis_mesg;
        rndis_set_request *set;
 
-       request = malloc(sizeof(rndis_request), M_NETVSC, M_NOWAIT | M_ZERO);
-       if (request == NULL) {
-               return (NULL);
-       }
+       request = malloc(sizeof(rndis_request), M_NETVSC, M_WAITOK | M_ZERO);
 
        sema_init(&request->wait_sema, 0, "rndis sema");
        
@@ -193,9 +187,9 @@ hv_rndis_request(rndis_device *device, u
        set->request_id += 1;
 
        /* Add to the request list */
-       mtx_lock_spin(&device->req_lock);
+       mtx_lock(&device->req_lock);
        STAILQ_INSERT_TAIL(&device->myrequest_list, request, mylist_entry);
-       mtx_unlock_spin(&device->req_lock);
+       mtx_unlock(&device->req_lock);
 
        return (request);
 }
@@ -206,14 +200,14 @@ hv_rndis_request(rndis_device *device, u
 static inline void
 hv_put_rndis_request(rndis_device *device, rndis_request *request)
 {
-       mtx_lock_spin(&device->req_lock);
+       mtx_lock(&device->req_lock);
        /* Fixme:  Has O(n) performance */
        /*
         * XXXKYS: Use Doubly linked lists.
         */
        STAILQ_REMOVE(&device->myrequest_list, request, rndis_request_,
            mylist_entry);
-       mtx_unlock_spin(&device->req_lock);
+       mtx_unlock(&device->req_lock);
 
        sema_destroy(&request->wait_sema);
        free(request, M_NETVSC);
@@ -270,7 +264,7 @@ hv_rf_receive_response(rndis_device *dev
        rndis_request *next_request;
        boolean_t found = FALSE;
 
-       mtx_lock_spin(&device->req_lock);
+       mtx_lock(&device->req_lock);
        request = STAILQ_FIRST(&device->myrequest_list);
        while (request != NULL) {
                /*
@@ -285,7 +279,7 @@ hv_rf_receive_response(rndis_device *dev
                next_request = STAILQ_NEXT(request, mylist_entry);
                request = next_request;
        }
-       mtx_unlock_spin(&device->req_lock);
+       mtx_unlock(&device->req_lock);
 
        if (found) {
                if (response->msg_len <= sizeof(rndis_msg)) {

Modified: head/sys/dev/hyperv/vmbus/hv_connection.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_connection.c   Fri Feb  5 07:09:58 2016        
(r295307)
+++ head/sys/dev/hyperv/vmbus/hv_connection.c   Fri Feb  5 07:20:31 2016        
(r295308)
@@ -88,8 +88,7 @@ hv_vmbus_negotiate_version(hv_vmbus_chan
        msg->monitor_page_1 = hv_get_phys_addr(
                hv_vmbus_g_connection.monitor_pages);
 
-       msg->monitor_page_2 =
-               hv_get_phys_addr(
+       msg->monitor_page_2 = hv_get_phys_addr(
                        ((uint8_t *) hv_vmbus_g_connection.monitor_pages
                        + PAGE_SIZE));
 
@@ -179,16 +178,9 @@ hv_vmbus_connect(void) {
         */
        hv_vmbus_g_connection.interrupt_page = contigmalloc(
                                        PAGE_SIZE, M_DEVBUF,
-                                       M_NOWAIT | M_ZERO, 0UL,
+                                       M_WAITOK | M_ZERO, 0UL,
                                        BUS_SPACE_MAXADDR,
                                        PAGE_SIZE, 0);
-       KASSERT(hv_vmbus_g_connection.interrupt_page != NULL,
-           ("Error VMBUS: malloc failed to allocate Channel"
-               " Request Event message!"));
-       if (hv_vmbus_g_connection.interrupt_page == NULL) {
-           ret = ENOMEM;
-           goto cleanup;
-       }
 
        hv_vmbus_g_connection.recv_interrupt_page =
                hv_vmbus_g_connection.interrupt_page;
@@ -204,28 +196,16 @@ hv_vmbus_connect(void) {
        hv_vmbus_g_connection.monitor_pages = contigmalloc(
                2 * PAGE_SIZE,
                M_DEVBUF,
-               M_NOWAIT | M_ZERO,
+               M_WAITOK | M_ZERO,
                0UL,
                BUS_SPACE_MAXADDR,
                PAGE_SIZE,
                0);
-       KASSERT(hv_vmbus_g_connection.monitor_pages != NULL,
-           ("Error VMBUS: malloc failed to allocate Monitor Pages!"));
-       if (hv_vmbus_g_connection.monitor_pages == NULL) {
-           ret = ENOMEM;
-           goto cleanup;
-       }
 
        msg_info = (hv_vmbus_channel_msg_info*)
                malloc(sizeof(hv_vmbus_channel_msg_info) +
                        sizeof(hv_vmbus_channel_initiate_contact),
-                       M_DEVBUF, M_NOWAIT | M_ZERO);
-       KASSERT(msg_info != NULL,
-           ("Error VMBUS: malloc failed for Initiate Contact message!"));
-       if (msg_info == NULL) {
-           ret = ENOMEM;
-           goto cleanup;
-       }
+                       M_DEVBUF, M_WAITOK | M_ZERO);
 
        hv_vmbus_g_connection.channels = malloc(sizeof(hv_vmbus_channel*) *
                HV_CHANNEL_MAX_COUNT,
@@ -301,19 +281,11 @@ hv_vmbus_connect(void) {
 int
 hv_vmbus_disconnect(void) {
        int                      ret = 0;
-       hv_vmbus_channel_unload* msg;
+       hv_vmbus_channel_unload  msg;
 
-       msg = malloc(sizeof(hv_vmbus_channel_unload),
-           M_DEVBUF, M_NOWAIT | M_ZERO);
-       KASSERT(msg != NULL,
-           ("Error VMBUS: malloc failed to allocate Channel Unload Msg!"));
-       if (msg == NULL)
-           return (ENOMEM);
-
-       msg->message_type = HV_CHANNEL_MESSAGE_UNLOAD;
-
-       ret = hv_vmbus_post_message(msg, sizeof(hv_vmbus_channel_unload));
+       msg.message_type = HV_CHANNEL_MESSAGE_UNLOAD;
 
+       ret = hv_vmbus_post_message(&msg, sizeof(hv_vmbus_channel_unload));
 
        contigfree(hv_vmbus_g_connection.interrupt_page, PAGE_SIZE, M_DEVBUF);
 
@@ -322,8 +294,6 @@ hv_vmbus_disconnect(void) {
        free(hv_vmbus_g_connection.channels, M_DEVBUF);
        hv_vmbus_g_connection.connect_state = HV_DISCONNECTED;
 
-       free(msg, M_DEVBUF);
-
        return (ret);
 }
 

Modified: head/sys/dev/hyperv/vmbus/hv_hv.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_hv.c   Fri Feb  5 07:09:58 2016        
(r295307)
+++ head/sys/dev/hyperv/vmbus/hv_hv.c   Fri Feb  5 07:20:31 2016        
(r295308)
@@ -189,11 +189,7 @@ hv_vmbus_init(void) 
         * See if the hypercall page is already set
         */
        hypercall_msr.as_uint64_t = rdmsr(HV_X64_MSR_HYPERCALL);
-       virt_addr = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT | M_ZERO);
-       KASSERT(virt_addr != NULL,
-           ("Error VMBUS: malloc failed to allocate page during init!"));
-       if (virt_addr == NULL)
-           goto cleanup;
+       virt_addr = malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
 
        hypercall_msr.u.enable = 1;
        hypercall_msr.u.guest_physical_address =

Modified: head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c
==============================================================================
--- head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Fri Feb  5 07:09:58 
2016        (r295307)
+++ head/sys/dev/hyperv/vmbus/hv_vmbus_drv_freebsd.c    Fri Feb  5 07:20:31 
2016        (r295308)
@@ -291,12 +291,7 @@ hv_vmbus_child_device_create(
         * Allocate the new child device
         */
        child_dev = malloc(sizeof(hv_device), M_DEVBUF,
-                       M_NOWAIT |  M_ZERO);
-       KASSERT(child_dev != NULL,
-           ("Error VMBUS: malloc failed to allocate hv_device!"));
-
-       if (child_dev == NULL)
-               return (NULL);
+                       M_WAITOK |  M_ZERO);
 
        child_dev->channel = channel;
        memcpy(&child_dev->class_id, &type, sizeof(hv_guid));
@@ -548,12 +543,7 @@ vmbus_bus_init(void)
                 */
                for(i = 0; i < 2; i++) {
                        setup_args.page_buffers[2 * j + i] =
-                               malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT | M_ZERO);
-                       if (setup_args.page_buffers[2 * j + i] == NULL) {
-                               KASSERT(setup_args.page_buffers[2 * j + i] != 
NULL,
-                                       ("Error VMBUS: malloc failed!"));
-                               goto cleanup1;
-                       }
+                               malloc(PAGE_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
                }
        }
 
_______________________________________________
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