Print this page
patch lower-case-segops

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/vm/vm_as.c
          +++ new/usr/src/uts/common/vm/vm_as.c
↓ open down ↓ 700 lines elided ↑ open up ↑
 701  701  
 702  702          if (!free_started) {
 703  703                  free_started = B_TRUE;
 704  704                  hat_free_start(hat);
 705  705          }
 706  706          for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) {
 707  707                  int err;
 708  708  
 709  709                  next = AS_SEGNEXT(as, seg);
 710  710  retry:
 711      -                err = SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
      711 +                err = segop_unmap(seg, seg->s_base, seg->s_size);
 712  712                  if (err == EAGAIN) {
 713  713                          mutex_enter(&as->a_contents);
 714  714                          if (as->a_callbacks) {
 715  715                                  AS_LOCK_EXIT(as, &as->a_lock);
 716  716                          } else if (!AS_ISNOUNMAPWAIT(as)) {
 717  717                                  /*
 718  718                                   * Memory is currently locked. Wait for a
 719  719                                   * cv_signal that it has been unlocked, then
 720  720                                   * try the operation again.
 721  721                                   */
↓ open down ↓ 72 lines elided ↑ open up ↑
 794  794                  }
 795  795  
 796  796                  newseg = seg_alloc(newas, seg->s_base, seg->s_size);
 797  797                  if (newseg == NULL) {
 798  798                          AS_LOCK_EXIT(newas, &newas->a_lock);
 799  799                          as_setwatch(as);
 800  800                          AS_LOCK_EXIT(as, &as->a_lock);
 801  801                          as_free(newas);
 802  802                          return (-1);
 803  803                  }
 804      -                if ((error = SEGOP_DUP(seg, newseg)) != 0) {
      804 +                if ((error = segop_dup(seg, newseg)) != 0) {
 805  805                          /*
 806  806                           * We call seg_free() on the new seg
 807  807                           * because the segment is not set up
 808  808                           * completely; i.e. it has no ops.
 809  809                           */
 810  810                          as_setwatch(as);
 811  811                          AS_LOCK_EXIT(as, &as->a_lock);
 812  812                          seg_free(newseg);
 813  813                          AS_LOCK_EXIT(newas, &newas->a_lock);
 814  814                          as_free(newas);
↓ open down ↓ 118 lines elided ↑ open up ↑
 933  933                          if (seg == NULL || raddr != seg->s_base) {
 934  934                                  res = FC_NOMAP;
 935  935                                  break;
 936  936                          }
 937  937                  }
 938  938                  if (raddr + rsize > seg->s_base + seg->s_size)
 939  939                          ssize = seg->s_base + seg->s_size - raddr;
 940  940                  else
 941  941                          ssize = rsize;
 942  942  
 943      -                res = SEGOP_FAULT(hat, seg, raddr, ssize, type, rw);
      943 +                res = segop_fault(hat, seg, raddr, ssize, type, rw);
 944  944  
 945  945                  /* Restore watchpoints */
 946  946                  if (holding_wpage) {
 947  947                          as_setwatch(as);
 948  948                          holding_wpage = 0;
 949  949                  }
 950  950  
 951  951                  if (res != 0)
 952  952                          break;
 953  953          }
↓ open down ↓ 11 lines elided ↑ open up ↑
 965  965                          ASSERT(seg != NULL);
 966  966                          /*
 967  967                           * Now call the fault routine again to perform the
 968  968                           * unlock using S_OTHER instead of the rw variable
 969  969                           * since we never got a chance to touch the pages.
 970  970                           */
 971  971                          if (raddr > seg->s_base + seg->s_size)
 972  972                                  ssize = seg->s_base + seg->s_size - addrsav;
 973  973                          else
 974  974                                  ssize = raddr - addrsav;
 975      -                        (void) SEGOP_FAULT(hat, seg, addrsav, ssize,
      975 +                        (void) segop_fault(hat, seg, addrsav, ssize,
 976  976                              F_SOFTUNLOCK, S_OTHER);
 977  977                  }
 978  978          }
 979  979          if (as_lock_held)
 980  980                  AS_LOCK_EXIT(as, &as->a_lock);
 981  981          if (lwp != NULL)
 982  982                  lwp->lwp_nostop--;
 983  983  
 984  984          /*
 985  985           * If the lower levels returned EDEADLK for a fault,
↓ open down ↓ 49 lines elided ↑ open up ↑
1035 1035          }
1036 1036  
1037 1037          for (; rsize != 0; rsize -= PAGESIZE, raddr += PAGESIZE) {
1038 1038                  if (raddr >= seg->s_base + seg->s_size) {
1039 1039                          seg = AS_SEGNEXT(as, seg);
1040 1040                          if (seg == NULL || raddr != seg->s_base) {
1041 1041                                  res = FC_NOMAP;
1042 1042                                  break;
1043 1043                          }
1044 1044                  }
1045      -                res = SEGOP_FAULTA(seg, raddr);
     1045 +                res = segop_faulta(seg, raddr);
1046 1046                  if (res != 0)
1047 1047                          break;
1048 1048          }
1049 1049          AS_LOCK_EXIT(as, &as->a_lock);
1050 1050          if (lwp != NULL)
1051 1051                  lwp->lwp_nostop--;
1052 1052          /*
1053 1053           * If the lower levels returned EDEADLK for a fault,
1054 1054           * It means that we should retry the fault.  Let's wait
1055 1055           * a bit also to let the deadlock causing condition clear.
↓ open down ↓ 69 lines elided ↑ open up ↑
1125 1125                          if (seg == NULL || raddr != seg->s_base) {
1126 1126                                  error = ENOMEM;
1127 1127                                  break;
1128 1128                          }
1129 1129                  }
1130 1130                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
1131 1131                          ssize = seg->s_base + seg->s_size - raddr;
1132 1132                  else
1133 1133                          ssize = rsize;
1134 1134  retry:
1135      -                error = SEGOP_SETPROT(seg, raddr, ssize, prot);
     1135 +                error = segop_setprot(seg, raddr, ssize, prot);
1136 1136  
1137 1137                  if (error == IE_NOMEM) {
1138 1138                          error = EAGAIN;
1139 1139                          break;
1140 1140                  }
1141 1141  
1142 1142                  if (error == IE_RETRY) {
1143 1143                          AS_LOCK_EXIT(as, &as->a_lock);
1144 1144                          writer = 1;
1145 1145                          goto setprot_top;
↓ open down ↓ 130 lines elided ↑ open up ↑
1276 1276                          if (seg == NULL || raddr != seg->s_base) {
1277 1277                                  error = ENOMEM;
1278 1278                                  break;
1279 1279                          }
1280 1280                  }
1281 1281                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
1282 1282                          ssize = seg->s_base + seg->s_size - raddr;
1283 1283                  else
1284 1284                          ssize = rsize;
1285 1285  
1286      -                error = SEGOP_CHECKPROT(seg, raddr, ssize, prot);
     1286 +                error = segop_checkprot(seg, raddr, ssize, prot);
1287 1287                  if (error != 0)
1288 1288                          break;
1289 1289          }
1290 1290          as_setwatch(as);
1291 1291          AS_LOCK_EXIT(as, &as->a_lock);
1292 1292          return (error);
1293 1293  }
1294 1294  
1295 1295  int
1296 1296  as_unmap(struct as *as, caddr_t addr, size_t size)
↓ open down ↓ 45 lines elided ↑ open up ↑
1342 1342                   * We didn't count /dev/null mappings, so ignore them here.
1343 1343                   * We'll handle MAP_NORESERVE cases in segvn_unmap(). (Again,
1344 1344                   * we have to do this check here while we have seg.)
1345 1345                   */
1346 1346                  rsize = 0;
1347 1347                  if (!SEG_IS_DEVNULL_MAPPING(seg) &&
1348 1348                      !SEG_IS_PARTIAL_RESV(seg))
1349 1349                          rsize = ssize;
1350 1350  
1351 1351  retry:
1352      -                err = SEGOP_UNMAP(seg, raddr, ssize);
     1352 +                err = segop_unmap(seg, raddr, ssize);
1353 1353                  if (err == EAGAIN) {
1354 1354                          /*
1355 1355                           * Memory is currently locked.  It must be unlocked
1356 1356                           * before this operation can succeed through a retry.
1357 1357                           * The possible reasons for locked memory and
1358 1358                           * corresponding strategies for unlocking are:
1359 1359                           * (1) Normal I/O
1360 1360                           *      wait for a signal that the I/O operation
1361 1361                           *      has completed and the memory is unlocked.
1362 1362                           * (2) Asynchronous I/O
↓ open down ↓ 417 lines elided ↑ open up ↑
1780 1780           */
1781 1781          if ((as->a_flags & AS_NEEDSPURGE) == 0)
1782 1782                  return;
1783 1783  
1784 1784          AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
1785 1785          next_seg = NULL;
1786 1786          seg = AS_SEGFIRST(as);
1787 1787          while (seg != NULL) {
1788 1788                  next_seg = AS_SEGNEXT(as, seg);
1789 1789                  if (seg->s_flags & S_PURGE)
1790      -                        SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
     1790 +                        segop_unmap(seg, seg->s_base, seg->s_size);
1791 1791                  seg = next_seg;
1792 1792          }
1793 1793          AS_LOCK_EXIT(as, &as->a_lock);
1794 1794  
1795 1795          mutex_enter(&as->a_contents);
1796 1796          as->a_flags &= ~AS_NEEDSPURGE;
1797 1797          mutex_exit(&as->a_contents);
1798 1798  }
1799 1799  
1800 1800  /*
↓ open down ↓ 291 lines elided ↑ open up ↑
2092 2092                          seg = AS_SEGNEXT(as, seg);
2093 2093                          if (seg == NULL || raddr != seg->s_base) {
2094 2094                                  error = -1;
2095 2095                                  break;
2096 2096                          }
2097 2097                  }
2098 2098                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
2099 2099                          ssize = seg->s_base + seg->s_size - raddr;
2100 2100                  else
2101 2101                          ssize = rsize;
2102      -                *sizep += isize = SEGOP_INCORE(seg, raddr, ssize, vec);
     2102 +                *sizep += isize = segop_incore(seg, raddr, ssize, vec);
2103 2103                  if (isize != ssize) {
2104 2104                          error = -1;
2105 2105                          break;
2106 2106                  }
2107 2107                  vec += btopr(ssize);
2108 2108          }
2109 2109          AS_LOCK_EXIT(as, &as->a_lock);
2110 2110          return (error);
2111 2111  }
2112 2112  
↓ open down ↓ 5 lines elided ↑ open up ↑
2118 2118          size_t  pos1 = position;
2119 2119          size_t  pos2;
2120 2120          size_t  size;
2121 2121          size_t  end_pos = npages + position;
2122 2122  
2123 2123          while (bt_range(bitmap, &pos1, &pos2, end_pos)) {
2124 2124                  size = ptob((pos2 - pos1));
2125 2125                  range_start = (caddr_t)((uintptr_t)addr +
2126 2126                      ptob(pos1 - position));
2127 2127  
2128      -                (void) SEGOP_LOCKOP(seg, range_start, size, attr, MC_UNLOCK,
     2128 +                (void) segop_lockop(seg, range_start, size, attr, MC_UNLOCK,
2129 2129                      (ulong_t *)NULL, (size_t)NULL);
2130 2130                  pos1 = pos2;
2131 2131          }
2132 2132  }
2133 2133  
2134 2134  static void
2135 2135  as_unlockerr(struct as *as, int attr, ulong_t *mlock_map,
2136 2136          caddr_t raddr, size_t rsize)
2137 2137  {
2138 2138          struct seg *seg = as_segat(as, raddr);
↓ open down ↓ 75 lines elided ↑ open up ↑
2214 2214                  } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
2215 2215  
2216 2216                  mlock_size = BT_BITOUL(btopr(rlen));
2217 2217                  if ((mlock_map = (ulong_t *)kmem_zalloc(mlock_size *
2218 2218                      sizeof (ulong_t), KM_NOSLEEP)) == NULL) {
2219 2219                                  AS_LOCK_EXIT(as, &as->a_lock);
2220 2220                                  return (EAGAIN);
2221 2221                  }
2222 2222  
2223 2223                  for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2224      -                        error = SEGOP_LOCKOP(seg, seg->s_base,
     2224 +                        error = segop_lockop(seg, seg->s_base,
2225 2225                              seg->s_size, attr, MC_LOCK, mlock_map, pos);
2226 2226                          if (error != 0)
2227 2227                                  break;
2228 2228                          pos += seg_pages(seg);
2229 2229                  }
2230 2230  
2231 2231                  if (error) {
2232 2232                          for (seg = AS_SEGFIRST(as); seg != NULL;
2233 2233                              seg = AS_SEGNEXT(as, seg)) {
2234 2234  
↓ open down ↓ 8 lines elided ↑ open up ↑
2243 2243  
2244 2244                  kmem_free(mlock_map, mlock_size * sizeof (ulong_t));
2245 2245                  AS_LOCK_EXIT(as, &as->a_lock);
2246 2246                  goto lockerr;
2247 2247          } else if (func == MC_UNLOCKAS) {
2248 2248                  mutex_enter(&as->a_contents);
2249 2249                  AS_CLRPGLCK(as);
2250 2250                  mutex_exit(&as->a_contents);
2251 2251  
2252 2252                  for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2253      -                        error = SEGOP_LOCKOP(seg, seg->s_base,
     2253 +                        error = segop_lockop(seg, seg->s_base,
2254 2254                              seg->s_size, attr, MC_UNLOCK, NULL, 0);
2255 2255                          if (error != 0)
2256 2256                                  break;
2257 2257                  }
2258 2258  
2259 2259                  AS_LOCK_EXIT(as, &as->a_lock);
2260 2260                  goto lockerr;
2261 2261          }
2262 2262  
2263 2263          /*
↓ open down ↓ 57 lines elided ↑ open up ↑
2321 2321                  /*
2322 2322                   * Dispatch on specific function.
2323 2323                   */
2324 2324                  switch (func) {
2325 2325  
2326 2326                  /*
2327 2327                   * Synchronize cached data from mappings with backing
2328 2328                   * objects.
2329 2329                   */
2330 2330                  case MC_SYNC:
2331      -                        if (error = SEGOP_SYNC(seg, raddr, ssize,
     2331 +                        if (error = segop_sync(seg, raddr, ssize,
2332 2332                              attr, (uint_t)arg)) {
2333 2333                                  AS_LOCK_EXIT(as, &as->a_lock);
2334 2334                                  return (error);
2335 2335                          }
2336 2336                          break;
2337 2337  
2338 2338                  /*
2339 2339                   * Lock pages in memory.
2340 2340                   */
2341 2341                  case MC_LOCK:
2342      -                        if (error = SEGOP_LOCKOP(seg, raddr, ssize,
     2342 +                        if (error = segop_lockop(seg, raddr, ssize,
2343 2343                              attr, func, mlock_map, pos)) {
2344 2344                                  as_unlockerr(as, attr, mlock_map, initraddr,
2345 2345                                      initrsize - rsize + ssize);
2346 2346                                  kmem_free(mlock_map, mlock_size *
2347 2347                                      sizeof (ulong_t));
2348 2348                                  AS_LOCK_EXIT(as, &as->a_lock);
2349 2349                                  goto lockerr;
2350 2350                          }
2351 2351                          break;
2352 2352  
2353 2353                  /*
2354 2354                   * Unlock mapped pages.
2355 2355                   */
2356 2356                  case MC_UNLOCK:
2357      -                        (void) SEGOP_LOCKOP(seg, raddr, ssize, attr, func,
     2357 +                        (void) segop_lockop(seg, raddr, ssize, attr, func,
2358 2358                              (ulong_t *)NULL, (size_t)NULL);
2359 2359                          break;
2360 2360  
2361 2361                  /*
2362 2362                   * Store VM advise for mapped pages in segment layer.
2363 2363                   */
2364 2364                  case MC_ADVISE:
2365      -                        error = SEGOP_ADVISE(seg, raddr, ssize, (uint_t)arg);
     2365 +                        error = segop_advise(seg, raddr, ssize, (uint_t)arg);
2366 2366  
2367 2367                          /*
2368 2368                           * Check for regular errors and special retry error
2369 2369                           */
2370 2370                          if (error) {
2371 2371                                  if (error == IE_RETRY) {
2372 2372                                          /*
2373 2373                                           * Need to acquire writers lock, so
2374 2374                                           * have to drop readers lock and start
2375 2375                                           * all over again
↓ open down ↓ 18 lines elided ↑ open up ↑
2394 2394                                          AS_LOCK_EXIT(as, &as->a_lock);
2395 2395                                          return (error);
2396 2396                                  }
2397 2397                          }
2398 2398                          break;
2399 2399  
2400 2400                  case MC_INHERIT_ZERO:
2401 2401                          if (seg->s_ops->inherit == NULL) {
2402 2402                                  error = ENOTSUP;
2403 2403                          } else {
2404      -                                error = SEGOP_INHERIT(seg, raddr, ssize,
     2404 +                                error = segop_inherit(seg, raddr, ssize,
2405 2405                                      SEGP_INH_ZERO);
2406 2406                          }
2407 2407                          if (error != 0) {
2408 2408                                  AS_LOCK_EXIT(as, &as->a_lock);
2409 2409                                  return (error);
2410 2410                          }
2411 2411                          break;
2412 2412  
2413 2413                  /*
2414 2414                   * Can't happen.
↓ open down ↓ 94 lines elided ↑ open up ↑
2509 2509                                  AS_LOCK_EXIT(as, &as->a_lock);
2510 2510                                  return (EFAULT);
2511 2511                          }
2512 2512                          /*
2513 2513                           * Do a quick check if subsequent segments
2514 2514                           * will most likely support pagelock.
2515 2515                           */
2516 2516                          if (seg->s_ops == &segvn_ops) {
2517 2517                                  vnode_t *vp;
2518 2518  
2519      -                                if (SEGOP_GETVP(seg, addr, &vp) != 0 ||
     2519 +                                if (segop_getvp(seg, addr, &vp) != 0 ||
2520 2520                                      vp != NULL) {
2521 2521                                          AS_LOCK_EXIT(as, &as->a_lock);
2522 2522                                          goto slow;
2523 2523                                  }
2524 2524                          } else if (seg->s_ops != &segspt_shmops) {
2525 2525                                  AS_LOCK_EXIT(as, &as->a_lock);
2526 2526                                  goto slow;
2527 2527                          }
2528 2528                          segcnt++;
2529 2529                  }
↓ open down ↓ 17 lines elided ↑ open up ↑
2547 2547                          ASSERT(seg != NULL && addr == seg->s_base);
2548 2548                          cnt++;
2549 2549                          ASSERT(cnt < segcnt);
2550 2550                  }
2551 2551                  if (addr + size > seg->s_base + seg->s_size) {
2552 2552                          ssize = seg->s_base + seg->s_size - addr;
2553 2553                  } else {
2554 2554                          ssize = size;
2555 2555                  }
2556 2556                  pl = &plist[npages + cnt];
2557      -                error = SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2557 +                error = segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2558 2558                      L_PAGELOCK, rw);
2559 2559                  if (error) {
2560 2560                          break;
2561 2561                  }
2562 2562                  ASSERT(plist[npages + cnt] != NULL);
2563 2563                  ASSERT(pl_off + btop(ssize) <= npages);
2564 2564                  bcopy(plist[npages + cnt], &plist[pl_off],
2565 2565                      btop(ssize) * sizeof (page_t *));
2566 2566                  pl_off += btop(ssize);
2567 2567          }
↓ open down ↓ 22 lines elided ↑ open up ↑
2590 2590                          cnt++;
2591 2591                          ASSERT(cnt < segcnt);
2592 2592                  }
2593 2593                  if (eaddr > seg->s_base + seg->s_size) {
2594 2594                          ssize = seg->s_base + seg->s_size - addr;
2595 2595                  } else {
2596 2596                          ssize = eaddr - addr;
2597 2597                  }
2598 2598                  pl = &plist[npages + cnt];
2599 2599                  ASSERT(*pl != NULL);
2600      -                (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2600 +                (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2601 2601                      L_PAGEUNLOCK, rw);
2602 2602          }
2603 2603  
2604 2604          AS_LOCK_EXIT(as, &as->a_lock);
2605 2605  
2606 2606          kmem_free(plist, (npages + segcnt) * sizeof (page_t *));
2607 2607  
2608 2608          if (error != ENOTSUP && error != EFAULT) {
2609 2609                  return (error);
2610 2610          }
↓ open down ↓ 54 lines elided ↑ open up ↑
2665 2665                  AS_LOCK_EXIT(as, &as->a_lock);
2666 2666                  return (EFAULT);
2667 2667          }
2668 2668  
2669 2669          TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_START,
2670 2670              "seg_lock_1_start: raddr %p rsize %ld", raddr, rsize);
2671 2671  
2672 2672          /*
2673 2673           * try to lock pages and pass back shadow list
2674 2674           */
2675      -        err = SEGOP_PAGELOCK(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
     2675 +        err = segop_pagelock(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
2676 2676  
2677 2677          TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_END, "seg_lock_1_end");
2678 2678  
2679 2679          AS_LOCK_EXIT(as, &as->a_lock);
2680 2680  
2681 2681          if (err == 0 || (err != ENOTSUP && err != EFAULT)) {
2682 2682                  return (err);
2683 2683          }
2684 2684  
2685 2685          /*
↓ open down ↓ 42 lines elided ↑ open up ↑
2728 2728                          ASSERT(seg != NULL && addr == seg->s_base);
2729 2729                          cnt++;
2730 2730                  }
2731 2731                  if (eaddr > seg->s_base + seg->s_size) {
2732 2732                          ssize = seg->s_base + seg->s_size - addr;
2733 2733                  } else {
2734 2734                          ssize = eaddr - addr;
2735 2735                  }
2736 2736                  pl = &plist[npages + cnt];
2737 2737                  ASSERT(*pl != NULL);
2738      -                (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2738 +                (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2739 2739                      L_PAGEUNLOCK, rw);
2740 2740          }
2741 2741          ASSERT(cnt > 0);
2742 2742          AS_LOCK_EXIT(as, &as->a_lock);
2743 2743  
2744 2744          cnt++;
2745 2745          kmem_free(plist, (npages + cnt) * sizeof (page_t *));
2746 2746  }
2747 2747  
2748 2748  /*
↓ open down ↓ 25 lines elided ↑ open up ↑
2774 2774  
2775 2775          AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
2776 2776          seg = as_segat(as, raddr);
2777 2777          ASSERT(seg != NULL);
2778 2778  
2779 2779          TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_UNLOCK_START,
2780 2780              "seg_unlock_start: raddr %p rsize %ld", raddr, rsize);
2781 2781  
2782 2782          ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2783 2783          if (raddr + rsize <= seg->s_base + seg->s_size) {
2784      -                SEGOP_PAGELOCK(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
     2784 +                segop_pagelock(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
2785 2785          } else {
2786 2786                  as_pageunlock_segs(as, seg, raddr, rsize, pp, rw);
2787 2787                  return;
2788 2788          }
2789 2789          AS_LOCK_EXIT(as, &as->a_lock);
2790 2790          TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_AS_UNLOCK_END, "as_pageunlock_end");
2791 2791  }
2792 2792  
2793 2793  int
2794 2794  as_setpagesize(struct as *as, caddr_t addr, size_t size, uint_t szc,
↓ open down ↓ 34 lines elided ↑ open up ↑
2829 2829                                  break;
2830 2830                          }
2831 2831                  }
2832 2832                  if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2833 2833                          ssize = seg->s_base + seg->s_size - raddr;
2834 2834                  } else {
2835 2835                          ssize = rsize;
2836 2836                  }
2837 2837  
2838 2838  retry:
2839      -                error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
     2839 +                error = segop_setpagesize(seg, raddr, ssize, szc);
2840 2840  
2841 2841                  if (error == IE_NOMEM) {
2842 2842                          error = EAGAIN;
2843 2843                          break;
2844 2844                  }
2845 2845  
2846 2846                  if (error == IE_RETRY) {
2847 2847                          AS_LOCK_EXIT(as, &as->a_lock);
2848 2848                          goto setpgsz_top;
2849 2849                  }
↓ open down ↓ 58 lines elided ↑ open up ↑
2908 2908                  } else if (error != 0) {
2909 2909                          break;
2910 2910                  }
2911 2911          }
2912 2912          as_setwatch(as);
2913 2913          AS_LOCK_EXIT(as, &as->a_lock);
2914 2914          return (error);
2915 2915  }
2916 2916  
2917 2917  /*
2918      - * as_iset3_default_lpsize() just calls SEGOP_SETPAGESIZE() on all segments
     2918 + * as_iset3_default_lpsize() just calls segop_setpagesize() on all segments
2919 2919   * in its chunk where s_szc is less than the szc we want to set.
2920 2920   */
2921 2921  static int
2922 2922  as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc,
2923 2923      int *retry)
2924 2924  {
2925 2925          struct seg *seg;
2926 2926          size_t ssize;
2927 2927          int error;
2928 2928  
↓ open down ↓ 11 lines elided ↑ open up ↑
2940 2940                                  panic("as_iset3_default_lpsize: as changed");
2941 2941                          }
2942 2942                  }
2943 2943                  if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2944 2944                          ssize = seg->s_base + seg->s_size - raddr;
2945 2945                  } else {
2946 2946                          ssize = rsize;
2947 2947                  }
2948 2948  
2949 2949                  if (szc > seg->s_szc) {
2950      -                        error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
     2950 +                        error = segop_setpagesize(seg, raddr, ssize, szc);
2951 2951                          /* Only retry on EINVAL segments that have no vnode. */
2952 2952                          if (error == EINVAL) {
2953 2953                                  vnode_t *vp = NULL;
2954      -                                if ((SEGOP_GETTYPE(seg, raddr) & MAP_SHARED) &&
2955      -                                    (SEGOP_GETVP(seg, raddr, &vp) != 0 ||
     2954 +                                if ((segop_gettype(seg, raddr) & MAP_SHARED) &&
     2955 +                                    (segop_getvp(seg, raddr, &vp) != 0 ||
2956 2956                                      vp == NULL)) {
2957 2957                                          *retry = 1;
2958 2958                                  } else {
2959 2959                                          *retry = 0;
2960 2960                                  }
2961 2961                          }
2962 2962                          if (error) {
2963 2963                                  return (error);
2964 2964                          }
2965 2965                  }
↓ open down ↓ 222 lines elided ↑ open up ↑
3188 3188                  return (ENOMEM);
3189 3189          }
3190 3190          as_clearwatchprot(as, raddr, rsize);
3191 3191          seg = as_segat(as, raddr);
3192 3192          if (seg == NULL) {
3193 3193                  as_setwatch(as);
3194 3194                  AS_LOCK_EXIT(as, &as->a_lock);
3195 3195                  return (ENOMEM);
3196 3196          }
3197 3197          if (seg->s_ops == &segvn_ops) {
3198      -                rtype = SEGOP_GETTYPE(seg, addr);
     3198 +                rtype = segop_gettype(seg, addr);
3199 3199                  rflags = rtype & (MAP_TEXT | MAP_INITDATA);
3200 3200                  rtype = rtype & (MAP_SHARED | MAP_PRIVATE);
3201 3201                  segvn = 1;
3202 3202          } else {
3203 3203                  segvn = 0;
3204 3204          }
3205 3205          setaddr = raddr;
3206 3206          setsize = 0;
3207 3207  
3208 3208          for (; rsize != 0; rsize -= ssize, raddr += ssize, setsize += ssize) {
3209 3209                  if (raddr >= (seg->s_base + seg->s_size)) {
3210 3210                          seg = AS_SEGNEXT(as, seg);
3211 3211                          if (seg == NULL || raddr != seg->s_base) {
3212 3212                                  error = ENOMEM;
3213 3213                                  break;
3214 3214                          }
3215 3215                          if (seg->s_ops == &segvn_ops) {
3216      -                                stype = SEGOP_GETTYPE(seg, raddr);
     3216 +                                stype = segop_gettype(seg, raddr);
3217 3217                                  sflags = stype & (MAP_TEXT | MAP_INITDATA);
3218 3218                                  stype &= (MAP_SHARED | MAP_PRIVATE);
3219 3219                                  if (segvn && (rflags != sflags ||
3220 3220                                      rtype != stype)) {
3221 3221                                          /*
3222 3222                                           * The next segment is also segvn but
3223 3223                                           * has different flags and/or type.
3224 3224                                           */
3225 3225                                          ASSERT(setsize != 0);
3226 3226                                          error = as_iset_default_lpsize(as,
↓ open down ↓ 93 lines elided ↑ open up ↑
3320 3320  
3321 3321          ASSERT(AS_WRITE_HELD(as, &as->a_lock));
3322 3322  
3323 3323          for (pwp = avl_first(&as->a_wpage); pwp != NULL;
3324 3324              pwp = AVL_NEXT(&as->a_wpage, pwp)) {
3325 3325                  retrycnt = 0;
3326 3326          retry:
3327 3327                  vaddr = pwp->wp_vaddr;
3328 3328                  if (pwp->wp_oprot != 0 ||       /* already set up */
3329 3329                      (seg = as_segat(as, vaddr)) == NULL ||
3330      -                    SEGOP_GETPROT(seg, vaddr, 0, &prot) != 0)
     3330 +                    segop_getprot(seg, vaddr, 0, &prot) != 0)
3331 3331                          continue;
3332 3332  
3333 3333                  pwp->wp_oprot = prot;
3334 3334                  if (pwp->wp_read)
3335 3335                          prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3336 3336                  if (pwp->wp_write)
3337 3337                          prot &= ~PROT_WRITE;
3338 3338                  if (pwp->wp_exec)
3339 3339                          prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3340 3340                  if (!(pwp->wp_flags & WP_NOWATCH) && prot != pwp->wp_oprot) {
3341      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
     3341 +                        err = segop_setprot(seg, vaddr, PAGESIZE, prot);
3342 3342                          if (err == IE_RETRY) {
3343 3343                                  pwp->wp_oprot = 0;
3344 3344                                  ASSERT(retrycnt == 0);
3345 3345                                  retrycnt++;
3346 3346                                  goto retry;
3347 3347                          }
3348 3348                  }
3349 3349                  pwp->wp_prot = prot;
3350 3350          }
3351 3351  }
↓ open down ↓ 18 lines elided ↑ open up ↑
3370 3370          for (pwp = avl_first(&as->a_wpage); pwp != NULL;
3371 3371              pwp = AVL_NEXT(&as->a_wpage, pwp)) {
3372 3372                  retrycnt = 0;
3373 3373          retry:
3374 3374                  vaddr = pwp->wp_vaddr;
3375 3375                  if (pwp->wp_oprot == 0 ||       /* not set up */
3376 3376                      (seg = as_segat(as, vaddr)) == NULL)
3377 3377                          continue;
3378 3378  
3379 3379                  if ((prot = pwp->wp_oprot) != pwp->wp_prot) {
3380      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
     3380 +                        err = segop_setprot(seg, vaddr, PAGESIZE, prot);
3381 3381                          if (err == IE_RETRY) {
3382 3382                                  ASSERT(retrycnt == 0);
3383 3383                                  retrycnt++;
3384 3384                                  goto retry;
3385 3385                          }
3386 3386                  }
3387 3387                  pwp->wp_oprot = 0;
3388 3388                  pwp->wp_prot = 0;
3389 3389          }
3390 3390  }
↓ open down ↓ 33 lines elided ↑ open up ↑
3424 3424                          wprot &= ~PROT_WRITE;
3425 3425                  if (pwp->wp_exec)
3426 3426                          wprot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3427 3427                  if (!(pwp->wp_flags & WP_NOWATCH) && wprot != pwp->wp_oprot) {
3428 3428                  retry:
3429 3429                          seg = as_segat(as, vaddr);
3430 3430                          if (seg == NULL) {
3431 3431                                  panic("as_setwatchprot: no seg");
3432 3432                                  /*NOTREACHED*/
3433 3433                          }
3434      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, wprot);
     3434 +                        err = segop_setprot(seg, vaddr, PAGESIZE, wprot);
3435 3435                          if (err == IE_RETRY) {
3436 3436                                  ASSERT(retrycnt == 0);
3437 3437                                  retrycnt++;
3438 3438                                  goto retry;
3439 3439                          }
3440 3440                  }
3441 3441                  pwp->wp_oprot = prot;
3442 3442                  pwp->wp_prot = wprot;
3443 3443  
3444 3444                  pwp = AVL_NEXT(&as->a_wpage, pwp);
↓ open down ↓ 26 lines elided ↑ open up ↑
3471 3471          while (pwp != NULL && pwp->wp_vaddr < eaddr) {
3472 3472  
3473 3473                  if ((prot = pwp->wp_oprot) != 0) {
3474 3474                          retrycnt = 0;
3475 3475  
3476 3476                          if (prot != pwp->wp_prot) {
3477 3477                          retry:
3478 3478                                  seg = as_segat(as, pwp->wp_vaddr);
3479 3479                                  if (seg == NULL)
3480 3480                                          continue;
3481      -                                err = SEGOP_SETPROT(seg, pwp->wp_vaddr,
     3481 +                                err = segop_setprot(seg, pwp->wp_vaddr,
3482 3482                                      PAGESIZE, prot);
3483 3483                                  if (err == IE_RETRY) {
3484 3484                                          ASSERT(retrycnt == 0);
3485 3485                                          retrycnt++;
3486 3486                                          goto retry;
3487 3487  
3488 3488                                  }
3489 3489                          }
3490 3490                          pwp->wp_oprot = 0;
3491 3491                          pwp->wp_prot = 0;
↓ open down ↓ 36 lines elided ↑ open up ↑
3528 3528                  return (EFAULT);
3529 3529          }
3530 3530          /*
3531 3531           * catch old drivers which may not support getmemid
3532 3532           */
3533 3533          if (seg->s_ops->getmemid == NULL) {
3534 3534                  AS_LOCK_EXIT(as, &as->a_lock);
3535 3535                  return (ENODEV);
3536 3536          }
3537 3537  
3538      -        sts = SEGOP_GETMEMID(seg, addr, memidp);
     3538 +        sts = segop_getmemid(seg, addr, memidp);
3539 3539  
3540 3540          AS_LOCK_EXIT(as, &as->a_lock);
3541 3541          return (sts);
3542 3542  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX