linux-nvme.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: keith.busch@intel.com (Keith Busch)
Subject: [PATCH for-4.5 06/13] NVMe: Remove WQ_MEM_RECLAIM from nvme work queue
Date: Wed, 10 Feb 2016 23:37:47 +0000	[thread overview]
Message-ID: <20160210233747.GA25988@localhost.localdomain> (raw)
In-Reply-To: <20160210184641.GA26933@infradead.org>

On Wed, Feb 10, 2016@10:46:41AM -0800, Christoph Hellwig wrote:
> On Wed, Feb 10, 2016@11:17:23AM -0700, Keith Busch wrote:
> > This isn't used for work in the memory reclaim path, and we may need
> > to sync with work queues that also are not flagged memory relaim. This
> > fixes a kernel warning if we ever do sync with such a work queue.
> 
> We do need it during memory reclaim: memory reclaim in general
> does I/O, which can be on NVMe.  We then need the workqueue to
> abort a command or reset an overloaded controller to make progress.
> Not having WQ_MEM_RECLAIM risks deadlocks in heavily loaded systems.

Darn. Invalidating a disk drains lru, which syncs with work scheduled
on the system_wq. Syncing with that from a memory reclaim work queue
hits a kernel warning.

That lru drain work is reclaiming memory, though. Does this need
to be using a WQ_MEM_RECLAIM queue, then?

This is the alternate patch I didn't plan to submit:

---
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index 0e32bc7..f7cc91e 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -356,6 +359,7 @@ extern struct workqueue_struct *system_unbound_wq;
 extern struct workqueue_struct *system_freezable_wq;
 extern struct workqueue_struct *system_power_efficient_wq;
 extern struct workqueue_struct *system_freezable_power_efficient_wq;
+extern struct workqueue_struct *system_mem_wq;

 extern struct workqueue_struct *
 __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,
diff --git a/kernel/workqueue.c b/kernel/workqueue.c
index 61a0264..57a50d2 100644
--- a/kernel/workqueue.c
+++ b/kernel/workqueue.c
@@ -5483,10 +5483,13 @@ static int __init init_workqueues(void)
        system_freezable_power_efficient_wq = alloc_workqueue("events_freezable_power_efficient",
                                              WQ_FREEZABLE | WQ_POWER_EFFICIENT,
                                              0);
+       system_mem_wq = alloc_workqueue("events_mem_unbound", WQ_UNBOUND | WQ_MEM_RECLAIM,
+                                           WQ_UNBOUND_MAX_ACTIVE);
        BUG_ON(!system_wq || !system_highpri_wq || !system_long_wq ||
               !system_unbound_wq || !system_freezable_wq ||
               !system_power_efficient_wq ||
-              !system_freezable_power_efficient_wq);
+              !system_freezable_power_efficient_wq ||
+              !system_mem_wq);

        wq_watchdog_init();

diff --git a/mm/swap.c b/mm/swap.c
index 09fe5e9..eecf98a 100644
--- a/mm/swap.c
+++ b/mm/swap.c
@@ -685,7 +685,7 @@ void lru_add_drain_all(void)
                    pagevec_count(&per_cpu(lru_deactivate_pvecs, cpu)) ||
                    need_activate_page_drain(cpu)) {
                        INIT_WORK(work, lru_add_drain_per_cpu);
-                       schedule_work_on(cpu, work);
+                       queue_work_on(cpu, system_mem_wq, work);
                        cpumask_set_cpu(cpu, &has_work);
                }
        }
