Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull core updates (RCU and locking) from Ingo Molnar:
"Most of the diffstat comes from the RCU slow boot regression fixes,
but there's also a debuggability improvements/fixes."

* 'core-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
memblock: Document memblock_is_region_{memory,reserved}()
rcu: Precompute RCU_FAST_NO_HZ timer offsets
rcu: Move RCU_FAST_NO_HZ per-CPU variables to rcu_dynticks structure
rcu: Update RCU_FAST_NO_HZ tracing for lazy callbacks
rcu: RCU_FAST_NO_HZ detection of callback adoption
spinlock: Indicate that a lockup is only suspected
kdump: Execute kmsg_dump(KMSG_DUMP_PANIC) after smp_send_stop()
panic: Make panic_on_oops configurable

+160 -85
+4 -2
include/linux/rcutiny.h
··· 87 87 88 88 #ifdef CONFIG_TINY_RCU 89 89 90 - static inline int rcu_needs_cpu(int cpu) 90 + static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) 91 91 { 92 + *delta_jiffies = ULONG_MAX; 92 93 return 0; 93 94 } 94 95 ··· 97 96 98 97 int rcu_preempt_needs_cpu(void); 99 98 100 - static inline int rcu_needs_cpu(int cpu) 99 + static inline int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) 101 100 { 101 + *delta_jiffies = ULONG_MAX; 102 102 return rcu_preempt_needs_cpu(); 103 103 } 104 104
+1 -1
include/linux/rcutree.h
··· 32 32 33 33 extern void rcu_init(void); 34 34 extern void rcu_note_context_switch(int cpu); 35 - extern int rcu_needs_cpu(int cpu); 35 + extern int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies); 36 36 extern void rcu_cpu_stall_reset(void); 37 37 38 38 /*
+1
include/trace/events/rcu.h
··· 289 289 * "In holdoff": Nothing to do, holding off after unsuccessful attempt. 290 290 * "Begin holdoff": Attempt failed, don't retry until next jiffy. 291 291 * "Dyntick with callbacks": Entering dyntick-idle despite callbacks. 292 + * "Dyntick with lazy callbacks": Entering dyntick-idle w/lazy callbacks. 292 293 * "More callbacks": Still more callbacks, try again to clear them out. 293 294 * "Callbacks drained": All callbacks processed, off to dyntick idle! 294 295 * "Timer": Timer fired to cause CPU to continue processing callbacks.
+3 -3
kernel/panic.c
··· 27 27 #define PANIC_TIMER_STEP 100 28 28 #define PANIC_BLINK_SPD 18 29 29 30 - int panic_on_oops; 30 + int panic_on_oops = CONFIG_PANIC_ON_OOPS_VALUE; 31 31 static unsigned long tainted_mask; 32 32 static int pause_on_oops; 33 33 static int pause_on_oops_flag; ··· 108 108 */ 109 109 crash_kexec(NULL); 110 110 111 - kmsg_dump(KMSG_DUMP_PANIC); 112 - 113 111 /* 114 112 * Note smp_send_stop is the usual smp shutdown function, which 115 113 * unfortunately means it may not be hardened to work in a panic 116 114 * situation. 117 115 */ 118 116 smp_send_stop(); 117 + 118 + kmsg_dump(KMSG_DUMP_PANIC); 119 119 120 120 atomic_notifier_call_chain(&panic_notifier_list, 0, buf); 121 121
+2
kernel/rcutree.c
··· 1397 1397 rdp->qlen_lazy += rsp->qlen_lazy; 1398 1398 rdp->qlen += rsp->qlen; 1399 1399 rdp->n_cbs_adopted += rsp->qlen; 1400 + if (rsp->qlen_lazy != rsp->qlen) 1401 + rcu_idle_count_callbacks_posted(); 1400 1402 rsp->qlen_lazy = 0; 1401 1403 rsp->qlen = 0; 1402 1404
+14
kernel/rcutree.h
··· 84 84 /* Process level is worth LLONG_MAX/2. */ 85 85 int dynticks_nmi_nesting; /* Track NMI nesting level. */ 86 86 atomic_t dynticks; /* Even value for idle, else odd. */ 87 + #ifdef CONFIG_RCU_FAST_NO_HZ 88 + int dyntick_drain; /* Prepare-for-idle state variable. */ 89 + unsigned long dyntick_holdoff; 90 + /* No retries for the jiffy of failure. */ 91 + struct timer_list idle_gp_timer; 92 + /* Wake up CPU sleeping with callbacks. */ 93 + unsigned long idle_gp_timer_expires; 94 + /* When to wake up CPU (for repost). */ 95 + bool idle_first_pass; /* First pass of attempt to go idle? */ 96 + unsigned long nonlazy_posted; 97 + /* # times non-lazy CBs posted to CPU. */ 98 + unsigned long nonlazy_posted_snap; 99 + /* idle-period nonlazy_posted snapshot. */ 100 + #endif /* #ifdef CONFIG_RCU_FAST_NO_HZ */ 87 101 }; 88 102 89 103 /* RCU's kthread states for tracing. */
+88 -77
kernel/rcutree_plugin.h
··· 1886 1886 * Because we not have RCU_FAST_NO_HZ, just check whether this CPU needs 1887 1887 * any flavor of RCU. 1888 1888 */ 1889 - int rcu_needs_cpu(int cpu) 1889 + int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) 1890 1890 { 1891 + *delta_jiffies = ULONG_MAX; 1891 1892 return rcu_cpu_has_callbacks(cpu); 1892 1893 } 1893 1894 ··· 1963 1962 #define RCU_IDLE_GP_DELAY 6 /* Roughly one grace period. */ 1964 1963 #define RCU_IDLE_LAZY_GP_DELAY (6 * HZ) /* Roughly six seconds. */ 1965 1964 1966 - /* Loop counter for rcu_prepare_for_idle(). */ 1967 - static DEFINE_PER_CPU(int, rcu_dyntick_drain); 1968 - /* If rcu_dyntick_holdoff==jiffies, don't try to enter dyntick-idle mode. */ 1969 - static DEFINE_PER_CPU(unsigned long, rcu_dyntick_holdoff); 1970 - /* Timer to awaken the CPU if it enters dyntick-idle mode with callbacks. */ 1971 - static DEFINE_PER_CPU(struct timer_list, rcu_idle_gp_timer); 1972 - /* Scheduled expiry time for rcu_idle_gp_timer to allow reposting. */ 1973 - static DEFINE_PER_CPU(unsigned long, rcu_idle_gp_timer_expires); 1974 - /* Enable special processing on first attempt to enter dyntick-idle mode. */ 1975 - static DEFINE_PER_CPU(bool, rcu_idle_first_pass); 1976 - /* Running count of non-lazy callbacks posted, never decremented. */ 1977 - static DEFINE_PER_CPU(unsigned long, rcu_nonlazy_posted); 1978 - /* Snapshot of rcu_nonlazy_posted to detect meaningful exits from idle. */ 1979 - static DEFINE_PER_CPU(unsigned long, rcu_nonlazy_posted_snap); 1980 - 1981 - /* 1982 - * Allow the CPU to enter dyntick-idle mode if either: (1) There are no 1983 - * callbacks on this CPU, (2) this CPU has not yet attempted to enter 1984 - * dyntick-idle mode, or (3) this CPU is in the process of attempting to 1985 - * enter dyntick-idle mode. Otherwise, if we have recently tried and failed 1986 - * to enter dyntick-idle mode, we refuse to try to enter it. After all, 1987 - * it is better to incur scheduling-clock interrupts than to spin 1988 - * continuously for the same time duration! 1989 - */ 1990 - int rcu_needs_cpu(int cpu) 1991 - { 1992 - /* Flag a new idle sojourn to the idle-entry state machine. */ 1993 - per_cpu(rcu_idle_first_pass, cpu) = 1; 1994 - /* If no callbacks, RCU doesn't need the CPU. */ 1995 - if (!rcu_cpu_has_callbacks(cpu)) 1996 - return 0; 1997 - /* Otherwise, RCU needs the CPU only if it recently tried and failed. */ 1998 - return per_cpu(rcu_dyntick_holdoff, cpu) == jiffies; 1999 - } 2000 - 2001 1965 /* 2002 1966 * Does the specified flavor of RCU have non-lazy callbacks pending on 2003 1967 * the specified CPU? Both RCU flavor and CPU are specified by the ··· 2006 2040 } 2007 2041 2008 2042 /* 2043 + * Allow the CPU to enter dyntick-idle mode if either: (1) There are no 2044 + * callbacks on this CPU, (2) this CPU has not yet attempted to enter 2045 + * dyntick-idle mode, or (3) this CPU is in the process of attempting to 2046 + * enter dyntick-idle mode. Otherwise, if we have recently tried and failed 2047 + * to enter dyntick-idle mode, we refuse to try to enter it. After all, 2048 + * it is better to incur scheduling-clock interrupts than to spin 2049 + * continuously for the same time duration! 2050 + * 2051 + * The delta_jiffies argument is used to store the time when RCU is 2052 + * going to need the CPU again if it still has callbacks. The reason 2053 + * for this is that rcu_prepare_for_idle() might need to post a timer, 2054 + * but if so, it will do so after tick_nohz_stop_sched_tick() has set 2055 + * the wakeup time for this CPU. This means that RCU's timer can be 2056 + * delayed until the wakeup time, which defeats the purpose of posting 2057 + * a timer. 2058 + */ 2059 + int rcu_needs_cpu(int cpu, unsigned long *delta_jiffies) 2060 + { 2061 + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2062 + 2063 + /* Flag a new idle sojourn to the idle-entry state machine. */ 2064 + rdtp->idle_first_pass = 1; 2065 + /* If no callbacks, RCU doesn't need the CPU. */ 2066 + if (!rcu_cpu_has_callbacks(cpu)) { 2067 + *delta_jiffies = ULONG_MAX; 2068 + return 0; 2069 + } 2070 + if (rdtp->dyntick_holdoff == jiffies) { 2071 + /* RCU recently tried and failed, so don't try again. */ 2072 + *delta_jiffies = 1; 2073 + return 1; 2074 + } 2075 + /* Set up for the possibility that RCU will post a timer. */ 2076 + if (rcu_cpu_has_nonlazy_callbacks(cpu)) 2077 + *delta_jiffies = RCU_IDLE_GP_DELAY; 2078 + else 2079 + *delta_jiffies = RCU_IDLE_LAZY_GP_DELAY; 2080 + return 0; 2081 + } 2082 + 2083 + /* 2009 2084 * Handler for smp_call_function_single(). The only point of this 2010 2085 * handler is to wake the CPU up, so the handler does only tracing. 2011 2086 */ ··· 2082 2075 */ 2083 2076 static void rcu_prepare_for_idle_init(int cpu) 2084 2077 { 2085 - per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1; 2086 - setup_timer(&per_cpu(rcu_idle_gp_timer, cpu), 2087 - rcu_idle_gp_timer_func, cpu); 2088 - per_cpu(rcu_idle_gp_timer_expires, cpu) = jiffies - 1; 2089 - per_cpu(rcu_idle_first_pass, cpu) = 1; 2078 + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2079 + 2080 + rdtp->dyntick_holdoff = jiffies - 1; 2081 + setup_timer(&rdtp->idle_gp_timer, rcu_idle_gp_timer_func, cpu); 2082 + rdtp->idle_gp_timer_expires = jiffies - 1; 2083 + rdtp->idle_first_pass = 1; 2090 2084 } 2091 2085 2092 2086 /* 2093 2087 * Clean up for exit from idle. Because we are exiting from idle, there 2094 - * is no longer any point to rcu_idle_gp_timer, so cancel it. This will 2088 + * is no longer any point to ->idle_gp_timer, so cancel it. This will 2095 2089 * do nothing if this timer is not active, so just cancel it unconditionally. 2096 2090 */ 2097 2091 static void rcu_cleanup_after_idle(int cpu) 2098 2092 { 2099 - del_timer(&per_cpu(rcu_idle_gp_timer, cpu)); 2093 + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2094 + 2095 + del_timer(&rdtp->idle_gp_timer); 2100 2096 trace_rcu_prep_idle("Cleanup after idle"); 2101 2097 } 2102 2098 ··· 2118 2108 * Because it is not legal to invoke rcu_process_callbacks() with irqs 2119 2109 * disabled, we do one pass of force_quiescent_state(), then do a 2120 2110 * invoke_rcu_core() to cause rcu_process_callbacks() to be invoked 2121 - * later. The per-cpu rcu_dyntick_drain variable controls the sequencing. 2111 + * later. The ->dyntick_drain field controls the sequencing. 2122 2112 * 2123 2113 * The caller must have disabled interrupts. 2124 2114 */ 2125 2115 static void rcu_prepare_for_idle(int cpu) 2126 2116 { 2127 2117 struct timer_list *tp; 2118 + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2128 2119 2129 2120 /* 2130 2121 * If this is an idle re-entry, for example, due to use of 2131 2122 * RCU_NONIDLE() or the new idle-loop tracing API within the idle 2132 2123 * loop, then don't take any state-machine actions, unless the 2133 2124 * momentary exit from idle queued additional non-lazy callbacks. 2134 - * Instead, repost the rcu_idle_gp_timer if this CPU has callbacks 2125 + * Instead, repost the ->idle_gp_timer if this CPU has callbacks 2135 2126 * pending. 2136 2127 */ 2137 - if (!per_cpu(rcu_idle_first_pass, cpu) && 2138 - (per_cpu(rcu_nonlazy_posted, cpu) == 2139 - per_cpu(rcu_nonlazy_posted_snap, cpu))) { 2128 + if (!rdtp->idle_first_pass && 2129 + (rdtp->nonlazy_posted == rdtp->nonlazy_posted_snap)) { 2140 2130 if (rcu_cpu_has_callbacks(cpu)) { 2141 - tp = &per_cpu(rcu_idle_gp_timer, cpu); 2142 - mod_timer_pinned(tp, per_cpu(rcu_idle_gp_timer_expires, cpu)); 2131 + tp = &rdtp->idle_gp_timer; 2132 + mod_timer_pinned(tp, rdtp->idle_gp_timer_expires); 2143 2133 } 2144 2134 return; 2145 2135 } 2146 - per_cpu(rcu_idle_first_pass, cpu) = 0; 2147 - per_cpu(rcu_nonlazy_posted_snap, cpu) = 2148 - per_cpu(rcu_nonlazy_posted, cpu) - 1; 2136 + rdtp->idle_first_pass = 0; 2137 + rdtp->nonlazy_posted_snap = rdtp->nonlazy_posted - 1; 2149 2138 2150 2139 /* 2151 2140 * If there are no callbacks on this CPU, enter dyntick-idle mode. 2152 2141 * Also reset state to avoid prejudicing later attempts. 2153 2142 */ 2154 2143 if (!rcu_cpu_has_callbacks(cpu)) { 2155 - per_cpu(rcu_dyntick_holdoff, cpu) = jiffies - 1; 2156 - per_cpu(rcu_dyntick_drain, cpu) = 0; 2144 + rdtp->dyntick_holdoff = jiffies - 1; 2145 + rdtp->dyntick_drain = 0; 2157 2146 trace_rcu_prep_idle("No callbacks"); 2158 2147 return; 2159 2148 } ··· 2161 2152 * If in holdoff mode, just return. We will presumably have 2162 2153 * refrained from disabling the scheduling-clock tick. 2163 2154 */ 2164 - if (per_cpu(rcu_dyntick_holdoff, cpu) == jiffies) { 2155 + if (rdtp->dyntick_holdoff == jiffies) { 2165 2156 trace_rcu_prep_idle("In holdoff"); 2166 2157 return; 2167 2158 } 2168 2159 2169 - /* Check and update the rcu_dyntick_drain sequencing. */ 2170 - if (per_cpu(rcu_dyntick_drain, cpu) <= 0) { 2160 + /* Check and update the ->dyntick_drain sequencing. */ 2161 + if (rdtp->dyntick_drain <= 0) { 2171 2162 /* First time through, initialize the counter. */ 2172 - per_cpu(rcu_dyntick_drain, cpu) = RCU_IDLE_FLUSHES; 2173 - } else if (per_cpu(rcu_dyntick_drain, cpu) <= RCU_IDLE_OPT_FLUSHES && 2163 + rdtp->dyntick_drain = RCU_IDLE_FLUSHES; 2164 + } else if (rdtp->dyntick_drain <= RCU_IDLE_OPT_FLUSHES && 2174 2165 !rcu_pending(cpu) && 2175 2166 !local_softirq_pending()) { 2176 2167 /* Can we go dyntick-idle despite still having callbacks? */ 2177 - trace_rcu_prep_idle("Dyntick with callbacks"); 2178 - per_cpu(rcu_dyntick_drain, cpu) = 0; 2179 - per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; 2180 - if (rcu_cpu_has_nonlazy_callbacks(cpu)) 2181 - per_cpu(rcu_idle_gp_timer_expires, cpu) = 2168 + rdtp->dyntick_drain = 0; 2169 + rdtp->dyntick_holdoff = jiffies; 2170 + if (rcu_cpu_has_nonlazy_callbacks(cpu)) { 2171 + trace_rcu_prep_idle("Dyntick with callbacks"); 2172 + rdtp->idle_gp_timer_expires = 2182 2173 jiffies + RCU_IDLE_GP_DELAY; 2183 - else 2184 - per_cpu(rcu_idle_gp_timer_expires, cpu) = 2174 + } else { 2175 + rdtp->idle_gp_timer_expires = 2185 2176 jiffies + RCU_IDLE_LAZY_GP_DELAY; 2186 - tp = &per_cpu(rcu_idle_gp_timer, cpu); 2187 - mod_timer_pinned(tp, per_cpu(rcu_idle_gp_timer_expires, cpu)); 2188 - per_cpu(rcu_nonlazy_posted_snap, cpu) = 2189 - per_cpu(rcu_nonlazy_posted, cpu); 2177 + trace_rcu_prep_idle("Dyntick with lazy callbacks"); 2178 + } 2179 + tp = &rdtp->idle_gp_timer; 2180 + mod_timer_pinned(tp, rdtp->idle_gp_timer_expires); 2181 + rdtp->nonlazy_posted_snap = rdtp->nonlazy_posted; 2190 2182 return; /* Nothing more to do immediately. */ 2191 - } else if (--per_cpu(rcu_dyntick_drain, cpu) <= 0) { 2183 + } else if (--(rdtp->dyntick_drain) <= 0) { 2192 2184 /* We have hit the limit, so time to give up. */ 2193 - per_cpu(rcu_dyntick_holdoff, cpu) = jiffies; 2185 + rdtp->dyntick_holdoff = jiffies; 2194 2186 trace_rcu_prep_idle("Begin holdoff"); 2195 2187 invoke_rcu_core(); /* Force the CPU out of dyntick-idle. */ 2196 2188 return; ··· 2237 2227 */ 2238 2228 static void rcu_idle_count_callbacks_posted(void) 2239 2229 { 2240 - __this_cpu_add(rcu_nonlazy_posted, 1); 2230 + __this_cpu_add(rcu_dynticks.nonlazy_posted, 1); 2241 2231 } 2242 2232 2243 2233 #endif /* #else #if !defined(CONFIG_RCU_FAST_NO_HZ) */ ··· 2248 2238 2249 2239 static void print_cpu_stall_fast_no_hz(char *cp, int cpu) 2250 2240 { 2251 - struct timer_list *tltp = &per_cpu(rcu_idle_gp_timer, cpu); 2241 + struct rcu_dynticks *rdtp = &per_cpu(rcu_dynticks, cpu); 2242 + struct timer_list *tltp = &rdtp->idle_gp_timer; 2252 2243 2253 2244 sprintf(cp, "drain=%d %c timer=%lu", 2254 - per_cpu(rcu_dyntick_drain, cpu), 2255 - per_cpu(rcu_dyntick_holdoff, cpu) == jiffies ? 'H' : '.', 2245 + rdtp->dyntick_drain, 2246 + rdtp->dyntick_holdoff == jiffies ? 'H' : '.', 2256 2247 timer_pending(tltp) ? tltp->expires - jiffies : -1); 2257 2248 } 2258 2249
+6 -1
kernel/time/tick-sched.c
··· 274 274 static void tick_nohz_stop_sched_tick(struct tick_sched *ts) 275 275 { 276 276 unsigned long seq, last_jiffies, next_jiffies, delta_jiffies; 277 + unsigned long rcu_delta_jiffies; 277 278 ktime_t last_update, expires, now; 278 279 struct clock_event_device *dev = __get_cpu_var(tick_cpu_device).evtdev; 279 280 u64 time_delta; ··· 323 322 time_delta = timekeeping_max_deferment(); 324 323 } while (read_seqretry(&xtime_lock, seq)); 325 324 326 - if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu) || 325 + if (rcu_needs_cpu(cpu, &rcu_delta_jiffies) || printk_needs_cpu(cpu) || 327 326 arch_needs_cpu(cpu)) { 328 327 next_jiffies = last_jiffies + 1; 329 328 delta_jiffies = 1; ··· 331 330 /* Get the next timer wheel timer */ 332 331 next_jiffies = get_next_timer_interrupt(last_jiffies); 333 332 delta_jiffies = next_jiffies - last_jiffies; 333 + if (rcu_delta_jiffies < delta_jiffies) { 334 + next_jiffies = last_jiffies + rcu_delta_jiffies; 335 + delta_jiffies = rcu_delta_jiffies; 336 + } 334 337 } 335 338 /* 336 339 * Do not stop the tick, if we are only one off
+20
lib/Kconfig.debug
··· 241 241 default 0 if !BOOTPARAM_SOFTLOCKUP_PANIC 242 242 default 1 if BOOTPARAM_SOFTLOCKUP_PANIC 243 243 244 + config PANIC_ON_OOPS 245 + bool "Panic on Oops" if EXPERT 246 + default n 247 + help 248 + Say Y here to enable the kernel to panic when it oopses. This 249 + has the same effect as setting oops=panic on the kernel command 250 + line. 251 + 252 + This feature is useful to ensure that the kernel does not do 253 + anything erroneous after an oops which could result in data 254 + corruption or other issues. 255 + 256 + Say N if unsure. 257 + 258 + config PANIC_ON_OOPS_VALUE 259 + int 260 + range 0 1 261 + default 0 if !PANIC_ON_OOPS 262 + default 1 if PANIC_ON_OOPS 263 + 244 264 config DETECT_HUNG_TASK 245 265 bool "Detect Hung Tasks" 246 266 depends on DEBUG_KERNEL
+1 -1
lib/spinlock_debug.c
··· 118 118 /* lockup suspected: */ 119 119 if (print_once) { 120 120 print_once = 0; 121 - spin_dump(lock, "lockup"); 121 + spin_dump(lock, "lockup suspected"); 122 122 #ifdef CONFIG_SMP 123 123 trigger_all_cpu_backtrace(); 124 124 #endif
+20
mm/memblock.c
··· 867 867 return memblock_search(&memblock.memory, addr) != -1; 868 868 } 869 869 870 + /** 871 + * memblock_is_region_memory - check if a region is a subset of memory 872 + * @base: base of region to check 873 + * @size: size of region to check 874 + * 875 + * Check if the region [@base, @base+@size) is a subset of a memory block. 876 + * 877 + * RETURNS: 878 + * 0 if false, non-zero if true 879 + */ 870 880 int __init_memblock memblock_is_region_memory(phys_addr_t base, phys_addr_t size) 871 881 { 872 882 int idx = memblock_search(&memblock.memory, base); ··· 889 879 memblock.memory.regions[idx].size) >= end; 890 880 } 891 881 882 + /** 883 + * memblock_is_region_reserved - check if a region intersects reserved memory 884 + * @base: base of region to check 885 + * @size: size of region to check 886 + * 887 + * Check if the region [@base, @base+@size) intersects a reserved memory block. 888 + * 889 + * RETURNS: 890 + * 0 if false, non-zero if true 891 + */ 892 892 int __init_memblock memblock_is_region_reserved(phys_addr_t base, phys_addr_t size) 893 893 { 894 894 memblock_cap_size(base, &size);