Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp4251173pxy; Mon, 26 Apr 2021 23:54:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwFXmSvRew7HJ88ejb1pTE8CEWEthY1adadwnindZBRZKxlOEDnDr7PBGi4S6NR2G3sVKua X-Received: by 2002:a17:90b:1941:: with SMTP id nk1mr3412080pjb.86.1619506442184; Mon, 26 Apr 2021 23:54:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619506442; cv=none; d=google.com; s=arc-20160816; b=jHqR7XPcepS/eT64LzrPgV+oogFhbbZF01hfOo9Ay1NGg3y9A2m5WYAWKp0UnQyA5M at6YKV2q1IyONc+OVuzRBQI9Q/QKpFTQRcIv3850kRuDFYdRCsRsFzMABPEohuu0IdqX 8MgPSDOsmUFTUjo9KykrFrid22Ad9tIXrhGUy4YeIteOI9W+p/CA4gQDF9/tmVe8DWhY eT+RG5ZgEkOn1p4kDl4+VVR6/VhwwU5yik22DjLE6UX++Gx81o9yIywm2ORvfiVSGxhi /iwCP3dFeqP4NQ+QKAkdw9JOQvw6ExI+eDa1r/L4Rkgc6X4n56Cu/6zbwEJEOFl68oyH bfZQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=AdW+5T+k5u7cNZysyil9KyXcGibUka0VOAb1DAnUCrs=; b=GkA89uSd3pdIlixxXOTtnlkPkShjSZ0UIv+qvUFDi1pLvWR5UwybP8iD3KaZA/JNzf ZSBRUWKb2X31INu2kgIlsS2u+lNAIS5l0JNNFB9rs6VBd26STdISfYwUTNPoBJOVRCSO 4+cTiFfrQSK3eQOsmA7e0YBGtOCpqGyjavzh0D71hfaiCmPbrkB8u9u9e+OpYmQm13TT NPS4PiZm7kq8+Rs0GtkrXJkqu2SJ/4LSYMZT3fddshnggTmuXCinv7fMD4jSBr0bB/gn FcPyk7n5qU+utygrvZkzDxYULdsS7glO9TnADhvNEqDFVECca28Kxd6Rtcjt0VdTfopq JVmQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qrDHn7yN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f15si2182293pju.35.2021.04.26.23.53.47; Mon, 26 Apr 2021 23:54:02 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=qrDHn7yN; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231468AbhD0Gxs (ORCPT + 99 others); Tue, 27 Apr 2021 02:53:48 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38080 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229923AbhD0Gxr (ORCPT ); Tue, 27 Apr 2021 02:53:47 -0400 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 09DCCC061574; Mon, 26 Apr 2021 23:53:05 -0700 (PDT) Received: by mail-pj1-x1031.google.com with SMTP id j6-20020a17090adc86b02900cbfe6f2c96so6694869pjv.1; Mon, 26 Apr 2021 23:53:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=AdW+5T+k5u7cNZysyil9KyXcGibUka0VOAb1DAnUCrs=; b=qrDHn7yNVUu8BEEAQsysRKJZL6qa99so4j7pM/pOggWZ4LP5VXqr7Eq6uVPDmDHFwc 8X8nuRKF7jthk7QSwiqu+zMMwBypxSEJsVnluYFx4mJjgK+GfTxiR7ctodLMwgfAXClb muFf4/2SHjGHseh4FFvms9SpYnddVAiD5iRQ5HYvGF5Kw7vJq5rOsdWX4b1XrFcAhAkl crQ+Z/RgSynsVb28RZha9z9T/EFcSDMp9TuzZ5Pwm/i2nI/Zvq2B5J2y3wN+g5zl0UiN d4ge/7FQ7PBCPesnZ2i4oDb7OdXTPS9AwsdLfpq0ktPzYnYnkGW8Ak/cjUqKm+EP/dvB mRYA== 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; bh=AdW+5T+k5u7cNZysyil9KyXcGibUka0VOAb1DAnUCrs=; b=uL9j26sigGo3AsRUxkik3Kn0PKwqbtRqtDDbVQ4uAQc4JB9EosWpgXtK1uw8bOv+1P 71Tg2KjPIsisOXcEQXc3HZ8iWggQXzpTQKsn9KoFm2vy98OIKtggCNZMJI82A9WBccAE W/Q1K53EoO3DfKPPIBo8k4nIMR7HbnQ3IZ7FwA53UDXxt53pQYnf9HZnf528hx4A7gns Yu4iycYyK0sfhPZbRqd4eHYh97w7N+1XuUdClMKujwJZNo5CXskvMr5T4FRhS/Y0/nCT mx97MI6EfXJ+sr2lA3HG+q/05/cFK6tOcRauOSbSZ+mUAoj8WK5hjJVcnbbu50fAh9qK 0HHw== X-Gm-Message-State: AOAM531SowQsn/4QWucowZluLxxXec595T5moZEOCmQ0zIPWuKomBHft qZZVZNe8kuCSEJLEA7DFl362ZGLmUwkoau2Ckbc= X-Received: by 2002:a17:902:a406:b029:e6:78c4:71c8 with SMTP id p6-20020a170902a406b02900e678c471c8mr22536493plq.17.1619506384517; Mon, 26 Apr 2021 23:53:04 -0700 (PDT) MIME-Version: 1.0 References: <20210426235638.1285530-1-saravanak@google.com> In-Reply-To: <20210426235638.1285530-1-saravanak@google.com> From: Andy Shevchenko Date: Tue, 27 Apr 2021 09:52:48 +0300 Message-ID: Subject: Re: [PATCH] spi: Fix spi device unregister flow To: Saravana Kannan , Lukas Wunner Cc: Mark Brown , Greg Kroah-Hartman , "Rafael J. Wysocki" , Guenter Roeck , Marek Szyprowski , Android Kernel Team , linux-spi , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org +Cc Lukas On Tue, Apr 27, 2021 at 2:56 AM Saravana Kannan wrote: > > When an SPI device is unregistered, the spi->controller->cleanup() is > called in the device's release callback. That's wrong for a couple of > reasons: > > 1. spi_dev_put() can be called before spi_add_device() is called. And > it's spi_add_device() that calls spi_setup(). This will cause clean() > to get called without the spi device ever being setup. > > 2. There's no guarantee that the controller's driver would be present by > the time the spi device's release function gets called. > > 3. It also causes "sleeping in atomic context" stack dump[1] when device > link deletion code does a put_device() on the spi device. > > Fix these issues by simply moving the cleanup from the device release > callback to the actual spi_unregister_device() function. > > [1] - https://lore.kernel.org/lkml/CAHp75Vc=FCGcUyS0v6fnxme2YJ+qD+Y-hQDQLa2JhWNON9VmsQ@mail.gmail.com/ > Signed-off-by: Saravana Kannan > --- > drivers/spi/spi.c | 18 ++++++++++++------ > 1 file changed, 12 insertions(+), 6 deletions(-) > > diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c > index b08efe88ccd6..7d0d89172a1d 100644 > --- a/drivers/spi/spi.c > +++ b/drivers/spi/spi.c > @@ -47,10 +47,6 @@ static void spidev_release(struct device *dev) > { > struct spi_device *spi = to_spi_device(dev); > > - /* spi controllers may cleanup for released devices */ > - if (spi->controller->cleanup) > - spi->controller->cleanup(spi); > - > spi_controller_put(spi->controller); > kfree(spi->driver_override); > kfree(spi); > @@ -558,6 +554,12 @@ static int spi_dev_check(struct device *dev, void *data) > return 0; > } > > +static void spi_cleanup(struct spi_device *spi) > +{ > + if (spi->controller->cleanup) > + spi->controller->cleanup(spi); > +} > + > /** > * spi_add_device - Add spi_device allocated with spi_alloc_device > * @spi: spi_device to register > @@ -622,11 +624,13 @@ int spi_add_device(struct spi_device *spi) > > /* Device may be bound to an active driver when this returns */ > status = device_add(&spi->dev); > - if (status < 0) > + if (status < 0) { > dev_err(dev, "can't add %s, status %d\n", > dev_name(&spi->dev), status); > - else > + spi_cleanup(spi); > + } else { > dev_dbg(dev, "registered child %s\n", dev_name(&spi->dev)); > + } > > done: > mutex_unlock(&spi_add_lock); > @@ -713,6 +717,8 @@ void spi_unregister_device(struct spi_device *spi) > if (!spi) > return; > > + spi_cleanup(spi); > + > if (spi->dev.of_node) { > of_node_clear_flag(spi->dev.of_node, OF_POPULATED); > of_node_put(spi->dev.of_node); > -- > 2.31.1.498.g6c1eba8ee3d-goog > -- With Best Regards, Andy Shevchenko