From patchwork Fri Jan 18 21:32:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Wilck X-Patchwork-Id: 10771589 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CF8186C2 for ; Fri, 18 Jan 2019 21:32:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B15E1306B9 for ; Fri, 18 Jan 2019 21:32:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A2DB2306FC; Fri, 18 Jan 2019 21:32:40 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3959C3035A for ; Fri, 18 Jan 2019 21:32:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729636AbfARVci (ORCPT ); Fri, 18 Jan 2019 16:32:38 -0500 Received: from smtp2.provo.novell.com ([137.65.250.81]:44894 "EHLO smtp2.provo.novell.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729474AbfARVci (ORCPT ); Fri, 18 Jan 2019 16:32:38 -0500 Received: from apollon.suse.de.de (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by smtp2.provo.novell.com with ESMTP (TLS encrypted); Fri, 18 Jan 2019 14:32:33 -0700 From: Martin Wilck To: Jens Axboe , Tejun Heo , Hannes Reinecke Cc: Martin Wilck , linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, linux-ide@vger.kernel.org, Christoph Hellwig , "Martin K. Petersen" , James Bottomley , Bart Van Assche Subject: [PATCH 0/4] block: skip media change event handling if unsupported Date: Fri, 18 Jan 2019 22:32:03 +0100 Message-Id: <20190118213207.2309-1-mwilck@suse.com> X-Mailer: git-send-email 2.19.2 MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The block layer currently can't distinguish between gendisk devices that don't support any media change events, and devices that do support them, but only for internal purposes. Therefore the check_events() function is called e.g. for ordinary non-removable SCSI disks. While these devices are not polled under normal conditions, the check_events function is called on certain synchronization points, in particular while the device is opened, closed, or probed. Under unfavorable conditions this can lead to processes being stalled on a blocked queue: a close() schedules a work item for check_events() which gets blocked in the work queue, and subsequent open() tries to flush the workqueue. The flush then stalls too, as long as the the blocked work item can't finish. In principle, the gendisk->events field would make it very easy for the block layer to check only for events actually supported by the device. Currently this is impossible, because there are lots of drivers which don't set gendisk->events although they implement the check_events() method. This was introduced in commit 7c88a168da80 ("block: don't propagate unlisted DISK_EVENTs to userland") and follow-up patches because uevent generation by these drivers was found to possibly generate infinite event loops between kernel and user space. A side effect of these patches was that the distinction between such devices and devices supporting no events at all was lost. This series implements a slightly different approach to event handling and uevent suppression. The drivers are changed to set the events field again. Whether or not uevents should be generated is controlled by a separate flag bit, which is only set by the drivers that are known to generate proper uevents (sd and sr). Once this is done, devices that don't support any media change events can be clearly identified, and the whole events checking code path can be skipped. This simplifies handling of non-removable SCSI disks. I have tested this with removable and non-removable SCSI disks, SCSI cdrom, and ide-cd. This patch set targets the same problem as Hannes' late submission "sd: skip non-removable devices in sd_check_events()". Martin Wilck (4): block: disk_events: introduce event flags Revert "ide: unexport DISK_EVENT_MEDIA_CHANGE for ide-gd and ide-cd" Revert "block: unexport DISK_EVENT_MEDIA_CHANGE for legacy/fringe drivers" block: check_events: don't bother with events if unsupported block/genhd.c | 50 +++++++++++++++++++++++++------------- drivers/block/amiflop.c | 1 + drivers/block/ataflop.c | 1 + drivers/block/floppy.c | 1 + drivers/block/paride/pcd.c | 1 + drivers/block/paride/pd.c | 1 + drivers/block/paride/pf.c | 1 + drivers/block/swim.c | 1 + drivers/block/swim3.c | 1 + drivers/block/xsysace.c | 1 + drivers/cdrom/gdrom.c | 1 + drivers/ide/ide-cd.c | 1 + drivers/ide/ide-cd_ioctl.c | 5 ++-- drivers/ide/ide-gd.c | 6 +++-- drivers/scsi/sd.c | 3 ++- drivers/scsi/sr.c | 3 ++- include/linux/genhd.h | 7 ++++++ 17 files changed, 62 insertions(+), 23 deletions(-)