Print this page
OS-881 To workaround OS-580 add support to only invalidate mappings from a single process
        
@@ -7306,11 +7306,12 @@
         }
 
         vpp = svd->vpage;
         offset = svd->offset + (uintptr_t)(addr - seg->s_base);
         bflags = ((flags & MS_ASYNC) ? B_ASYNC : 0) |
-            ((flags & MS_INVALIDATE) ? B_INVAL : 0);
+            ((flags & MS_INVALIDATE) ? B_INVAL : 0) |
+            ((flags & MS_INVALCURPROC) ? (B_INVALCURONLY | B_INVAL) : 0);
 
         if (attr) {
                 pageprot = attr & ~(SHARED|PRIVATE);
                 segtype = (attr & SHARED) ? MAP_SHARED : MAP_PRIVATE;
 
@@ -7331,15 +7332,15 @@
                         prot = svd->prot;
                 } else
                         vpp = &svd->vpage[seg_page(seg, addr)];
 
         } else if (svd->vp && svd->amp == NULL &&
-            (flags & MS_INVALIDATE) == 0) {
+            (flags & (MS_INVALIDATE | MS_INVALCURPROC)) == 0) {
 
                 /*
-                 * No attributes, no anonymous pages and MS_INVALIDATE flag
-                 * is not on, just use one big request.
+                 * No attributes, no anonymous pages and MS_INVAL* flags
+                 * are not on, just use one big request.
                  */
                 err = VOP_PUTPAGE(svd->vp, (offset_t)offset, len,
                     bflags, svd->cred, NULL);
                 SEGVN_LOCK_EXIT(seg->s_as, &svd->lock);
                 return (err);
@@ -7387,11 +7388,11 @@
                  * locked one. We don't need the page_struct_lock to test
                  * as this is only advisory; even if we acquire it someone
                  * might race in and lock the page after we unlock and before
                  * we do the PUTPAGE, then PUTPAGE simply does nothing.
                  */
-                if (flags & MS_INVALIDATE) {
+                if (flags & (MS_INVALIDATE | MS_INVALCURPROC)) {
                         if ((pp = page_lookup(vp, off, SE_SHARED)) != NULL) {
                                 if (pp->p_lckcnt != 0 || pp->p_cowcnt != 0) {
                                         page_unlock(pp);
                                         SEGVN_LOCK_EXIT(seg->s_as, &svd->lock);
                                         return (EBUSY);