Print this page
OS-881 To workaround OS-580 add support to only invalidate mappings from a single process
        
*** 7306,7316 ****
          }
  
          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);
  
          if (attr) {
                  pageprot = attr & ~(SHARED|PRIVATE);
                  segtype = (attr & SHARED) ? MAP_SHARED : MAP_PRIVATE;
  
--- 7306,7317 ----
          }
  
          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_INVALCURPROC) ? (B_INVALCURONLY | B_INVAL) : 0);
  
          if (attr) {
                  pageprot = attr & ~(SHARED|PRIVATE);
                  segtype = (attr & SHARED) ? MAP_SHARED : MAP_PRIVATE;
  
*** 7331,7345 ****
                          prot = svd->prot;
                  } else
                          vpp = &svd->vpage[seg_page(seg, addr)];
  
          } else if (svd->vp && svd->amp == NULL &&
!             (flags & MS_INVALIDATE) == 0) {
  
                  /*
!                  * No attributes, no anonymous pages and MS_INVALIDATE flag
!                  * is 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);
--- 7332,7346 ----
                          prot = svd->prot;
                  } else
                          vpp = &svd->vpage[seg_page(seg, addr)];
  
          } else if (svd->vp && svd->amp == NULL &&
!             (flags & (MS_INVALIDATE | MS_INVALCURPROC)) == 0) {
  
                  /*
!                  * 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,7397 ****
                   * 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 ((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);
--- 7388,7398 ----
                   * 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 | 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);