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 ↓ 708 lines elided ↑ open up ↑
 709  709                  called = 1;
 710  710                  hat_free_start(hat);
 711  711                  if (as->a_xhat != NULL)
 712  712                          xhat_free_start_all(as);
 713  713          }
 714  714          for (seg = AS_SEGFIRST(as); seg != NULL; seg = next) {
 715  715                  int err;
 716  716  
 717  717                  next = AS_SEGNEXT(as, seg);
 718  718  retry:
 719      -                err = SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
      719 +                err = segop_unmap(seg, seg->s_base, seg->s_size);
 720  720                  if (err == EAGAIN) {
 721  721                          mutex_enter(&as->a_contents);
 722  722                          if (as->a_callbacks) {
 723  723                                  AS_LOCK_EXIT(as, &as->a_lock);
 724  724                          } else if (!AS_ISNOUNMAPWAIT(as)) {
 725  725                                  /*
 726  726                                   * Memory is currently locked. Wait for a
 727  727                                   * cv_signal that it has been unlocked, then
 728  728                                   * try the operation again.
 729  729                                   */
↓ open down ↓ 85 lines elided ↑ open up ↑
 815  815                  if (newseg == NULL) {
 816  816                          AS_LOCK_EXIT(newas, &newas->a_lock);
 817  817                          as_setwatch(as);
 818  818                          mutex_enter(&as->a_contents);
 819  819                          AS_CLRBUSY(as);
 820  820                          mutex_exit(&as->a_contents);
 821  821                          AS_LOCK_EXIT(as, &as->a_lock);
 822  822                          as_free(newas);
 823  823                          return (-1);
 824  824                  }
 825      -                if ((error = SEGOP_DUP(seg, newseg)) != 0) {
      825 +                if ((error = segop_dup(seg, newseg)) != 0) {
 826  826                          /*
 827  827                           * We call seg_free() on the new seg
 828  828                           * because the segment is not set up
 829  829                           * completely; i.e. it has no ops.
 830  830                           */
 831  831                          as_setwatch(as);
 832  832                          mutex_enter(&as->a_contents);
 833  833                          AS_CLRBUSY(as);
 834  834                          mutex_exit(&as->a_contents);
 835  835                          AS_LOCK_EXIT(as, &as->a_lock);
↓ open down ↓ 175 lines elided ↑ open up ↑
1011 1011                                  /*
1012 1012                                   * Handle watch pages.  If we're faulting on a
1013 1013                                   * watched page from an X-hat, we have to
1014 1014                                   * restore the original permissions while we
1015 1015                                   * handle the fault.
1016 1016                                   */
1017 1017                                  as_clearwatch(as);
1018 1018                                  holding_wpage = 1;
1019 1019                          }
1020 1020  
1021      -                        res = SEGOP_FAULT(hat, seg, raddr, ssize, type, rw);
     1021 +                        res = segop_fault(hat, seg, raddr, ssize, type, rw);
1022 1022  
1023 1023                          /* Restore watchpoints */
1024 1024                          if (holding_wpage) {
1025 1025                                  as_setwatch(as);
1026 1026                                  holding_wpage = 0;
1027 1027                          }
1028 1028  
1029 1029                          if (res != 0)
1030 1030                                  break;
1031 1031                  } else {
↓ open down ↓ 16 lines elided ↑ open up ↑
1048 1048                          ASSERT(seg != NULL);
1049 1049                          /*
1050 1050                           * Now call the fault routine again to perform the
1051 1051                           * unlock using S_OTHER instead of the rw variable
1052 1052                           * since we never got a chance to touch the pages.
1053 1053                           */
1054 1054                          if (raddr > seg->s_base + seg->s_size)
1055 1055                                  ssize = seg->s_base + seg->s_size - addrsav;
1056 1056                          else
1057 1057                                  ssize = raddr - addrsav;
1058      -                        (void) SEGOP_FAULT(hat, seg, addrsav, ssize,
     1058 +                        (void) segop_fault(hat, seg, addrsav, ssize,
1059 1059                              F_SOFTUNLOCK, S_OTHER);
1060 1060                  }
1061 1061          }
1062 1062          if (as_lock_held)
1063 1063                  AS_LOCK_EXIT(as, &as->a_lock);
1064 1064          if ((lwp != NULL) && (!is_xhat))
1065 1065                  lwp->lwp_nostop--;
1066 1066  
1067 1067          /*
1068 1068           * If the lower levels returned EDEADLK for a fault,
↓ open down ↓ 49 lines elided ↑ open up ↑
1118 1118          }
1119 1119  
1120 1120          for (; rsize != 0; rsize -= PAGESIZE, raddr += PAGESIZE) {
1121 1121                  if (raddr >= seg->s_base + seg->s_size) {
1122 1122                          seg = AS_SEGNEXT(as, seg);
1123 1123                          if (seg == NULL || raddr != seg->s_base) {
1124 1124                                  res = FC_NOMAP;
1125 1125                                  break;
1126 1126                          }
1127 1127                  }
1128      -                res = SEGOP_FAULTA(seg, raddr);
     1128 +                res = segop_faulta(seg, raddr);
1129 1129                  if (res != 0)
1130 1130                          break;
1131 1131          }
1132 1132          AS_LOCK_EXIT(as, &as->a_lock);
1133 1133          if (lwp != NULL)
1134 1134                  lwp->lwp_nostop--;
1135 1135          /*
1136 1136           * If the lower levels returned EDEADLK for a fault,
1137 1137           * It means that we should retry the fault.  Let's wait
1138 1138           * a bit also to let the deadlock causing condition clear.
↓ open down ↓ 69 lines elided ↑ open up ↑
1208 1208                          if (seg == NULL || raddr != seg->s_base) {
1209 1209                                  error = ENOMEM;
1210 1210                                  break;
1211 1211                          }
1212 1212                  }
1213 1213                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
1214 1214                          ssize = seg->s_base + seg->s_size - raddr;
1215 1215                  else
1216 1216                          ssize = rsize;
1217 1217  retry:
1218      -                error = SEGOP_SETPROT(seg, raddr, ssize, prot);
     1218 +                error = segop_setprot(seg, raddr, ssize, prot);
1219 1219  
1220 1220                  if (error == IE_NOMEM) {
1221 1221                          error = EAGAIN;
1222 1222                          break;
1223 1223                  }
1224 1224  
1225 1225                  if (error == IE_RETRY) {
1226 1226                          AS_LOCK_EXIT(as, &as->a_lock);
1227 1227                          writer = 1;
1228 1228                          goto setprot_top;
↓ open down ↓ 130 lines elided ↑ open up ↑
1359 1359                          if (seg == NULL || raddr != seg->s_base) {
1360 1360                                  error = ENOMEM;
1361 1361                                  break;
1362 1362                          }
1363 1363                  }
1364 1364                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
1365 1365                          ssize = seg->s_base + seg->s_size - raddr;
1366 1366                  else
1367 1367                          ssize = rsize;
1368 1368  
1369      -                error = SEGOP_CHECKPROT(seg, raddr, ssize, prot);
     1369 +                error = segop_checkprot(seg, raddr, ssize, prot);
1370 1370                  if (error != 0)
1371 1371                          break;
1372 1372          }
1373 1373          as_setwatch(as);
1374 1374          AS_LOCK_EXIT(as, &as->a_lock);
1375 1375          return (error);
1376 1376  }
1377 1377  
1378 1378  int
1379 1379  as_unmap(struct as *as, caddr_t addr, size_t size)
↓ open down ↓ 45 lines elided ↑ open up ↑
1425 1425                   * We didn't count /dev/null mappings, so ignore them here.
1426 1426                   * We'll handle MAP_NORESERVE cases in segvn_unmap(). (Again,
1427 1427                   * we have to do this check here while we have seg.)
1428 1428                   */
1429 1429                  rsize = 0;
1430 1430                  if (!SEG_IS_DEVNULL_MAPPING(seg) &&
1431 1431                      !SEG_IS_PARTIAL_RESV(seg))
1432 1432                          rsize = ssize;
1433 1433  
1434 1434  retry:
1435      -                err = SEGOP_UNMAP(seg, raddr, ssize);
     1435 +                err = segop_unmap(seg, raddr, ssize);
1436 1436                  if (err == EAGAIN) {
1437 1437                          /*
1438 1438                           * Memory is currently locked.  It must be unlocked
1439 1439                           * before this operation can succeed through a retry.
1440 1440                           * The possible reasons for locked memory and
1441 1441                           * corresponding strategies for unlocking are:
1442 1442                           * (1) Normal I/O
1443 1443                           *      wait for a signal that the I/O operation
1444 1444                           *      has completed and the memory is unlocked.
1445 1445                           * (2) Asynchronous I/O
↓ open down ↓ 417 lines elided ↑ open up ↑
1863 1863           */
1864 1864          if ((as->a_flags & AS_NEEDSPURGE) == 0)
1865 1865                  return;
1866 1866  
1867 1867          AS_LOCK_ENTER(as, &as->a_lock, RW_WRITER);
1868 1868          next_seg = NULL;
1869 1869          seg = AS_SEGFIRST(as);
1870 1870          while (seg != NULL) {
1871 1871                  next_seg = AS_SEGNEXT(as, seg);
1872 1872                  if (seg->s_flags & S_PURGE)
1873      -                        SEGOP_UNMAP(seg, seg->s_base, seg->s_size);
     1873 +                        (void) segop_unmap(seg, seg->s_base, seg->s_size);
1874 1874                  seg = next_seg;
1875 1875          }
1876 1876          AS_LOCK_EXIT(as, &as->a_lock);
1877 1877  
1878 1878          mutex_enter(&as->a_contents);
1879 1879          as->a_flags &= ~AS_NEEDSPURGE;
1880 1880          mutex_exit(&as->a_contents);
1881 1881  }
1882 1882  
1883 1883  /*
↓ open down ↓ 310 lines elided ↑ open up ↑
2194 2194          for (seg = AS_SEGFIRST(as); seg != NULL; seg = AS_SEGNEXT(as, seg)) {
2195 2195                  struct seg_ops *ov = seg->s_ops;
2196 2196  
2197 2197                  /*
2198 2198                   * We have to check to see if the seg has
2199 2199                   * an ops vector because the seg may have
2200 2200                   * been in the middle of being set up when
2201 2201                   * the process was picked for swapout.
2202 2202                   */
2203 2203                  if ((ov != NULL) && (ov->swapout != NULL))
2204      -                        swpcnt += SEGOP_SWAPOUT(seg);
     2204 +                        swpcnt += segop_swapout(seg);
2205 2205          }
2206 2206          AS_LOCK_EXIT(as, &as->a_lock);
2207 2207          return (swpcnt);
2208 2208  }
2209 2209  
2210 2210  /*
2211 2211   * Determine whether data from the mappings in interval [addr, addr + size)
2212 2212   * are in the primary memory (core) cache.
2213 2213   */
2214 2214  int
↓ open down ↓ 27 lines elided ↑ open up ↑
2242 2242                          seg = AS_SEGNEXT(as, seg);
2243 2243                          if (seg == NULL || raddr != seg->s_base) {
2244 2244                                  error = -1;
2245 2245                                  break;
2246 2246                          }
2247 2247                  }
2248 2248                  if ((raddr + rsize) > (seg->s_base + seg->s_size))
2249 2249                          ssize = seg->s_base + seg->s_size - raddr;
2250 2250                  else
2251 2251                          ssize = rsize;
2252      -                *sizep += isize = SEGOP_INCORE(seg, raddr, ssize, vec);
     2252 +                *sizep += isize = segop_incore(seg, raddr, ssize, vec);
2253 2253                  if (isize != ssize) {
2254 2254                          error = -1;
2255 2255                          break;
2256 2256                  }
2257 2257                  vec += btopr(ssize);
2258 2258          }
2259 2259          AS_LOCK_EXIT(as, &as->a_lock);
2260 2260          return (error);
2261 2261  }
2262 2262  
↓ open down ↓ 5 lines elided ↑ open up ↑
2268 2268          size_t  pos1 = position;
2269 2269          size_t  pos2;
2270 2270          size_t  size;
2271 2271          size_t  end_pos = npages + position;
2272 2272  
2273 2273          while (bt_range(bitmap, &pos1, &pos2, end_pos)) {
2274 2274                  size = ptob((pos2 - pos1));
2275 2275                  range_start = (caddr_t)((uintptr_t)addr +
2276 2276                      ptob(pos1 - position));
2277 2277  
2278      -                (void) SEGOP_LOCKOP(seg, range_start, size, attr, MC_UNLOCK,
     2278 +                (void) segop_lockop(seg, range_start, size, attr, MC_UNLOCK,
2279 2279                      (ulong_t *)NULL, (size_t)NULL);
2280 2280                  pos1 = pos2;
2281 2281          }
2282 2282  }
2283 2283  
2284 2284  static void
2285 2285  as_unlockerr(struct as *as, int attr, ulong_t *mlock_map,
2286 2286          caddr_t raddr, size_t rsize)
2287 2287  {
2288 2288          struct seg *seg = as_segat(as, raddr);
↓ open down ↓ 75 lines elided ↑ open up ↑
2364 2364                  } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
2365 2365  
2366 2366                  mlock_size = BT_BITOUL(btopr(rlen));
2367 2367                  if ((mlock_map = (ulong_t *)kmem_zalloc(mlock_size *
2368 2368                      sizeof (ulong_t), KM_NOSLEEP)) == NULL) {
2369 2369                                  AS_LOCK_EXIT(as, &as->a_lock);
2370 2370                                  return (EAGAIN);
2371 2371                  }
2372 2372  
2373 2373                  for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2374      -                        error = SEGOP_LOCKOP(seg, seg->s_base,
     2374 +                        error = segop_lockop(seg, seg->s_base,
2375 2375                              seg->s_size, attr, MC_LOCK, mlock_map, pos);
2376 2376                          if (error != 0)
2377 2377                                  break;
2378 2378                          pos += seg_pages(seg);
2379 2379                  }
2380 2380  
2381 2381                  if (error) {
2382 2382                          for (seg = AS_SEGFIRST(as); seg != NULL;
2383 2383                              seg = AS_SEGNEXT(as, seg)) {
2384 2384  
↓ open down ↓ 8 lines elided ↑ open up ↑
2393 2393  
2394 2394                  kmem_free(mlock_map, mlock_size * sizeof (ulong_t));
2395 2395                  AS_LOCK_EXIT(as, &as->a_lock);
2396 2396                  goto lockerr;
2397 2397          } else if (func == MC_UNLOCKAS) {
2398 2398                  mutex_enter(&as->a_contents);
2399 2399                  AS_CLRPGLCK(as);
2400 2400                  mutex_exit(&as->a_contents);
2401 2401  
2402 2402                  for (seg = AS_SEGFIRST(as); seg; seg = AS_SEGNEXT(as, seg)) {
2403      -                        error = SEGOP_LOCKOP(seg, seg->s_base,
     2403 +                        error = segop_lockop(seg, seg->s_base,
2404 2404                              seg->s_size, attr, MC_UNLOCK, NULL, 0);
2405 2405                          if (error != 0)
2406 2406                                  break;
2407 2407                  }
2408 2408  
2409 2409                  AS_LOCK_EXIT(as, &as->a_lock);
2410 2410                  goto lockerr;
2411 2411          }
2412 2412  
2413 2413          /*
↓ open down ↓ 57 lines elided ↑ open up ↑
2471 2471                  /*
2472 2472                   * Dispatch on specific function.
2473 2473                   */
2474 2474                  switch (func) {
2475 2475  
2476 2476                  /*
2477 2477                   * Synchronize cached data from mappings with backing
2478 2478                   * objects.
2479 2479                   */
2480 2480                  case MC_SYNC:
2481      -                        if (error = SEGOP_SYNC(seg, raddr, ssize,
     2481 +                        if (error = segop_sync(seg, raddr, ssize,
2482 2482                              attr, (uint_t)arg)) {
2483 2483                                  AS_LOCK_EXIT(as, &as->a_lock);
2484 2484                                  return (error);
2485 2485                          }
2486 2486                          break;
2487 2487  
2488 2488                  /*
2489 2489                   * Lock pages in memory.
2490 2490                   */
2491 2491                  case MC_LOCK:
2492      -                        if (error = SEGOP_LOCKOP(seg, raddr, ssize,
     2492 +                        if (error = segop_lockop(seg, raddr, ssize,
2493 2493                              attr, func, mlock_map, pos)) {
2494 2494                                  as_unlockerr(as, attr, mlock_map, initraddr,
2495 2495                                      initrsize - rsize + ssize);
2496 2496                                  kmem_free(mlock_map, mlock_size *
2497 2497                                      sizeof (ulong_t));
2498 2498                                  AS_LOCK_EXIT(as, &as->a_lock);
2499 2499                                  goto lockerr;
2500 2500                          }
2501 2501                          break;
2502 2502  
2503 2503                  /*
2504 2504                   * Unlock mapped pages.
2505 2505                   */
2506 2506                  case MC_UNLOCK:
2507      -                        (void) SEGOP_LOCKOP(seg, raddr, ssize, attr, func,
     2507 +                        (void) segop_lockop(seg, raddr, ssize, attr, func,
2508 2508                              (ulong_t *)NULL, (size_t)NULL);
2509 2509                          break;
2510 2510  
2511 2511                  /*
2512 2512                   * Store VM advise for mapped pages in segment layer.
2513 2513                   */
2514 2514                  case MC_ADVISE:
2515      -                        error = SEGOP_ADVISE(seg, raddr, ssize, (uint_t)arg);
     2515 +                        error = segop_advise(seg, raddr, ssize, (uint_t)arg);
2516 2516  
2517 2517                          /*
2518 2518                           * Check for regular errors and special retry error
2519 2519                           */
2520 2520                          if (error) {
2521 2521                                  if (error == IE_RETRY) {
2522 2522                                          /*
2523 2523                                           * Need to acquire writers lock, so
2524 2524                                           * have to drop readers lock and start
2525 2525                                           * all over again
↓ open down ↓ 18 lines elided ↑ open up ↑
2544 2544                                          AS_LOCK_EXIT(as, &as->a_lock);
2545 2545                                          return (error);
2546 2546                                  }
2547 2547                          }
2548 2548                          break;
2549 2549  
2550 2550                  case MC_INHERIT_ZERO:
2551 2551                          if (seg->s_ops->inherit == NULL) {
2552 2552                                  error = ENOTSUP;
2553 2553                          } else {
2554      -                                error = SEGOP_INHERIT(seg, raddr, ssize,
     2554 +                                error = segop_inherit(seg, raddr, ssize,
2555 2555                                      SEGP_INH_ZERO);
2556 2556                          }
2557 2557                          if (error != 0) {
2558 2558                                  AS_LOCK_EXIT(as, &as->a_lock);
2559 2559                                  return (error);
2560 2560                          }
2561 2561                          break;
2562 2562  
2563 2563                  /*
2564 2564                   * Can't happen.
↓ open down ↓ 94 lines elided ↑ open up ↑
2659 2659                                  AS_LOCK_EXIT(as, &as->a_lock);
2660 2660                                  return (EFAULT);
2661 2661                          }
2662 2662                          /*
2663 2663                           * Do a quick check if subsequent segments
2664 2664                           * will most likely support pagelock.
2665 2665                           */
2666 2666                          if (seg->s_ops == &segvn_ops) {
2667 2667                                  vnode_t *vp;
2668 2668  
2669      -                                if (SEGOP_GETVP(seg, addr, &vp) != 0 ||
     2669 +                                if (segop_getvp(seg, addr, &vp) != 0 ||
2670 2670                                      vp != NULL) {
2671 2671                                          AS_LOCK_EXIT(as, &as->a_lock);
2672 2672                                          goto slow;
2673 2673                                  }
2674 2674                          } else if (seg->s_ops != &segspt_shmops) {
2675 2675                                  AS_LOCK_EXIT(as, &as->a_lock);
2676 2676                                  goto slow;
2677 2677                          }
2678 2678                          segcnt++;
2679 2679                  }
↓ open down ↓ 17 lines elided ↑ open up ↑
2697 2697                          ASSERT(seg != NULL && addr == seg->s_base);
2698 2698                          cnt++;
2699 2699                          ASSERT(cnt < segcnt);
2700 2700                  }
2701 2701                  if (addr + size > seg->s_base + seg->s_size) {
2702 2702                          ssize = seg->s_base + seg->s_size - addr;
2703 2703                  } else {
2704 2704                          ssize = size;
2705 2705                  }
2706 2706                  pl = &plist[npages + cnt];
2707      -                error = SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2707 +                error = segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2708 2708                      L_PAGELOCK, rw);
2709 2709                  if (error) {
2710 2710                          break;
2711 2711                  }
2712 2712                  ASSERT(plist[npages + cnt] != NULL);
2713 2713                  ASSERT(pl_off + btop(ssize) <= npages);
2714 2714                  bcopy(plist[npages + cnt], &plist[pl_off],
2715 2715                      btop(ssize) * sizeof (page_t *));
2716 2716                  pl_off += btop(ssize);
2717 2717          }
↓ open down ↓ 22 lines elided ↑ open up ↑
2740 2740                          cnt++;
2741 2741                          ASSERT(cnt < segcnt);
2742 2742                  }
2743 2743                  if (eaddr > seg->s_base + seg->s_size) {
2744 2744                          ssize = seg->s_base + seg->s_size - addr;
2745 2745                  } else {
2746 2746                          ssize = eaddr - addr;
2747 2747                  }
2748 2748                  pl = &plist[npages + cnt];
2749 2749                  ASSERT(*pl != NULL);
2750      -                (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2750 +                (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2751 2751                      L_PAGEUNLOCK, rw);
2752 2752          }
2753 2753  
2754 2754          AS_LOCK_EXIT(as, &as->a_lock);
2755 2755  
2756 2756          kmem_free(plist, (npages + segcnt) * sizeof (page_t *));
2757 2757  
2758 2758          if (error != ENOTSUP && error != EFAULT) {
2759 2759                  return (error);
2760 2760          }
↓ open down ↓ 54 lines elided ↑ open up ↑
2815 2815                  AS_LOCK_EXIT(as, &as->a_lock);
2816 2816                  return (EFAULT);
2817 2817          }
2818 2818  
2819 2819          TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_START,
2820 2820              "seg_lock_1_start: raddr %p rsize %ld", raddr, rsize);
2821 2821  
2822 2822          /*
2823 2823           * try to lock pages and pass back shadow list
2824 2824           */
2825      -        err = SEGOP_PAGELOCK(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
     2825 +        err = segop_pagelock(seg, raddr, rsize, ppp, L_PAGELOCK, rw);
2826 2826  
2827 2827          TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_SEG_LOCK_END, "seg_lock_1_end");
2828 2828  
2829 2829          AS_LOCK_EXIT(as, &as->a_lock);
2830 2830  
2831 2831          if (err == 0 || (err != ENOTSUP && err != EFAULT)) {
2832 2832                  return (err);
2833 2833          }
2834 2834  
2835 2835          /*
↓ open down ↓ 42 lines elided ↑ open up ↑
2878 2878                          ASSERT(seg != NULL && addr == seg->s_base);
2879 2879                          cnt++;
2880 2880                  }
2881 2881                  if (eaddr > seg->s_base + seg->s_size) {
2882 2882                          ssize = seg->s_base + seg->s_size - addr;
2883 2883                  } else {
2884 2884                          ssize = eaddr - addr;
2885 2885                  }
2886 2886                  pl = &plist[npages + cnt];
2887 2887                  ASSERT(*pl != NULL);
2888      -                (void) SEGOP_PAGELOCK(seg, addr, ssize, (page_t ***)pl,
     2888 +                (void) segop_pagelock(seg, addr, ssize, (page_t ***)pl,
2889 2889                      L_PAGEUNLOCK, rw);
2890 2890          }
2891 2891          ASSERT(cnt > 0);
2892 2892          AS_LOCK_EXIT(as, &as->a_lock);
2893 2893  
2894 2894          cnt++;
2895 2895          kmem_free(plist, (npages + cnt) * sizeof (page_t *));
2896 2896  }
2897 2897  
2898 2898  /*
↓ open down ↓ 25 lines elided ↑ open up ↑
2924 2924  
2925 2925          AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
2926 2926          seg = as_segat(as, raddr);
2927 2927          ASSERT(seg != NULL);
2928 2928  
2929 2929          TRACE_2(TR_FAC_PHYSIO, TR_PHYSIO_SEG_UNLOCK_START,
2930 2930              "seg_unlock_start: raddr %p rsize %ld", raddr, rsize);
2931 2931  
2932 2932          ASSERT(raddr >= seg->s_base && raddr < seg->s_base + seg->s_size);
2933 2933          if (raddr + rsize <= seg->s_base + seg->s_size) {
2934      -                SEGOP_PAGELOCK(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
     2934 +                (void) segop_pagelock(seg, raddr, rsize, &pp, L_PAGEUNLOCK, rw);
2935 2935          } else {
2936 2936                  as_pageunlock_segs(as, seg, raddr, rsize, pp, rw);
2937 2937                  return;
2938 2938          }
2939 2939          AS_LOCK_EXIT(as, &as->a_lock);
2940 2940          TRACE_0(TR_FAC_PHYSIO, TR_PHYSIO_AS_UNLOCK_END, "as_pageunlock_end");
2941 2941  }
2942 2942  
2943 2943  int
2944 2944  as_setpagesize(struct as *as, caddr_t addr, size_t size, uint_t szc,
↓ open down ↓ 34 lines elided ↑ open up ↑
2979 2979                                  break;
2980 2980                          }
2981 2981                  }
2982 2982                  if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
2983 2983                          ssize = seg->s_base + seg->s_size - raddr;
2984 2984                  } else {
2985 2985                          ssize = rsize;
2986 2986                  }
2987 2987  
2988 2988  retry:
2989      -                error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
     2989 +                error = segop_setpagesize(seg, raddr, ssize, szc);
2990 2990  
2991 2991                  if (error == IE_NOMEM) {
2992 2992                          error = EAGAIN;
2993 2993                          break;
2994 2994                  }
2995 2995  
2996 2996                  if (error == IE_RETRY) {
2997 2997                          AS_LOCK_EXIT(as, &as->a_lock);
2998 2998                          goto setpgsz_top;
2999 2999                  }
↓ open down ↓ 58 lines elided ↑ open up ↑
3058 3058                  } else if (error != 0) {
3059 3059                          break;
3060 3060                  }
3061 3061          }
3062 3062          as_setwatch(as);
3063 3063          AS_LOCK_EXIT(as, &as->a_lock);
3064 3064          return (error);
3065 3065  }
3066 3066  
3067 3067  /*
3068      - * as_iset3_default_lpsize() just calls SEGOP_SETPAGESIZE() on all segments
     3068 + * as_iset3_default_lpsize() just calls segop_setpagesize() on all segments
3069 3069   * in its chunk where s_szc is less than the szc we want to set.
3070 3070   */
3071 3071  static int
3072 3072  as_iset3_default_lpsize(struct as *as, caddr_t raddr, size_t rsize, uint_t szc,
3073 3073      int *retry)
3074 3074  {
3075 3075          struct seg *seg;
3076 3076          size_t ssize;
3077 3077          int error;
3078 3078  
↓ open down ↓ 11 lines elided ↑ open up ↑
3090 3090                                  panic("as_iset3_default_lpsize: as changed");
3091 3091                          }
3092 3092                  }
3093 3093                  if ((raddr + rsize) > (seg->s_base + seg->s_size)) {
3094 3094                          ssize = seg->s_base + seg->s_size - raddr;
3095 3095                  } else {
3096 3096                          ssize = rsize;
3097 3097                  }
3098 3098  
3099 3099                  if (szc > seg->s_szc) {
3100      -                        error = SEGOP_SETPAGESIZE(seg, raddr, ssize, szc);
     3100 +                        error = segop_setpagesize(seg, raddr, ssize, szc);
3101 3101                          /* Only retry on EINVAL segments that have no vnode. */
3102 3102                          if (error == EINVAL) {
3103 3103                                  vnode_t *vp = NULL;
3104      -                                if ((SEGOP_GETTYPE(seg, raddr) & MAP_SHARED) &&
3105      -                                    (SEGOP_GETVP(seg, raddr, &vp) != 0 ||
     3104 +                                if ((segop_gettype(seg, raddr) & MAP_SHARED) &&
     3105 +                                    (segop_getvp(seg, raddr, &vp) != 0 ||
3106 3106                                      vp == NULL)) {
3107 3107                                          *retry = 1;
3108 3108                                  } else {
3109 3109                                          *retry = 0;
3110 3110                                  }
3111 3111                          }
3112 3112                          if (error) {
3113 3113                                  return (error);
3114 3114                          }
3115 3115                  }
↓ open down ↓ 222 lines elided ↑ open up ↑
3338 3338                  return (ENOMEM);
3339 3339          }
3340 3340          as_clearwatchprot(as, raddr, rsize);
3341 3341          seg = as_segat(as, raddr);
3342 3342          if (seg == NULL) {
3343 3343                  as_setwatch(as);
3344 3344                  AS_LOCK_EXIT(as, &as->a_lock);
3345 3345                  return (ENOMEM);
3346 3346          }
3347 3347          if (seg->s_ops == &segvn_ops) {
3348      -                rtype = SEGOP_GETTYPE(seg, addr);
     3348 +                rtype = segop_gettype(seg, addr);
3349 3349                  rflags = rtype & (MAP_TEXT | MAP_INITDATA);
3350 3350                  rtype = rtype & (MAP_SHARED | MAP_PRIVATE);
3351 3351                  segvn = 1;
3352 3352          } else {
3353 3353                  segvn = 0;
3354 3354          }
3355 3355          setaddr = raddr;
3356 3356          setsize = 0;
3357 3357  
3358 3358          for (; rsize != 0; rsize -= ssize, raddr += ssize, setsize += ssize) {
3359 3359                  if (raddr >= (seg->s_base + seg->s_size)) {
3360 3360                          seg = AS_SEGNEXT(as, seg);
3361 3361                          if (seg == NULL || raddr != seg->s_base) {
3362 3362                                  error = ENOMEM;
3363 3363                                  break;
3364 3364                          }
3365 3365                          if (seg->s_ops == &segvn_ops) {
3366      -                                stype = SEGOP_GETTYPE(seg, raddr);
     3366 +                                stype = segop_gettype(seg, raddr);
3367 3367                                  sflags = stype & (MAP_TEXT | MAP_INITDATA);
3368 3368                                  stype &= (MAP_SHARED | MAP_PRIVATE);
3369 3369                                  if (segvn && (rflags != sflags ||
3370 3370                                      rtype != stype)) {
3371 3371                                          /*
3372 3372                                           * The next segment is also segvn but
3373 3373                                           * has different flags and/or type.
3374 3374                                           */
3375 3375                                          ASSERT(setsize != 0);
3376 3376                                          error = as_iset_default_lpsize(as,
↓ open down ↓ 93 lines elided ↑ open up ↑
3470 3470  
3471 3471          ASSERT(AS_WRITE_HELD(as, &as->a_lock));
3472 3472  
3473 3473          for (pwp = avl_first(&as->a_wpage); pwp != NULL;
3474 3474              pwp = AVL_NEXT(&as->a_wpage, pwp)) {
3475 3475                  retrycnt = 0;
3476 3476          retry:
3477 3477                  vaddr = pwp->wp_vaddr;
3478 3478                  if (pwp->wp_oprot != 0 ||       /* already set up */
3479 3479                      (seg = as_segat(as, vaddr)) == NULL ||
3480      -                    SEGOP_GETPROT(seg, vaddr, 0, &prot) != 0)
     3480 +                    segop_getprot(seg, vaddr, 0, &prot) != 0)
3481 3481                          continue;
3482 3482  
3483 3483                  pwp->wp_oprot = prot;
3484 3484                  if (pwp->wp_read)
3485 3485                          prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3486 3486                  if (pwp->wp_write)
3487 3487                          prot &= ~PROT_WRITE;
3488 3488                  if (pwp->wp_exec)
3489 3489                          prot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3490 3490                  if (!(pwp->wp_flags & WP_NOWATCH) && prot != pwp->wp_oprot) {
3491      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
     3491 +                        err = segop_setprot(seg, vaddr, PAGESIZE, prot);
3492 3492                          if (err == IE_RETRY) {
3493 3493                                  pwp->wp_oprot = 0;
3494 3494                                  ASSERT(retrycnt == 0);
3495 3495                                  retrycnt++;
3496 3496                                  goto retry;
3497 3497                          }
3498 3498                  }
3499 3499                  pwp->wp_prot = prot;
3500 3500          }
3501 3501  }
↓ open down ↓ 18 lines elided ↑ open up ↑
3520 3520          for (pwp = avl_first(&as->a_wpage); pwp != NULL;
3521 3521              pwp = AVL_NEXT(&as->a_wpage, pwp)) {
3522 3522                  retrycnt = 0;
3523 3523          retry:
3524 3524                  vaddr = pwp->wp_vaddr;
3525 3525                  if (pwp->wp_oprot == 0 ||       /* not set up */
3526 3526                      (seg = as_segat(as, vaddr)) == NULL)
3527 3527                          continue;
3528 3528  
3529 3529                  if ((prot = pwp->wp_oprot) != pwp->wp_prot) {
3530      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, prot);
     3530 +                        err = segop_setprot(seg, vaddr, PAGESIZE, prot);
3531 3531                          if (err == IE_RETRY) {
3532 3532                                  ASSERT(retrycnt == 0);
3533 3533                                  retrycnt++;
3534 3534                                  goto retry;
3535 3535                          }
3536 3536                  }
3537 3537                  pwp->wp_oprot = 0;
3538 3538                  pwp->wp_prot = 0;
3539 3539          }
3540 3540  }
↓ open down ↓ 33 lines elided ↑ open up ↑
3574 3574                          wprot &= ~PROT_WRITE;
3575 3575                  if (pwp->wp_exec)
3576 3576                          wprot &= ~(PROT_READ|PROT_WRITE|PROT_EXEC);
3577 3577                  if (!(pwp->wp_flags & WP_NOWATCH) && wprot != pwp->wp_oprot) {
3578 3578                  retry:
3579 3579                          seg = as_segat(as, vaddr);
3580 3580                          if (seg == NULL) {
3581 3581                                  panic("as_setwatchprot: no seg");
3582 3582                                  /*NOTREACHED*/
3583 3583                          }
3584      -                        err = SEGOP_SETPROT(seg, vaddr, PAGESIZE, wprot);
     3584 +                        err = segop_setprot(seg, vaddr, PAGESIZE, wprot);
3585 3585                          if (err == IE_RETRY) {
3586 3586                                  ASSERT(retrycnt == 0);
3587 3587                                  retrycnt++;
3588 3588                                  goto retry;
3589 3589                          }
3590 3590                  }
3591 3591                  pwp->wp_oprot = prot;
3592 3592                  pwp->wp_prot = wprot;
3593 3593  
3594 3594                  pwp = AVL_NEXT(&as->a_wpage, pwp);
↓ open down ↓ 26 lines elided ↑ open up ↑
3621 3621          while (pwp != NULL && pwp->wp_vaddr < eaddr) {
3622 3622  
3623 3623                  if ((prot = pwp->wp_oprot) != 0) {
3624 3624                          retrycnt = 0;
3625 3625  
3626 3626                          if (prot != pwp->wp_prot) {
3627 3627                          retry:
3628 3628                                  seg = as_segat(as, pwp->wp_vaddr);
3629 3629                                  if (seg == NULL)
3630 3630                                          continue;
3631      -                                err = SEGOP_SETPROT(seg, pwp->wp_vaddr,
     3631 +                                err = segop_setprot(seg, pwp->wp_vaddr,
3632 3632                                      PAGESIZE, prot);
3633 3633                                  if (err == IE_RETRY) {
3634 3634                                          ASSERT(retrycnt == 0);
3635 3635                                          retrycnt++;
3636 3636                                          goto retry;
3637 3637  
3638 3638                                  }
3639 3639                          }
3640 3640                          pwp->wp_oprot = 0;
3641 3641                          pwp->wp_prot = 0;
↓ open down ↓ 36 lines elided ↑ open up ↑
3678 3678                  return (EFAULT);
3679 3679          }
3680 3680          /*
3681 3681           * catch old drivers which may not support getmemid
3682 3682           */
3683 3683          if (seg->s_ops->getmemid == NULL) {
3684 3684                  AS_LOCK_EXIT(as, &as->a_lock);
3685 3685                  return (ENODEV);
3686 3686          }
3687 3687  
3688      -        sts = SEGOP_GETMEMID(seg, addr, memidp);
     3688 +        sts = segop_getmemid(seg, addr, memidp);
3689 3689  
3690 3690          AS_LOCK_EXIT(as, &as->a_lock);
3691 3691          return (sts);
3692 3692  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX