Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp3857376pxf; Mon, 22 Mar 2021 17:51:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw4Cki3Ruf++dY4U138H8PO5JP13bTqbgv5/KGrTjEIyFNgUdYRsWA0GunKppmoLH+dDYC4 X-Received: by 2002:a17:906:f1c8:: with SMTP id gx8mr2351972ejb.385.1616460710354; Mon, 22 Mar 2021 17:51:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1616460710; cv=none; d=google.com; s=arc-20160816; b=WCVqCkJf7hhkPmeUgzYqUh8K+ZdwUfsiRETUlQDlPemnZ2UjjAx0ZvuEvNEZbq/bla fqMkrkrL7HrqKk1Cx3np+oc5O3Q6oK1w+lHn0XYp7mbkM3Y3xZQXifFs2F+3vV8wDOTc WKVFiFXQm28obnBzTMXjAdkXWwWOZdkkD+2/1ri3+5z5sYsKkfhZXcBTKdK5cIIzynPD Q8BEWwydo5MJZb+hRrydKXN4Xic6y7w25MR26B8pnvP38ced9PCvaKlguxcpbn3UEa4g /MEsX6uOF7w1glUJD9t9yR0aK8vtZBroYi90MAiPVVnyLyCZidm6xRfsyxsjHuFOhii0 gbJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=dGK5wgJ8c1b7eR3EVWCVtpIRoKoiQBtxY+4YKBksNLg=; b=N43XdhlT16SPX3jAe3/fmOQyOnA53suLK1LkM9LaR9pRFJpzm9Qr5Xn8cyKZdiiBdW 1K643yBbA18gp4VbSIiRAeSzyPIz2bz9gxbAA1syoYyO8pZl4oFPm9I5WK2r6XJb1sdl 6/6B4spFKNYizxdnNk2NOZvXI6HUFciT6d9NYIt3jb9V8Xw3LOYQiGDu4GiFKSjFFeVo GWZ4Skv9bGKQO1rhSbQZgMdyojiAmXeFwIbXxOorQNA6zjcPvZZeBmT3MaWsdMVKQony wnhuwRqkgoJlAurPSQgkejQxmWCeAaL7l6VuO7oGuMRTu3yc/8eyPJXoi8Njc8FynOSl YNeg== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q2si13015307ejz.47.2021.03.22.17.51.27; Mon, 22 Mar 2021 17:51:50 -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; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231352AbhCWAtm (ORCPT + 99 others); Mon, 22 Mar 2021 20:49:42 -0400 Received: from mx2.suse.de ([195.135.220.15]:54568 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229658AbhCWAtQ (ORCPT ); Mon, 22 Mar 2021 20:49:16 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 64E64AC1D; Tue, 23 Mar 2021 00:49:15 +0000 (UTC) From: Davidlohr Bueso To: axboe@kernel.dk Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, dave@stgolabs.net, Davidlohr Bueso Subject: [PATCH] block/umem: convert tasklet to threaded irq Date: Mon, 22 Mar 2021 17:48:56 -0700 Message-Id: <20210323004856.10206-1-dave@stgolabs.net> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Tasklets have long been deprecated as being too heavy on the system by running in irq context - and this is not a performance critical path. If a higher priority process wants to run, it must wait for the tasklet to finish before doing so. A more suitable equivalent is to converted to threaded irq instead and deal with the async processing in task context. Signed-off-by: Davidlohr Bueso --- drivers/block/umem.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 982732dbe82e..6b0a110f9233 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -120,7 +120,6 @@ struct cardinfo { int Active, Ready; - struct tasklet_struct tasklet; unsigned int dma_status; struct { @@ -243,7 +242,7 @@ static void dump_dmastat(struct cardinfo *card, unsigned int dmastat) * overloaded to record whether it was a read or a write. * * The interrupt handler only polls the device to clear the interrupt. - * The processing of the result is done in a tasklet. + * The processing of the result is done in threaded irq. */ static void mm_start_io(struct cardinfo *card) @@ -405,7 +404,7 @@ static int add_bio(struct cardinfo *card) return 1; } -static void process_page(unsigned long data) +static irqreturn_t process_page(int irq, void *__card) { /* check if any of the requests in the page are DMA_COMPLETE, * and deal with them appropriately. @@ -415,10 +414,10 @@ static void process_page(unsigned long data) */ struct mm_page *page; struct bio *return_bio = NULL; - struct cardinfo *card = (struct cardinfo *)data; + struct cardinfo *card = (struct cardinfo *)__card; unsigned int dma_status = card->dma_status; - spin_lock(&card->lock); + spin_lock_bh(&card->lock); if (card->Active < 0) goto out_unlock; page = &card->mm_pages[card->Active]; @@ -493,7 +492,7 @@ static void process_page(unsigned long data) mm_start_io(card); } out_unlock: - spin_unlock(&card->lock); + spin_unlock_bh(&card->lock); while (return_bio) { struct bio *bio = return_bio; @@ -502,6 +501,8 @@ static void process_page(unsigned long data) bio->bi_next = NULL; bio_endio(bio); } + + return IRQ_HANDLED; } static void mm_unplug(struct blk_plug_cb *cb, bool from_schedule) @@ -637,11 +638,10 @@ HW_TRACE(0x30); /* and process the DMA descriptors */ card->dma_status = dma_status; - tasklet_schedule(&card->tasklet); HW_TRACE(0x36); - return IRQ_HANDLED; + return IRQ_WAKE_THREAD; } /* @@ -891,8 +891,6 @@ static int mm_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) if (!card->queue) goto failed_alloc; - tasklet_init(&card->tasklet, process_page, (unsigned long)card); - card->check_batteries = 0; mem_present = readb(card->csr_remap + MEMCTRLSTATUS_MEMORY); @@ -951,8 +949,8 @@ static int mm_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) data = ~data; data += 1; - if (request_irq(dev->irq, mm_interrupt, IRQF_SHARED, DRIVER_NAME, - card)) { + if (request_threaded_irq(dev->irq, mm_interrupt, process_page, + IRQF_SHARED, DRIVER_NAME, card)) { dev_printk(KERN_ERR, &card->dev->dev, "Unable to allocate IRQ\n"); ret = -ENODEV; @@ -1015,7 +1013,6 @@ static void mm_pci_remove(struct pci_dev *dev) { struct cardinfo *card = pci_get_drvdata(dev); - tasklet_kill(&card->tasklet); free_irq(dev->irq, card); iounmap(card->csr_remap); -- 2.26.2