Lines Matching refs:ex

129 extent_alloc_region_descriptor(struct extent *ex, int flags)
134 if (ex->ex_flags & EXF_FIXED) {
135 struct extent_fixed *fex = (struct extent_fixed *)ex;
137 if (!(ex->ex_flags & EXF_EARLY))
138 mutex_enter(&ex->ex_lock);
148 if (!(ex->ex_flags & EXF_EARLY))
149 mutex_exit(&ex->ex_lock);
153 if (!(ex->ex_flags & EXF_EARLY))
154 mutex_exit(&ex->ex_lock);
158 if (!(ex->ex_flags & EXF_EARLY))
159 mutex_exit(&ex->ex_lock);
162 KASSERT(mutex_owned(&ex->ex_lock));
163 ex->ex_flwanted = true;
165 error = cv_wait_sig(&ex->ex_cv, &ex->ex_lock);
167 cv_wait(&ex->ex_cv, &ex->ex_lock);
171 mutex_exit(&ex->ex_lock);
190 extent_free_region_descriptor(struct extent *ex, struct extent_region *rp)
193 if (ex->ex_flags & EXF_FIXED) {
194 struct extent_fixed *fex = (struct extent_fixed *)ex;
202 if (ex->ex_flwanted) {
217 if (!(ex->ex_flags & EXF_EARLY)) {
218 ex->ex_flwanted = false;
219 cv_broadcast(&ex->ex_cv);
237 struct extent *ex;
273 ex = (struct extent *)fex;
291 ex = kmem_alloc(sizeof(*ex),
293 if (ex == NULL)
299 mutex_init(&ex->ex_lock, MUTEX_DEFAULT, IPL_VM);
300 cv_init(&ex->ex_cv, "extent");
302 LIST_INIT(&ex->ex_regions);
303 ex->ex_name = name;
304 ex->ex_start = start;
305 ex->ex_end = end;
306 ex->ex_flags = 0;
307 ex->ex_flwanted = false;
309 ex->ex_flags |= EXF_FIXED;
311 ex->ex_flags |= EXF_NOCOALESCE;
313 ex->ex_flags |= EXF_EARLY;
314 return (ex);
323 extent_destroy(struct extent *ex)
329 if (ex == NULL)
334 for (rp = LIST_FIRST(&ex->ex_regions); rp != NULL; ) {
338 extent_free_region_descriptor(ex, orp);
341 cv_destroy(&ex->ex_cv);
342 mutex_destroy(&ex->ex_lock);
345 if ((ex->ex_flags & EXF_FIXED) == 0)
346 kmem_free(ex, sizeof(*ex));
357 extent_insert_and_optimize(struct extent *ex, u_long start, u_long size,
369 if (((ex->ex_flags & EXF_NOCOALESCE) == 0) &&
370 (LIST_FIRST(&ex->ex_regions) != NULL) &&
371 ((start + size) == LIST_FIRST(&ex->ex_regions)->er_start)) {
375 LIST_FIRST(&ex->ex_regions)->er_start = start;
376 extent_free_region_descriptor(ex, rp);
386 LIST_INSERT_HEAD(&ex->ex_regions, rp, er_link);
393 if (ex->ex_flags & EXF_NOCOALESCE)
425 extent_free_region_descriptor(ex, nextr);
433 extent_free_region_descriptor(ex, rp);
443 extent_free_region_descriptor(ex, rp);
462 extent_alloc_region(struct extent *ex, u_long start, u_long size, int flags)
470 if (ex == NULL)
474 ex->ex_name, size);
480 ex->ex_name, start, size);
498 if ((start < ex->ex_start) || (end > ex->ex_end)) {
501 ex->ex_name, ex->ex_start, ex->ex_end);
515 myrp = extent_alloc_region_descriptor(ex, flags);
524 if (!(ex->ex_flags & EXF_EARLY))
525 mutex_enter(&ex->ex_lock);
544 LIST_FOREACH(rp, &ex->ex_regions, er_link) {
563 KASSERT(!(ex->ex_flags & EXF_EARLY));
565 error = cv_wait_sig(&ex->ex_cv,
566 &ex->ex_lock);
568 cv_wait(&ex->ex_cv, &ex->ex_lock);
573 mutex_exit(&ex->ex_lock);
575 if (!(ex->ex_flags & EXF_EARLY))
576 mutex_exit(&ex->ex_lock);
579 extent_free_region_descriptor(ex, myrp);
595 extent_insert_and_optimize(ex, start, size, flags, last, myrp);
596 if (!(ex->ex_flags & EXF_EARLY))
597 mutex_exit(&ex->ex_lock);
618 extent_alloc_subregion1(struct extent *ex, u_long substart, u_long subend,
635 if (ex == NULL)
639 if ((substart < ex->ex_start) || (substart > ex->ex_end) ||
640 (subend > ex->ex_end) || (subend < ex->ex_start)) {
642 "ex_end 0x%lx\n", ex->ex_name, ex->ex_start, ex->ex_end);
649 ex->ex_name, size);
659 "boundary 0x%lx\n", ex->ex_name, size, boundary);
674 myrp = extent_alloc_region_descriptor(ex, flags);
684 mutex_enter(&ex->ex_lock);
714 exend = ex->ex_end;
723 if (newstart < ex->ex_start) {
727 ex->ex_name, ex->ex_start, ex->ex_end, alignment);
728 mutex_exit(&ex->ex_lock);
731 extent_free_region_descriptor(ex, myrp);
732 mutex_exit(&ex->ex_lock);
742 LIST_FOREACH(rp, &ex->ex_regions, er_link) {
784 (flags & EX_BOUNDZERO) ? 0 : ex->ex_start)
789 newstart, newend, ex->ex_start, ex->ex_end,
794 if (dontcross < ex->ex_start)
795 dontcross = ex->ex_end;
815 if (newstart + size - 1 > ex->ex_end ||
879 (flags & EX_BOUNDZERO) ? 0 : ex->ex_start)
884 newstart, newend, ex->ex_start, ex->ex_end,
889 if (dontcross < ex->ex_start)
890 dontcross = ex->ex_end;
910 if (newstart + size - 1 > ex->ex_end ||
965 error = cv_wait_sig(&ex->ex_cv, &ex->ex_lock);
967 cv_wait(&ex->ex_cv, &ex->ex_lock);
972 mutex_exit(&ex->ex_lock);
974 mutex_exit(&ex->ex_lock);
978 extent_free_region_descriptor(ex, myrp);
985 extent_insert_and_optimize(ex, newstart, size, flags, last, myrp);
986 mutex_exit(&ex->ex_lock);
992 extent_alloc_subregion(struct extent *ex, u_long start, u_long end, u_long size,
996 return (extent_alloc_subregion1(ex, start, end, size, alignment,
1001 extent_alloc(struct extent *ex, u_long size, u_long alignment, u_long boundary,
1005 return (extent_alloc_subregion1(ex, ex->ex_start, ex->ex_end,
1011 extent_alloc1(struct extent *ex, u_long size, u_long alignment, u_long skew,
1015 return (extent_alloc_subregion1(ex, ex->ex_start, ex->ex_end,
1021 extent_free(struct extent *ex, u_long start, u_long size, int flags)
1034 if (ex == NULL)
1036 if ((start < ex->ex_start) || (end > ex->ex_end)) {
1037 extent_print(ex);
1039 ex->ex_name, start, size);
1041 ex->ex_name);
1045 extent_print(ex);
1047 ex->ex_name, start, size);
1056 const bool coalesce = (ex->ex_flags & EXF_NOCOALESCE) == 0;
1060 nrp = extent_alloc_region_descriptor(ex, flags);
1065 if (!(ex->ex_flags & EXF_EARLY))
1066 mutex_enter(&ex->ex_lock);
1086 LIST_FOREACH(rp, &ex->ex_regions, er_link) {
1107 extent_free_region_descriptor(ex, rp);
1149 if (!(ex->ex_flags & EXF_EARLY))
1150 mutex_exit(&ex->ex_lock);
1151 extent_print(ex);
1157 extent_free_region_descriptor(ex, nrp);
1158 if (!(ex->ex_flags & EXF_EARLY)) {
1159 cv_broadcast(&ex->ex_cv);
1160 mutex_exit(&ex->ex_lock);
1166 extent_print(struct extent *ex)
1170 if (ex == NULL)
1173 if (!(ex->ex_flags & EXF_EARLY))
1174 mutex_enter(&ex->ex_lock);
1176 printf("extent `%s' (0x%lx - 0x%lx), flags = 0x%x\n", ex->ex_name,
1177 ex->ex_start, ex->ex_end, ex->ex_flags);
1179 LIST_FOREACH(rp, &ex->ex_regions, er_link)
1182 if (!(ex->ex_flags & EXF_EARLY))
1183 mutex_exit(&ex->ex_lock);