From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752520AbcIIFw7 (ORCPT ); Fri, 9 Sep 2016 01:52:59 -0400 Received: from p3plsmtps2ded02.prod.phx3.secureserver.net ([208.109.80.59]:48974 "EHLO p3plsmtps2ded02.prod.phx3.secureserver.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751347AbcIIFwy (ORCPT ); Fri, 9 Sep 2016 01:52:54 -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, alexng@microsoft.com Cc: Vivek yadav , "K. Y. Srinivasan" Subject: [PATCH 1/1] Drivers: hv: hv_util: Avoid dynamic allocation in time synch Date: Fri, 9 Sep 2016 00:42:30 -0700 Message-Id: <1473406950-18751-1-git-send-email-kys@exchange.microsoft.com> X-Mailer: git-send-email 1.7.4.1 Reply-To: kys@microsoft.com X-CMAE-Envelope: MS4wfOHS1f4CX/t2lNfZBkRBZKeOD7zgfCPfGNbVjro70GswZ8+eyoQxRUNTlw6SFzWANPlolP/sPotTKakBhTeatgeND1bgRfdmZZ+FsWKP/aVKwmjpOr1A Fokw39FtpITSUYoy5SXWgvyIO0yMRffVFq4pCnFPbKXPA8ix16hChTUei0URkvMZiXjj72xzwtfAsyMUE3qIlYH6pn9DY5Bw4rFwuekZmw6mwqhR6tI+kJJ3 b4cm+PJCXZ+vRBH5QGdkaIopzrM/GSlZ+v9Ae09e2/i2FKaiWyWXMo3wXGqKOHrPStDkBYsJjD6j5akJeOW9k/PWLz/VSqhZ+RWOcWL6gyVU+DD24toEf0X8 DmEoD1ME9FfEIRPrJmkgqFmr2qWtWyck7H61JdyqWeVXsxvhyWl9GP724UgI2cISkKEB2QDT3WQx8cATIAHpiWtkiAlPtFZ9/1uX05Px2gNXZyMhtzIKL3iQ pROY3RFuAPB/hRSJCVq9XJikoleccmCD+isCL3wx9PMUTQIWcgR2qpm5enI= 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