--

  reply	other threads:[~2016-02-10 23:37 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-10 18:17 [PATCH for-4.5 00/13] NVMe fixups for 4.5 Keith Busch
2016-02-10 18:17 ` [PATCH for-4.5 01/13] blk-mq: End unstarted requests on dying queue Keith Busch
2016-02-11 12:13   ` Johannes Thumshirn
2016-02-11 12:30   ` Sagi Grimberg
2016-02-10 18:17 ` [PATCH for-4.5 02/13] NVMe: Fix io incapable return values Keith Busch
2016-02-11 12:14   ` Johannes Thumshirn
2016-02-10 18:17 ` [PATCH for-4.5 03/13] NVMe: Allow request merges Keith Busch
2016-02-10 18:36   ` Christoph Hellwig
2016-02-10 18:37     ` Jens Axboe
2016-02-10 21:01       ` Keith Busch
2016-02-10 21:19         ` Jens Axboe
2016-02-11 12:15   ` Johannes Thumshirn
2016-02-11 12:33   ` Sagi Grimberg
2016-02-10 18:17 ` [PATCH for-4.5 04/13] NVMe: Set queue limits max_dev_sectors Keith Busch
2016-02-10 18:20   ` Christoph Hellwig
2016-02-10 18:24     ` Keith Busch
2016-02-10 18:40       ` Christoph Hellwig
2016-02-10 19:49         ` Keith Busch
2016-02-10 22:53           ` Martin K. Petersen
2016-02-10 18:17 ` [PATCH for-4.5 05/13] NVMe: Fix namespace removal deadlock Keith Busch
2016-02-11 12:19   ` Johannes Thumshirn
2016-02-11 16:38   ` Wenbo Wang
2016-02-10 18:17 ` [PATCH for-4.5 06/13] NVMe: Remove WQ_MEM_RECLAIM from nvme work queue Keith Busch
2016-02-10 18:46   ` Christoph Hellwig
2016-02-10 23:37     ` Keith Busch [this message]
2016-02-11 14:52     ` Keith Busch
2016-02-10 18:17 ` [PATCH for-4.5 07/13] NVMe: Requeue requests on suspended queues Keith Busch
2016-02-10 18:47   ` Christoph Hellwig
2016-02-11 12:22   ` Johannes Thumshirn
2016-02-11 12:41   ` Sagi Grimberg
2016-02-11 16:47   ` Wenbo Wang
2016-02-11 17:00     ` Keith Busch
2016-02-11 17:21       ` Wenbo Wang
2016-02-10 18:17 ` [PATCH for-4.5 08/13] NVMe: Poll device while still active during remove Keith Busch
2016-02-10 18:48   ` Christoph Hellwig
2016-02-11 12:26   ` Johannes Thumshirn
2016-02-11 12:42   ` Sagi Grimberg
2016-02-10 18:17 ` [PATCH for-4.5 09/13] NVMe: Simplify device reset failure Keith Busch
2016-02-10 18:53   ` Christoph Hellwig
2016-02-11 12:28   ` Johannes Thumshirn
2016-02-10 18:17 ` [PATCH for-4.5 10/13] NVMe: Move error handling to failed reset handler Keith Busch
2016-02-11 12:34   ` Johannes Thumshirn
2016-02-11 12:50   ` Sagi Grimberg
2016-02-11 15:11     ` Keith Busch
2016-02-10 18:17 ` [PATCH for-4.5 11/13] NVMe: Dead namespace handling Keith Busch
2016-02-11 12:43   ` Johannes Thumshirn
2016-02-11 12:59   ` Sagi Grimberg
2016-02-11 15:07     ` Keith Busch
2016-02-10 18:17 ` [PATCH for-4.5 12/13] NVMe: Mark queues as dead on degraded controller Keith Busch
2016-02-11 12:44   ` Johannes Thumshirn
2016-02-11 13:00   ` Sagi Grimberg
2016-02-10 18:17 ` [PATCH for-4.5 13/13] NVMe: Rate limit nvme IO warnings Keith Busch
2016-02-10 18:54   ` Christoph Hellwig
2016-02-10 21:10     ` Keith Busch
2016-02-11 12:29       ` Sagi Grimberg
2016-02-11 15:12         ` Keith Busch
2016-02-11 15:18           ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160210233747.GA25988@localhost.localdomain \
    --to=keith.busch@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).