bool vma_is_secretmem(struct vm_area_struct *vma);
 bool page_is_secretmem(struct page *page);
+bool secretmem_active(void);
 
 #else
 
        return false;
 }
 
+static inline bool secretmem_active(void)
+{
+       return false;
+}
+
 #endif /* CONFIG_SECRETMEM */
 
 #endif /* _LINUX_SECRETMEM_H */
 
 #include <linux/genhd.h>
 #include <linux/ktime.h>
 #include <linux/security.h>
+#include <linux/secretmem.h>
 #include <trace/events/power.h>
 
 #include "power.h"
 
 bool hibernation_available(void)
 {
-       return nohibernate == 0 && !security_locked_down(LOCKDOWN_HIBERNATION);
+       return nohibernate == 0 &&
+               !security_locked_down(LOCKDOWN_HIBERNATION) &&
+               !secretmem_active();
 }
 
 /**
 
 
 static struct cma *secretmem_cma;
 
+static atomic_t secretmem_users;
+
+bool secretmem_active(void)
+{
+       return !!atomic_read(&secretmem_users);
+}
+
 static int secretmem_account_pages(struct page *page, gfp_t gfp, int order)
 {
        int err;
        .fault = secretmem_fault,
 };
 
+static int secretmem_release(struct inode *inode, struct file *file)
+{
+       atomic_dec(&secretmem_users);
+       return 0;
+}
+
 static int secretmem_mmap(struct file *file, struct vm_area_struct *vma)
 {
        unsigned long len = vma->vm_end - vma->vm_start;
 }
 
 static const struct file_operations secretmem_fops = {
+       .release        = secretmem_release,
        .mmap           = secretmem_mmap,
 };
 
        file->f_flags |= O_LARGEFILE;
 
        fd_install(fd, file);
+       atomic_inc(&secretmem_users);
        return fd;
 
 err_put_fd: