int writable;
        bool folio_in_pagecache = false;
 
+       if (uffd_flags_mode_is(flags, MFILL_ATOMIC_POISON)) {
+               ptl = huge_pte_lock(h, dst_mm, dst_pte);
+
+               /* Don't overwrite any existing PTEs (even markers) */
+               if (!huge_pte_none(huge_ptep_get(dst_pte))) {
+                       spin_unlock(ptl);
+                       return -EEXIST;
+               }
+
+               _dst_pte = make_pte_marker(PTE_MARKER_POISONED);
+               set_huge_pte_at(dst_mm, dst_addr, dst_pte, _dst_pte);
+
+               /* No need to invalidate - it was non-present before */
+               update_mmu_cache(dst_vma, dst_addr, dst_pte);
+
+               spin_unlock(ptl);
+               return 0;
+       }
+
        if (is_continue) {
                ret = -EFAULT;
                folio = filemap_lock_folio(mapping, idx);
 
         * by THP.  Since we can not reliably insert a zero page, this
         * feature is not supported.
         */
-       if (uffd_flags_mode_is(flags, MFILL_ATOMIC_ZEROPAGE) ||
-           uffd_flags_mode_is(flags, MFILL_ATOMIC_POISON)) {
+       if (uffd_flags_mode_is(flags, MFILL_ATOMIC_ZEROPAGE)) {
                mmap_read_unlock(dst_mm);
                return -EINVAL;
        }