From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40812C48BD6 for ; Wed, 26 Jun 2019 11:28:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 12AB72080C for ; Wed, 26 Jun 2019 11:28:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1561548513; bh=Rx1WkGoiSEWh2wSDBDE2RSmbZjM1VyJ2Sb77lEjvA2w=; h=References:In-Reply-To:From:Date:Subject:To:Cc:List-ID:From; b=AylrDByi0nNKgY0NBEiryHoe4c/4mF57U9eKCkV3aif+3jVE3aV6i0N9jyn108FHO vZld5DavWtg7lsIhGHMLminP2GDjTG/ybS6GgZXV/BjsdXF/ri9oZoE7fw+wiuVh0Z cvc8qgG43ktqgcUT+61DvUi+UxGgzMCr9+JqVevI= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727323AbfFZL2b convert rfc822-to-8bit (ORCPT ); Wed, 26 Jun 2019 07:28:31 -0400 Received: from mail-ot1-f66.google.com ([209.85.210.66]:42749 "EHLO mail-ot1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726339AbfFZL2b (ORCPT ); Wed, 26 Jun 2019 07:28:31 -0400 Received: by mail-ot1-f66.google.com with SMTP id l15so2119547otn.9; Wed, 26 Jun 2019 04:28:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=zYG7+FYrQci0B0NIIaV4SdyVIkXx7HP7jsA5/CTPT+A=; b=I/rVUbKcJWx0fApH7NgpK6+ISwu3DE1elJmg+JSChHT5MddeovLDMcyCNgMsvF8L3V x0hldkNCghWWU4eFQfXRRC0jwZtLFcnIUNZPXrFckHL4NrQdVkkCyls+82x3i+rUtp5V 4j4WmRF8xVeF0AjlP5CPuMIKy2WUzTjIizmvGsJQdzUGo/B5MVQty3855y9tLGsf8IyA MHho5/17RwhTMyt3vCXJYwYJknCcPizUmh+G88iI3FaewxgAEYNnrBdRQLb8/4mtBvWa EJk1iTE5LTMfujhzApk9a3qnzsdLf9Wy5dlTWLaR5Xh7FRTTzqW8ONWwyjD8sA/OYgxs LT3A== X-Gm-Message-State: APjAAAWPMA82e1z6z6aBm9mXpacR1GSoy1biySEA77/lbDUww3tDNv89 cNMLcx3taCTUXLxUNJ2knGhcYm3DKe9lGxPEvOzgsbEg X-Google-Smtp-Source: APXvYqxQcfGkDZskFmpDKI+mK6sXWnA1QxcoJlpLtksnfosbfzd0ZwAqux1kiyfOCsazXPoyKgzI+/UQgzyr5VyCpbU= X-Received: by 2002:a9d:6959:: with SMTP id p25mr2713084oto.118.1561548510328; Wed, 26 Jun 2019 04:28:30 -0700 (PDT) MIME-Version: 1.0 References: <20190625113244.18146-1-daniel.lezcano@linaro.org> <20190625113244.18146-2-daniel.lezcano@linaro.org> <20190626025831.jmyzyypxr6ezpbtu@vireshk-i7> <20190626063716.cechnzsb75q5lclr@vireshk-i7> <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> In-Reply-To: <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> From: "Rafael J. Wysocki" Date: Wed, 26 Jun 2019 13:28:19 +0200 Message-ID: Subject: Re: [PATCH V3 2/3] thermal/drivers/cpu_cooling: Unregister with the policy To: Daniel Lezcano Cc: "Rafael J. Wysocki" , Viresh Kumar , "Rafael J. Wysocki" , Eduardo Valentin , Linux Kernel Mailing List , Sudeep Holla , Amit Daniel Kachhap , Javi Merino , Zhang Rui , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Keerthy , "open list:CPU FREQUENCY DRIVERS - ARM BIG LITTLE" , "moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" , "open list:TI BANDGAP AND THERMAL DRIVER" Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jun 26, 2019 at 12:19 PM Daniel Lezcano wrote: > > On 26/06/2019 11:06, Rafael J. Wysocki wrote: > > On Wed, Jun 26, 2019 at 8:37 AM Viresh Kumar wrote: > >> > >> On 26-06-19, 08:02, Daniel Lezcano wrote: > >>> On 26/06/2019 04:58, Viresh Kumar wrote: > >>>> On 25-06-19, 13:32, Daniel Lezcano wrote: > >>>>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > >>>>> index aee024e42618..f07454249fbc 100644 > >>>>> --- a/drivers/cpufreq/cpufreq.c > >>>>> +++ b/drivers/cpufreq/cpufreq.c > >>>>> @@ -1379,8 +1379,8 @@ static int cpufreq_online(unsigned int cpu) > >>>>> cpufreq_driver->ready(policy); > >>>>> > >>>>> if (cpufreq_thermal_control_enabled(cpufreq_driver)) > >>>>> - policy->cdev = of_cpufreq_cooling_register(policy); > >>>>> - > >>>>> + of_cpufreq_cooling_register(policy); > >>>>> + > >>>> > >>>> We don't need any error checking here anymore ? > >>> > >>> There was no error checking initially. This comment and the others below > >>> are for an additional patch IMO, not a change in this one. > >> > >> right, but ... > >> > >>>>> -void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) > >>>>> +void cpufreq_cooling_unregister(struct cpufreq_policy *policy) > >>>>> { > >>>>> struct cpufreq_cooling_device *cpufreq_cdev; > >>>>> bool last; > >>>>> > >>>>> - if (!cdev) > >>>>> - return; > >> > >> we used to return without any errors from here. Now we will have > >> problems if regsitering fails for some reason. > > > > Specifically, the last cpufreq_cdev in the list will be unregistered > > AFAICS, and without removing it from the list for that matter, which > > isn't what the caller wants. > > Indeed, > > What about the resulting code above: > > void __cpufreq_cooling_unregister(struct cpufreq_cooling_device > *cpufreq_cdev, int last) > { > /* Unregister the notifier for the last cpufreq cooling device */ > if (last) > cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block, > CPUFREQ_POLICY_NOTIFIER); > Doesn't the notifier need to be unregistered under cooling_list_lock ? > thermal_cooling_device_unregister(cpufreq_cdev->cdev); > ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); > kfree(cpufreq_cdev->idle_time); > kfree(cpufreq_cdev); > } > > /** > > * cpufreq_cooling_unregister - function to remove cpufreq cooling > device. > * @cdev: thermal cooling device pointer. > > * > > * This interface function unregisters the "thermal-cpufreq-%x" cooling > device. > */ > void cpufreq_cooling_unregister(struct cpufreq_policy *policy) > { > struct cpufreq_cooling_device *cpufreq_cdev; > bool last; > > mutex_lock(&cooling_list_lock); > list_for_each_entry(cpufreq_cdev, &cpufreq_cdev_list, node) { > if (cpufreq_cdev->policy == policy) { > list_del(&cpufreq_cdev->node); > last = list_empty(&cpufreq_cdev_list); > break; > } > } > mutex_unlock(&cooling_list_lock); > > if (cpufreq_cdev->policy == policy) > __cpufreq_cooling_unregister(cpufreq_cdev, last); > } > EXPORT_SYMBOL_GPL(cpufreq_cooling_unregister); > > > > > -- > Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: Facebook | > Twitter | > Blog > From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: Re: [PATCH V3 2/3] thermal/drivers/cpu_cooling: Unregister with the policy Date: Wed, 26 Jun 2019 13:28:19 +0200 Message-ID: References: <20190625113244.18146-1-daniel.lezcano@linaro.org> <20190625113244.18146-2-daniel.lezcano@linaro.org> <20190626025831.jmyzyypxr6ezpbtu@vireshk-i7> <20190626063716.cechnzsb75q5lclr@vireshk-i7> <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8BIT Return-path: In-Reply-To: <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> Sender: linux-kernel-owner@vger.kernel.org To: Daniel Lezcano Cc: "Rafael J. Wysocki" , Viresh Kumar , "Rafael J. Wysocki" , Eduardo Valentin , Linux Kernel Mailing List , Sudeep Holla , Amit Daniel Kachhap , Javi Merino , Zhang Rui , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Keerthy , "open list:CPU FREQUENCY DRIVERS - ARM BIG LITTLE" , "moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" List-Id: linux-omap@vger.kernel.org On Wed, Jun 26, 2019 at 12:19 PM Daniel Lezcano wrote: > > On 26/06/2019 11:06, Rafael J. Wysocki wrote: > > On Wed, Jun 26, 2019 at 8:37 AM Viresh Kumar wrote: > >> > >> On 26-06-19, 08:02, Daniel Lezcano wrote: > >>> On 26/06/2019 04:58, Viresh Kumar wrote: > >>>> On 25-06-19, 13:32, Daniel Lezcano wrote: > >>>>> diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c > >>>>> index aee024e42618..f07454249fbc 100644 > >>>>> --- a/drivers/cpufreq/cpufreq.c > >>>>> +++ b/drivers/cpufreq/cpufreq.c > >>>>> @@ -1379,8 +1379,8 @@ static int cpufreq_online(unsigned int cpu) > >>>>> cpufreq_driver->ready(policy); > >>>>> > >>>>> if (cpufreq_thermal_control_enabled(cpufreq_driver)) > >>>>> - policy->cdev = of_cpufreq_cooling_register(policy); > >>>>> - > >>>>> + of_cpufreq_cooling_register(policy); > >>>>> + > >>>> > >>>> We don't need any error checking here anymore ? > >>> > >>> There was no error checking initially. This comment and the others below > >>> are for an additional patch IMO, not a change in this one. > >> > >> right, but ... > >> > >>>>> -void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) > >>>>> +void cpufreq_cooling_unregister(struct cpufreq_policy *policy) > >>>>> { > >>>>> struct cpufreq_cooling_device *cpufreq_cdev; > >>>>> bool last; > >>>>> > >>>>> - if (!cdev) > >>>>> - return; > >> > >> we used to return without any errors from here. Now we will have > >> problems if regsitering fails for some reason. > > > > Specifically, the last cpufreq_cdev in the list will be unregistered > > AFAICS, and without removing it from the list for that matter, which > > isn't what the caller wants. > > Indeed, > > What about the resulting code above: > > void __cpufreq_cooling_unregister(struct cpufreq_cooling_device > *cpufreq_cdev, int last) > { > /* Unregister the notifier for the last cpufreq cooling device */ > if (last) > cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block, > CPUFREQ_POLICY_NOTIFIER); > Doesn't the notifier need to be unregistered under cooling_list_lock ? > thermal_cooling_device_unregister(cpufreq_cdev->cdev); > ida_simple_remove(&cpufreq_ida, cpufreq_cdev->id); > kfree(cpufreq_cdev->idle_time); > kfree(cpufreq_cdev); > } > > /** > > * cpufreq_cooling_unregister - function to remove cpufreq cooling > device. > * @cdev: thermal cooling device pointer. > > * > > * This interface function unregisters the "thermal-cpufreq-%x" cooling > device. > */ > void cpufreq_cooling_unregister(struct cpufreq_policy *policy) > { > struct cpufreq_cooling_device *cpufreq_cdev; > bool last; > > mutex_lock(&cooling_list_lock); > list_for_each_entry(cpufreq_cdev, &cpufreq_cdev_list, node) { > if (cpufreq_cdev->policy == policy) { > list_del(&cpufreq_cdev->node); > last = list_empty(&cpufreq_cdev_list); > break; > } > } > mutex_unlock(&cooling_list_lock); > > if (cpufreq_cdev->policy == policy) > __cpufreq_cooling_unregister(cpufreq_cdev, last); > } > EXPORT_SYMBOL_GPL(cpufreq_cooling_unregister); > > > > > -- > Linaro.org │ Open source software for ARM SoCs > > Follow Linaro: Facebook | > Twitter | > Blog > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 75F8EC48BD6 for ; Wed, 26 Jun 2019 11:28:37 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 4EF642080C for ; Wed, 26 Jun 2019 11:28:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="jt6hw2u9" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4EF642080C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=JnllDq01L0ymI687TkB/eTrSQIRY3P2PKc7ElAr4PN8=; b=jt6hw2u92Ufvqt /K4uqAsiq+K4PoLTja+Vgxk6f7H8nIRSjGD+a0+3GhZZtXvdCf7WoBMTWMnTv/cdfB050jC/1eQTa 6HnTAHIJ4WktmJAKtV2TMKB+fbDOPyFYhOTEVCtlq+N1KiMsSY3MOQYv1X8m+qLn8xdhk6gVLsowO g3LPvlmsj65iBpm+3xwqtTR17f/0EzKGTonEiiGWK+hRjWVk0GoCP/ZZaq36PFTuJbwJrp/jGjVhq 6cBlsu99Uy9trwVr8iRmYgZqcIMBGjQ6vs+EevpvvNlHqOmIwu0XbUihnPMxkO6Vbz6iMmwTyzPbC m+/AW21WEtLexOybZ0PA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hg66N-0003g8-1N; Wed, 26 Jun 2019 11:28:35 +0000 Received: from mail-ot1-f65.google.com ([209.85.210.65]) by bombadil.infradead.org with esmtps (Exim 4.92 #3 (Red Hat Linux)) id 1hg66J-0003f5-FK for linux-arm-kernel@lists.infradead.org; Wed, 26 Jun 2019 11:28:33 +0000 Received: by mail-ot1-f65.google.com with SMTP id d17so2137646oth.5 for ; Wed, 26 Jun 2019 04:28:31 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=zYG7+FYrQci0B0NIIaV4SdyVIkXx7HP7jsA5/CTPT+A=; b=uhCqAGT28cinp7vle2tvRT/baNCdcrcU4cEU0xzt74OjNcWM11GmRsz/O43DbfMyFc L0ou3cvMJ5ugW2jxkgAVXuy7ddpoKimVw1sCF3qMCE0yWbkkNPfngxrMSKJu5TyzuvBd 8GOmfAXkBQWu7hRG8W/RiTyisLKQcZmQvlGpGMUTVfZYPQAALFqOqtORdw8p0HtJmfSQ xnkkoWBCIdhXPoQ+6WdjDvSq8Wq7CcU/QQKN4HMinoASNcBPeWowiNkem5x4m46DN2Yc 0L2dyBiOSMabCqdhp2BMEqhXbVs3osQeXN/oWezgkoNwu38By4Lqb6jb7MYY9twholKu y8/w== X-Gm-Message-State: APjAAAVXZ80PTnHF451byB/cquR8GAvr0pZkwkOqzqHjvqzYvWvER/Bl by0AS0e4qO9kdPxwkf7lKRmOXvplXyusAjHftPo= X-Google-Smtp-Source: APXvYqxQcfGkDZskFmpDKI+mK6sXWnA1QxcoJlpLtksnfosbfzd0ZwAqux1kiyfOCsazXPoyKgzI+/UQgzyr5VyCpbU= X-Received: by 2002:a9d:6959:: with SMTP id p25mr2713084oto.118.1561548510328; Wed, 26 Jun 2019 04:28:30 -0700 (PDT) MIME-Version: 1.0 References: <20190625113244.18146-1-daniel.lezcano@linaro.org> <20190625113244.18146-2-daniel.lezcano@linaro.org> <20190626025831.jmyzyypxr6ezpbtu@vireshk-i7> <20190626063716.cechnzsb75q5lclr@vireshk-i7> <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> In-Reply-To: <8a9b7bd0-9b21-1ce1-6176-cffff4b8d739@linaro.org> From: "Rafael J. Wysocki" Date: Wed, 26 Jun 2019 13:28:19 +0200 Message-ID: Subject: Re: [PATCH V3 2/3] thermal/drivers/cpu_cooling: Unregister with the policy To: Daniel Lezcano X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190626_042831_517937_B02332C6 X-CRM114-Status: GOOD ( 16.74 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Fabio Estevam , "Rafael J. Wysocki" , Viresh Kumar , Amit Daniel Kachhap , "open list:CPU FREQUENCY DRIVERS - ARM BIG LITTLE" , "Rafael J. Wysocki" , Linux Kernel Mailing List , Eduardo Valentin , "open list:TI BANDGAP AND THERMAL DRIVER" , Keerthy , NXP Linux Team , Pengutronix Kernel Team , Sudeep Holla , Zhang Rui , Javi Merino , Shawn Guo , Sascha Hauer , "moderated list:ARM/FREESCALE IMX / MXC ARM ARCHITECTURE" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gV2VkLCBKdW4gMjYsIDIwMTkgYXQgMTI6MTkgUE0gRGFuaWVsIExlemNhbm8KPGRhbmllbC5s ZXpjYW5vQGxpbmFyby5vcmc+IHdyb3RlOgo+Cj4gT24gMjYvMDYvMjAxOSAxMTowNiwgUmFmYWVs IEouIFd5c29ja2kgd3JvdGU6Cj4gPiBPbiBXZWQsIEp1biAyNiwgMjAxOSBhdCA4OjM3IEFNIFZp cmVzaCBLdW1hciA8dmlyZXNoLmt1bWFyQGxpbmFyby5vcmc+IHdyb3RlOgo+ID4+Cj4gPj4gT24g MjYtMDYtMTksIDA4OjAyLCBEYW5pZWwgTGV6Y2FubyB3cm90ZToKPiA+Pj4gT24gMjYvMDYvMjAx OSAwNDo1OCwgVmlyZXNoIEt1bWFyIHdyb3RlOgo+ID4+Pj4gT24gMjUtMDYtMTksIDEzOjMyLCBE YW5pZWwgTGV6Y2FubyB3cm90ZToKPiA+Pj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVx L2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKPiA+Pj4+PiBpbmRleCBhZWUw MjRlNDI2MTguLmYwNzQ1NDI0OWZiYyAxMDA2NDQKPiA+Pj4+PiAtLS0gYS9kcml2ZXJzL2NwdWZy ZXEvY3B1ZnJlcS5jCj4gPj4+Pj4gKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwo+ID4+ Pj4+IEBAIC0xMzc5LDggKzEzNzksOCBAQCBzdGF0aWMgaW50IGNwdWZyZXFfb25saW5lKHVuc2ln bmVkIGludCBjcHUpCj4gPj4+Pj4gICAgICAgICAgICBjcHVmcmVxX2RyaXZlci0+cmVhZHkocG9s aWN5KTsKPiA+Pj4+Pgo+ID4+Pj4+ICAgIGlmIChjcHVmcmVxX3RoZXJtYWxfY29udHJvbF9lbmFi bGVkKGNwdWZyZXFfZHJpdmVyKSkKPiA+Pj4+PiAtICAgICAgICAgIHBvbGljeS0+Y2RldiA9IG9m X2NwdWZyZXFfY29vbGluZ19yZWdpc3Rlcihwb2xpY3kpOwo+ID4+Pj4+IC0KPiA+Pj4+PiArICAg ICAgICAgIG9mX2NwdWZyZXFfY29vbGluZ19yZWdpc3Rlcihwb2xpY3kpOwo+ID4+Pj4+ICsKPiA+ Pj4+Cj4gPj4+PiBXZSBkb24ndCBuZWVkIGFueSBlcnJvciBjaGVja2luZyBoZXJlIGFueW1vcmUg Pwo+ID4+Pgo+ID4+PiBUaGVyZSB3YXMgbm8gZXJyb3IgY2hlY2tpbmcgaW5pdGlhbGx5LiBUaGlz IGNvbW1lbnQgYW5kIHRoZSBvdGhlcnMgYmVsb3cKPiA+Pj4gYXJlIGZvciBhbiBhZGRpdGlvbmFs IHBhdGNoIElNTywgbm90IGEgY2hhbmdlIGluIHRoaXMgb25lLgo+ID4+Cj4gPj4gcmlnaHQsIGJ1 dCAuLi4KPiA+Pgo+ID4+Pj4+IC12b2lkIGNwdWZyZXFfY29vbGluZ191bnJlZ2lzdGVyKHN0cnVj dCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2KQo+ID4+Pj4+ICt2b2lkIGNwdWZyZXFfY29v bGluZ191bnJlZ2lzdGVyKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQo+ID4+Pj4+ICB7 Cj4gPj4+Pj4gICAgc3RydWN0IGNwdWZyZXFfY29vbGluZ19kZXZpY2UgKmNwdWZyZXFfY2RldjsK PiA+Pj4+PiAgICBib29sIGxhc3Q7Cj4gPj4+Pj4KPiA+Pj4+PiAtICBpZiAoIWNkZXYpCj4gPj4+ Pj4gLSAgICAgICAgICByZXR1cm47Cj4gPj4KPiA+PiB3ZSB1c2VkIHRvIHJldHVybiB3aXRob3V0 IGFueSBlcnJvcnMgZnJvbSBoZXJlLiBOb3cgd2Ugd2lsbCBoYXZlCj4gPj4gcHJvYmxlbXMgaWYg cmVnc2l0ZXJpbmcgZmFpbHMgZm9yIHNvbWUgcmVhc29uLgo+ID4KPiA+IFNwZWNpZmljYWxseSwg dGhlIGxhc3QgY3B1ZnJlcV9jZGV2IGluIHRoZSBsaXN0IHdpbGwgYmUgdW5yZWdpc3RlcmVkCj4g PiBBRkFJQ1MsIGFuZCB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGxpc3QgZm9yIHRoYXQg bWF0dGVyLCB3aGljaAo+ID4gaXNuJ3Qgd2hhdCB0aGUgY2FsbGVyIHdhbnRzLgo+Cj4gSW5kZWVk LAo+Cj4gV2hhdCBhYm91dCB0aGUgcmVzdWx0aW5nIGNvZGUgYWJvdmU6Cj4KPiB2b2lkIF9fY3B1 ZnJlcV9jb29saW5nX3VucmVnaXN0ZXIoc3RydWN0IGNwdWZyZXFfY29vbGluZ19kZXZpY2UKPiAq Y3B1ZnJlcV9jZGV2LCBpbnQgbGFzdCkKPiB7Cj4gICAgICAgICAvKiBVbnJlZ2lzdGVyIHRoZSBu b3RpZmllciBmb3IgdGhlIGxhc3QgY3B1ZnJlcSBjb29saW5nIGRldmljZSAqLwo+ICAgICAgICAg aWYgKGxhc3QpCj4gICAgICAgICAgICAgICAgIGNwdWZyZXFfdW5yZWdpc3Rlcl9ub3RpZmllcigm dGhlcm1hbF9jcHVmcmVxX25vdGlmaWVyX2Jsb2NrLAo+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgQ1BVRlJFUV9QT0xJQ1lfTk9USUZJRVIpOwo+CgpEb2Vzbid0 IHRoZSBub3RpZmllciBuZWVkIHRvIGJlIHVucmVnaXN0ZXJlZCB1bmRlciBjb29saW5nX2xpc3Rf bG9jayA/Cgo+ICAgICAgICAgdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKGNwdWZy ZXFfY2Rldi0+Y2Rldik7Cj4gICAgICAgICBpZGFfc2ltcGxlX3JlbW92ZSgmY3B1ZnJlcV9pZGEs IGNwdWZyZXFfY2Rldi0+aWQpOwo+ICAgICAgICAga2ZyZWUoY3B1ZnJlcV9jZGV2LT5pZGxlX3Rp bWUpOwo+ICAgICAgICAga2ZyZWUoY3B1ZnJlcV9jZGV2KTsKPiB9Cj4KPiAvKioKPgo+ICAqIGNw dWZyZXFfY29vbGluZ191bnJlZ2lzdGVyIC0gZnVuY3Rpb24gdG8gcmVtb3ZlIGNwdWZyZXEgY29v bGluZwo+IGRldmljZS4KPiAgKiBAY2RldjogdGhlcm1hbCBjb29saW5nIGRldmljZSBwb2ludGVy Lgo+Cj4gICoKPgo+ICAqIFRoaXMgaW50ZXJmYWNlIGZ1bmN0aW9uIHVucmVnaXN0ZXJzIHRoZSAi dGhlcm1hbC1jcHVmcmVxLSV4IiBjb29saW5nCj4gZGV2aWNlLgo+ICAqLwo+IHZvaWQgY3B1ZnJl cV9jb29saW5nX3VucmVnaXN0ZXIoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCj4gewo+ ICAgICAgICAgc3RydWN0IGNwdWZyZXFfY29vbGluZ19kZXZpY2UgKmNwdWZyZXFfY2RldjsKPiAg ICAgICAgIGJvb2wgbGFzdDsKPgo+ICAgICAgICAgbXV0ZXhfbG9jaygmY29vbGluZ19saXN0X2xv Y2spOwo+ICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeShjcHVmcmVxX2NkZXYsICZjcHVmcmVx X2NkZXZfbGlzdCwgbm9kZSkgewo+ICAgICAgICAgICAgICAgICBpZiAoY3B1ZnJlcV9jZGV2LT5w b2xpY3kgPT0gcG9saWN5KSB7Cj4gICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9kZWwoJmNw dWZyZXFfY2Rldi0+bm9kZSk7Cj4gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGxpc3Rf ZW1wdHkoJmNwdWZyZXFfY2Rldl9saXN0KTsKPiAgICAgICAgICAgICAgICAgICAgICAgICBicmVh azsKPiAgICAgICAgICAgICAgICAgfQo+ICAgICAgICAgfQo+ICAgICAgICAgbXV0ZXhfdW5sb2Nr KCZjb29saW5nX2xpc3RfbG9jayk7Cj4KPiAgICAgICAgIGlmIChjcHVmcmVxX2NkZXYtPnBvbGlj eSA9PSBwb2xpY3kpCj4gICAgICAgICAgICAgICAgIF9fY3B1ZnJlcV9jb29saW5nX3VucmVnaXN0 ZXIoY3B1ZnJlcV9jZGV2LCBsYXN0KTsKPiB9Cj4gRVhQT1JUX1NZTUJPTF9HUEwoY3B1ZnJlcV9j b29saW5nX3VucmVnaXN0ZXIpOwo+Cj4KPgo+Cj4gLS0KPiAgPGh0dHA6Ly93d3cubGluYXJvLm9y Zy8+IExpbmFyby5vcmcg4pSCIE9wZW4gc291cmNlIHNvZnR3YXJlIGZvciBBUk0gU29Dcwo+Cj4g Rm9sbG93IExpbmFybzogIDxodHRwOi8vd3d3LmZhY2Vib29rLmNvbS9wYWdlcy9MaW5hcm8+IEZh Y2Vib29rIHwKPiA8aHR0cDovL3R3aXR0ZXIuY29tLyMhL2xpbmFyb29yZz4gVHdpdHRlciB8Cj4g PGh0dHA6Ly93d3cubGluYXJvLm9yZy9saW5hcm8tYmxvZy8+IEJsb2cKPgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=