+static int check_enough_available_memory(size_t num_bytes_requested_per_cpu)
+{
+ int ret;
+ long num_cpu;
+ size_t best_mem_info;
+ size_t num_bytes_requested_total;
+
+ /*
+ * Get the number of CPU currently online to compute the amount of
+ * memory needed to create a buffer for every CPU.
+ */
+ num_cpu = sysconf(_SC_NPROCESSORS_ONLN);
+ if (num_cpu == -1) {
+ goto error;
+ }
+
+ num_bytes_requested_total = num_bytes_requested_per_cpu * num_cpu;
+
+ /*
+ * Try to get the `MemAvail` field of `/proc/meminfo`. This is the most
+ * reliable estimate we can get but it is only exposed by the kernel
+ * since 3.14. (See Linux kernel commit:
+ * 34e431b0ae398fc54ea69ff85ec700722c9da773)
+ */
+ ret = utils_get_memory_available(&best_mem_info);
+ if (ret >= 0) {
+ goto success;
+ }
+
+ /*
+ * As a backup plan, use `MemTotal` field of `/proc/meminfo`. This
+ * is a sanity check for obvious user error.
+ */
+ ret = utils_get_memory_total(&best_mem_info);
+ if (ret >= 0) {
+ goto success;
+ }
+
+error:
+ return -1;
+success:
+ return best_mem_info >= num_bytes_requested_total;
+}
+