From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752988AbbI1GeT (ORCPT ); Mon, 28 Sep 2015 02:34:19 -0400 Received: from mga14.intel.com ([192.55.52.115]:54735 "EHLO mga14.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751010AbbI1GeS (ORCPT ); Mon, 28 Sep 2015 02:34:18 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.17,601,1437462000"; d="scan'208";a="814280969" From: Jani Nikula To: Thierry Reding Cc: dri-devel@lists.freedesktop.org, Greg Kroah-Hartman , linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/6] driver-core: platform: Provide helpers for multi-driver modules In-Reply-To: <20150925151543.GC22463@ulmo> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo References: <1443114161-7965-1-git-send-email-thierry.reding@gmail.com> <87wpven69b.fsf@intel.com> <20150925151543.GC22463@ulmo> User-Agent: Notmuch/0.20.2+58~g39779b9 (http://notmuchmail.org) Emacs/24.4.1 (x86_64-pc-linux-gnu) Date: Mon, 28 Sep 2015 09:37:37 +0300 Message-ID: <877fnbm4lq.fsf@intel.com> MIME-Version: 1.0 Content-Type: text/plain Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 25 Sep 2015, Thierry Reding wrote: > On Fri, Sep 25, 2015 at 01:27:28PM +0300, Jani Nikula wrote: >> On Thu, 24 Sep 2015, Thierry Reding wrote: > [...] >> > diff --git a/drivers/base/platform.c b/drivers/base/platform.c > [...] >> > +/** >> > + * platform_register_drivers - register an array of platform drivers >> > + * @drivers: an array of drivers to register >> > + * @count: the number of drivers to register >> > + * >> > + * Registers platform drivers specified by an array. On failure to register a >> > + * driver, all previously registered drivers will be unregistered. Callers of >> > + * this API should use platform_unregister_drivers() to unregister drivers in >> > + * the reverse order. >> > + * >> > + * Returns: 0 on success or a negative error code on failure. >> > + */ >> > +int platform_register_drivers(struct platform_driver * const *drivers, >> > + unsigned int count) >> > +{ >> > + unsigned int i; >> > + int err; >> > + >> > + for (i = 0; i < count; i++) { >> > + pr_debug("registering platform driver %ps\n", drivers[i]); >> > + >> > + err = platform_driver_register(drivers[i]); >> > + if (err < 0) { >> > + pr_err("failed to register platform driver %ps: %d\n", >> > + drivers[i], err); >> > + goto error; >> > + } >> > + } >> > + >> > + return 0; >> > + >> > +error: >> > + while (i--) { >> > + pr_debug("unregistering platform driver %ps\n", drivers[i]); >> > + platform_driver_unregister(drivers[i]); >> > + } >> >> This will call platform_driver_unregister() on the driver that failed, >> but not the first driver. >> >> You should probably make i an int, and use while (--i >= 0). > > Actually it won't. I was especially careful and even tested this with > one driver by instrumenting platform_driver_register() to return failure > at various points in the sequence. > > This works fine. You are right, of course. What was I thinking. My kingdom for an excuse! BR, Jani. -- Jani Nikula, Intel Open Source Technology Center