diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index 7ce45caaf9b0986cf7df794674e2f9cb4a40e00c..6ff1c7ea2aa9d11d12455916bd2676e5f9407531 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -795,6 +795,24 @@ dsm_pin_mapping(dsm_segment *seg)
 	}
 }
 
+/*
+ * Arrange to remove a dynamic shared memory mapping at cleanup time.
+ *
+ * dsm_pin_mapping() can be used to preserve a mapping for the entire
+ * lifetime of a process; this function reverses that decision, making
+ * the segment owned by the current resource owner.  This may be useful
+ * just before performing some operation that will invalidate the segment
+ * for future use by this backend.
+ */
+void
+dsm_unpin_mapping(dsm_segment *seg)
+{
+	Assert(seg->resowner == NULL);
+	ResourceOwnerEnlargeDSMs(CurrentResourceOwner);
+	seg->resowner = CurrentResourceOwner;
+	ResourceOwnerRememberDSM(seg->resowner, seg);
+}
+
 /*
  * Keep a dynamic shared memory segment until postmaster shutdown.
  *
diff --git a/src/include/storage/dsm.h b/src/include/storage/dsm.h
index a83b35fd6643d099c55cd3c7afd2faf0ea5af97d..cfe5d48e871c1560cbddd086a5feef0ad9dcb0b4 100644
--- a/src/include/storage/dsm.h
+++ b/src/include/storage/dsm.h
@@ -37,6 +37,7 @@ extern void dsm_detach(dsm_segment *seg);
 
 /* Resource management functions. */
 extern void dsm_pin_mapping(dsm_segment *seg);
+extern void dsm_unpin_mapping(dsm_segment *seg);
 extern void dsm_pin_segment(dsm_segment *seg);
 extern dsm_segment *dsm_find_mapping(dsm_handle h);