| 1109 | } |
| 1110 | |
| 1111 | static int |
| 1112 | vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int pagerflags, |
| 1113 | int flags, boolean_t *allclean, boolean_t *eio) |
| 1114 | { |
| 1115 | vm_page_t ma[vm_pageout_page_count], p_first, tp; |
| 1116 | int count, i, mreq, runlen; |
| 1117 | |
| 1118 | vm_page_lock_assert(p, MA_NOTOWNED); |
| 1119 | vm_page_assert_xbusied(p); |
| 1120 | VM_OBJECT_ASSERT_WLOCKED(object); |
| 1121 | |
| 1122 | count = 1; |
| 1123 | mreq = 0; |
| 1124 | |
| 1125 | for (tp = p; count < vm_pageout_page_count; count++) { |
| 1126 | tp = vm_page_next(tp); |
| 1127 | if (tp == NULL || vm_page_tryxbusy(tp) == 0) |
| 1128 | break; |
| 1129 | if (!vm_object_page_remove_write(tp, flags, allclean)) { |
| 1130 | vm_page_xunbusy(tp); |
| 1131 | break; |
| 1132 | } |
| 1133 | } |
| 1134 | |
| 1135 | for (p_first = p; count < vm_pageout_page_count; count++) { |
| 1136 | tp = vm_page_prev(p_first); |
| 1137 | if (tp == NULL || vm_page_tryxbusy(tp) == 0) |
| 1138 | break; |
| 1139 | if (!vm_object_page_remove_write(tp, flags, allclean)) { |
| 1140 | vm_page_xunbusy(tp); |
| 1141 | break; |
| 1142 | } |
| 1143 | p_first = tp; |
| 1144 | mreq++; |
| 1145 | } |
| 1146 | |
| 1147 | for (tp = p_first, i = 0; i < count; tp = TAILQ_NEXT(tp, listq), i++) |
| 1148 | ma[i] = tp; |
| 1149 | |
| 1150 | vm_pageout_flush(ma, count, pagerflags, mreq, &runlen, eio); |
| 1151 | return (runlen); |
| 1152 | } |
| 1153 | |
| 1154 | /* |
| 1155 | * Note that there is absolutely no sense in writing out |
no test coverage detected