From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934314AbcIPOMp (ORCPT ); Fri, 16 Sep 2016 10:12:45 -0400 Received: from p3plsmtps2ded04.prod.phx3.secureserver.net ([208.109.80.198]:48812 "EHLO p3plsmtps2ded04.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934989AbcIPOLQ (ORCPT ); Fri, 16 Sep 2016 10:11:16 -0400 x-originating-ip: 72.167.245.219 From: kys@exchange.microsoft.com To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, devel@linuxdriverproject.org, olaf@aepfle.de, apw@canonical.com, vkuznets@redhat.com, jasowang@redhat.com, leann.ogasawara@canonical.com Cc: Vivek yadav , "K. Y. Srinivasan" Subject: [PATCH 1/1] Drivers: hv: hv_util: Avoid dynamic allocation in time synch Date: Fri, 16 Sep 2016 09:01:16 -0700 Message-Id: <1474041678-17701-1-git-send-email-kys@exchange.microsoft.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1474041638-17658-1-git-send-email-kys@exchange.microsoft.com> References: <1474041638-17658-1-git-send-email-kys@exchange.microsoft.com> Reply-To: kys@microsoft.com X-CMAE-Envelope: MS4wfC4LWQyEfRQuUp21F1WzV1JCT/16f/6Ovn4sDxAXacrDGADIwVMpnQlb5O0xCN8ol1H2O3sWpw6E0Bcxjh0T1/r6+r+KNFbD9GzdHwkOqm+3ENG6ePGQ n7mgy8bZ66prDfzFa+e0PU41GmO9UfACMdASGiD19bTxUlBw54bX5H3vGXAHULhyFyhibwb3h9YtD+zBFjEn2rlsLQIDy4E+MEsSKoXa0znFONZ27GWaLDxS cKj6UjZZPy2687vLaol/VkXaRg5Xhq9Dd6DpDkXDYVDiBhwJqI1vZ0jSQToNwkG5Mu9vyB67mQ813mbCGm87EAikCyajNh2npLx07mAMwkASmvO0fYb5GKl0 ijLE8ay7bGzXxLmeSwDI2Bl6rxQEDZzPTZ1CNciBayx+fcSuaO5+akwK9RxaUjZxIect26Q8lvppFXWKqX7qg/9YT7v+eWnUoHyH5izB2gfFwfDYXKgWYQ1w vZWVDVFa6aSDL+8t Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Vivek yadav Under stress, we have seen allocation failure in time synch code. Avoid this dynamic allocation. Signed-off-by: Vivek Yadav Signed-off-by: K. Y. Srinivasan --- drivers/hv/hv_util.c | 39 ++++++++++++++++++++++++++++----------- 1 files changed, 28 insertions(+), 11 deletions(-) diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index 6286bdc..4aa3cb6 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c @@ -64,9 +64,14 @@ static struct hv_util_service util_shutdown = { .util_cb = shutdown_onchannelcallback, }; +static int hv_timesync_init(struct hv_util_service *srv); +static void hv_timesync_deinit(void); + static void timesync_onchannelcallback(void *context); static struct hv_util_service util_timesynch = { .util_cb = timesync_onchannelcallback, + .util_init = hv_timesync_init, + .util_deinit = hv_timesync_deinit, }; static void heartbeat_onchannelcallback(void *context); @@ -201,7 +206,6 @@ static void hv_set_host_time(struct work_struct *work) host_ts = ns_to_timespec(host_tns); do_settimeofday(&host_ts); - kfree(wrk); } /* @@ -217,22 +221,24 @@ static void hv_set_host_time(struct work_struct *work) * typically used as a hint to the guest. The guest is under no obligation * to discipline the clock. */ +static struct adj_time_work wrk; static inline void adj_guesttime(u64 hosttime, u64 reftime, u8 flags) { - struct adj_time_work *wrk; - wrk = kmalloc(sizeof(struct adj_time_work), GFP_ATOMIC); - if (wrk == NULL) + /* + * This check is safe since we are executing in the + * interrupt context and time synch messages arre always + * delivered on the same CPU. + */ + if (work_pending(&wrk.work)) return; - wrk->host_time = hosttime; - wrk->ref_time = reftime; - wrk->flags = flags; + wrk.host_time = hosttime; + wrk.ref_time = reftime; + wrk.flags = flags; if ((flags & (ICTIMESYNCFLAG_SYNC | ICTIMESYNCFLAG_SAMPLE)) != 0) { - INIT_WORK(&wrk->work, hv_set_host_time); - schedule_work(&wrk->work); - } else - kfree(wrk); + schedule_work(&wrk.work); + } } /* @@ -457,6 +463,17 @@ static struct hv_driver util_drv = { .remove = util_remove, }; +static int hv_timesync_init(struct hv_util_service *srv) +{ + INIT_WORK(&wrk.work, hv_set_host_time); + return 0; +} + +static void hv_timesync_deinit(void) +{ + cancel_work_sync(&wrk.work); +} + static int __init init_hyperv_utils(void) { pr_info("Registering HyperV Utility Driver\n"); -- 1.7.4.1