diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2016-01-12 05:01:12 -0500 |
commit | 1f16f116b01c110db20ab808562c8b8bc3ee3d6e (patch) | |
tree | 44db563f64cf5f8d62af8f99a61e2b248c44ea3a /mm/backing-dev.c | |
parent | 03724ac3d48f8f0e3caf1d30fa134f8fd96c94e2 (diff) | |
parent | f9eccf24615672896dc13251410c3f2f33a14f95 (diff) |
Merge branches 'clockevents/4.4-fixes' and 'clockevents/4.5-fixes' of http://git.linaro.org/people/daniel.lezcano/linux into timers/urgent
Pull in fixes from Daniel Lezcano:
- Fix the vt8500 timer leading to a system lock up when dealing with too
small delta (Roman Volkov)
- Select the CLKSRC_MMIO when the fsl_ftm_timer is enabled with COMPILE_TEST
(Daniel Lezcano)
- Prevent to compile timers using the 'iomem' API when the architecture has
not HAS_IOMEM set (Richard Weinberger)
Diffstat (limited to 'mm/backing-dev.c')
-rw-r--r-- | mm/backing-dev.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 8ed2ffd963c5..7340353f8aea 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c | |||
@@ -957,8 +957,9 @@ EXPORT_SYMBOL(congestion_wait); | |||
957 | * jiffies for either a BDI to exit congestion of the given @sync queue | 957 | * jiffies for either a BDI to exit congestion of the given @sync queue |
958 | * or a write to complete. | 958 | * or a write to complete. |
959 | * | 959 | * |
960 | * In the absence of zone congestion, cond_resched() is called to yield | 960 | * In the absence of zone congestion, a short sleep or a cond_resched is |
961 | * the processor if necessary but otherwise does not sleep. | 961 | * performed to yield the processor and to allow other subsystems to make |
962 | * a forward progress. | ||
962 | * | 963 | * |
963 | * The return value is 0 if the sleep is for the full timeout. Otherwise, | 964 | * The return value is 0 if the sleep is for the full timeout. Otherwise, |
964 | * it is the number of jiffies that were still remaining when the function | 965 | * it is the number of jiffies that were still remaining when the function |
@@ -978,7 +979,19 @@ long wait_iff_congested(struct zone *zone, int sync, long timeout) | |||
978 | */ | 979 | */ |
979 | if (atomic_read(&nr_wb_congested[sync]) == 0 || | 980 | if (atomic_read(&nr_wb_congested[sync]) == 0 || |
980 | !test_bit(ZONE_CONGESTED, &zone->flags)) { | 981 | !test_bit(ZONE_CONGESTED, &zone->flags)) { |
981 | cond_resched(); | 982 | |
983 | /* | ||
984 | * Memory allocation/reclaim might be called from a WQ | ||
985 | * context and the current implementation of the WQ | ||
986 | * concurrency control doesn't recognize that a particular | ||
987 | * WQ is congested if the worker thread is looping without | ||
988 | * ever sleeping. Therefore we have to do a short sleep | ||
989 | * here rather than calling cond_resched(). | ||
990 | */ | ||
991 | if (current->flags & PF_WQ_WORKER) | ||
992 | schedule_timeout(1); | ||
993 | else | ||
994 | cond_resched(); | ||
982 | 995 | ||
983 | /* In case we scheduled, work out time remaining */ | 996 | /* In case we scheduled, work out time remaining */ |
984 | ret = timeout - (jiffies - start); | 997 | ret = timeout - (jiffies - start); |