From patchwork Tue Jun 23 21:35:56 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartlomiej Zolnierkiewicz X-Patchwork-Id: 29096 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by bilbo.ozlabs.org (Postfix) with ESMTP id C66ACB70D9 for ; Wed, 24 Jun 2009 07:32:55 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758490AbZFWVco (ORCPT ); Tue, 23 Jun 2009 17:32:44 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1758431AbZFWVco (ORCPT ); Tue, 23 Jun 2009 17:32:44 -0400 Received: from mail-fx0-f213.google.com ([209.85.220.213]:35567 "EHLO mail-fx0-f213.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758152AbZFWVcf (ORCPT ); Tue, 23 Jun 2009 17:32:35 -0400 Received: by mail-fx0-f213.google.com with SMTP id 9so371760fxm.37 for ; Tue, 23 Jun 2009 14:32:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :user-agent:cc:mime-version:content-disposition:message-id :content-type:content-transfer-encoding; bh=7dlQYT5ii8bWjdGrVAHxnQSvTT2Ddf+UYGyFHs4cS4U=; b=xhJvgyS+/iEPmUCQ3WD6p0TN+XiHassNm1c0NSiJ0aliMk4OD5lqH8kXLeb6ucAK3C 7a3wWBggJ4VP0knJsu/gESefFNr5ZJVmFiGvdw5egF5l312/Ys53xhh/6OHE5T0YCKyD Zyb1hszlV7OoojnESuGK3GN4aM84Ik62cPWvo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:cc:mime-version:content-disposition :message-id:content-type:content-transfer-encoding; b=MERP1UC06u+Gsxtgq2tnJgZAR3AoRwrcKUig8QfYwW0SXGf0V0XTun293IXZjCP/f/ YbTlO7qXeNvNNoXNaQ6gt9k+VCPrK1rlKW3eigWO1wYHargDMBpO8J3PRJTMAC7ypSlk TKd6/1VbdQWp60Y284s1PD/aj1f/I7fdQSerg= Received: by 10.103.160.9 with SMTP id m9mr246513muo.53.1245792758205; Tue, 23 Jun 2009 14:32:38 -0700 (PDT) Received: from localhost.localdomain (chello089077034197.chello.pl [89.77.34.197]) by mx.google.com with ESMTPS id 25sm1826607mul.50.2009.06.23.14.32.37 (version=TLSv1/SSLv3 cipher=RC4-MD5); Tue, 23 Jun 2009 14:32:37 -0700 (PDT) From: Bartlomiej Zolnierkiewicz To: David Miller Subject: [patch 6/6] ide: improve handling of Power Management requests Date: Tue, 23 Jun 2009 23:35:56 +0200 User-Agent: KMail/1.11.3 (Linux/2.6.30-next-20090623-11043-g1684859-dirty; KDE/4.2.3; i686; ; ) Cc: linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200906232335.57161.bzolnier@gmail.com> Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org From: Bartlomiej Zolnierkiewicz Subject: [PATCH] ide: improve handling of Power Management requests Make hwif->rq point to PM request during PM sequence and do not allow any other types of requests to slip in (the old comment was never correct as there should be no such requests generated during PM sequence). Signed-off-by: Bartlomiej Zolnierkiewicz --- This was tested in the past (with an additional testing from Borislav) however there were block layer changes in the meantime so you may want to give it some more testing time just to be sure. drivers/ide/ide-io.c | 54 ++++++++++++++++++++------------------------------- 1 file changed, 22 insertions(+), 32 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: b/drivers/ide/ide-io.c =================================================================== --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c @@ -466,10 +466,14 @@ void do_ide_request(struct request_queue if (!ide_lock_port(hwif)) { ide_hwif_t *prev_port; - - WARN_ON_ONCE(hwif->rq); repeat: prev_port = hwif->host->cur_port; + + if (drive->dev_flags & IDE_DFLAG_BLOCKED) + rq = hwif->rq; + else + WARN_ON_ONCE(hwif->rq); + if (drive->dev_flags & IDE_DFLAG_SLEEPING && time_after(drive->sleep, jiffies)) { ide_unlock_port(hwif); @@ -496,43 +500,29 @@ repeat: hwif->cur_dev = drive; drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED); - spin_unlock_irq(&hwif->lock); - spin_lock_irq(q->queue_lock); - /* - * we know that the queue isn't empty, but this can happen - * if the q->prep_rq_fn() decides to kill a request - */ - if (!rq) + if (rq == NULL) { + spin_unlock_irq(&hwif->lock); + spin_lock_irq(q->queue_lock); + /* + * we know that the queue isn't empty, but this can + * happen if ->prep_rq_fn() decides to kill a request + */ rq = blk_fetch_request(drive->queue); + spin_unlock_irq(q->queue_lock); + spin_lock_irq(&hwif->lock); - spin_unlock_irq(q->queue_lock); - spin_lock_irq(&hwif->lock); - - if (!rq) { - ide_unlock_port(hwif); - goto out; + if (rq == NULL) { + ide_unlock_port(hwif); + goto out; + } } /* * Sanity: don't accept a request that isn't a PM request - * if we are currently power managed. This is very important as - * blk_stop_queue() doesn't prevent the blk_fetch_request() - * above to return us whatever is in the queue. Since we call - * ide_do_request() ourselves, we end up taking requests while - * the queue is blocked... - * - * We let requests forced at head of queue with ide-preempt - * though. I hope that doesn't happen too much, hopefully not - * unless the subdriver triggers such a thing in its own PM - * state machine. + * if we are currently power managed. */ - if ((drive->dev_flags & IDE_DFLAG_BLOCKED) && - blk_pm_request(rq) == 0 && - (rq->cmd_flags & REQ_PREEMPT) == 0) { - /* there should be no pending command at this point */ - ide_unlock_port(hwif); - goto plug_device; - } + BUG_ON((drive->dev_flags & IDE_DFLAG_BLOCKED) && + blk_pm_request(rq) == 0); hwif->rq = rq;