Lines Matching defs:sbm

196 			 * sbm.mb_states.
205 } sbm;
218 /* One byte state per big block. See sbm.mb_states. */
227 * Mutex that protects the sbm.mb_count, sbm.mb_states,
228 * sbm.sb_states, bbm.bb_count, and bbm.bb_states
367 return (addr - mb_addr) / vm->sbm.sb_size;
443 const unsigned long idx = mb_id - vm->sbm.first_mb_id;
446 old_state = vm->sbm.mb_states[idx];
447 vm->sbm.mb_states[idx] = state;
449 BUG_ON(vm->sbm.mb_count[old_state] == 0);
450 vm->sbm.mb_count[old_state]--;
451 vm->sbm.mb_count[state]++;
460 const unsigned long idx = mb_id - vm->sbm.first_mb_id;
462 return vm->sbm.mb_states[idx];
470 int old_pages = PFN_UP(vm->sbm.next_mb_id - vm->sbm.first_mb_id);
471 int new_pages = PFN_UP(vm->sbm.next_mb_id - vm->sbm.first_mb_id + 1);
474 if (vm->sbm.mb_states && old_pages == new_pages)
482 if (vm->sbm.mb_states)
483 memcpy(new_array, vm->sbm.mb_states, old_pages * PAGE_SIZE);
484 vfree(vm->sbm.mb_states);
485 vm->sbm.mb_states = new_array;
492 for (_mb_id = _vm->sbm.first_mb_id; \
493 _mb_id < _vm->sbm.next_mb_id && _vm->sbm.mb_count[_state]; \
498 for (_mb_id = _vm->sbm.next_mb_id - 1; \
499 _mb_id >= _vm->sbm.first_mb_id && _vm->sbm.mb_count[_state]; \
510 return (mb_id - vm->sbm.first_mb_id) * vm->sbm.sbs_per_mb + sb_id;
524 __bitmap_set(vm->sbm.sb_states, bit, count);
538 __bitmap_clear(vm->sbm.sb_states, bit, count);
551 return test_bit(bit, vm->sbm.sb_states);
554 return find_next_zero_bit(vm->sbm.sb_states, bit + count, bit) >=
568 return find_next_bit(vm->sbm.sb_states, bit + count, bit) >=
573 * Find the first unplugged subblock. Returns vm->sbm.sbs_per_mb in case there is
581 return find_next_zero_bit(vm->sbm.sb_states,
582 bit + vm->sbm.sbs_per_mb, bit) - bit;
590 const unsigned long old_nb_mb = vm->sbm.next_mb_id - vm->sbm.first_mb_id;
591 const unsigned long old_nb_bits = old_nb_mb * vm->sbm.sbs_per_mb;
592 const unsigned long new_nb_bits = (old_nb_mb + 1) * vm->sbm.sbs_per_mb;
597 if (vm->sbm.sb_states && old_pages == new_pages)
605 if (vm->sbm.sb_states)
606 memcpy(new_bitmap, vm->sbm.sb_states, old_pages * PAGE_SIZE);
608 old_bitmap = vm->sbm.sb_states;
609 vm->sbm.sb_states = new_bitmap;
797 if (!virtio_mem_sbm_test_sb_unplugged(vm, mb_id, 0, vm->sbm.sbs_per_mb))
930 const unsigned long nr_pages = PFN_DOWN(vm->sbm.sb_size);
934 for (sb_id = 0; sb_id < vm->sbm.sbs_per_mb; sb_id++) {
938 sb_id * vm->sbm.sb_size);
946 const unsigned long nr_pages = PFN_DOWN(vm->sbm.sb_size);
950 for (sb_id = 0; sb_id < vm->sbm.sbs_per_mb; sb_id++) {
954 sb_id * vm->sbm.sb_size);
1335 order = ilog2(vm->sbm.sb_size) - PAGE_SHIFT;
1527 sb_id * vm->sbm.sb_size;
1528 const uint64_t size = count * vm->sbm.sb_size;
1545 sb_id * vm->sbm.sb_size;
1546 const uint64_t size = count * vm->sbm.sb_size;
1596 sb_id = vm->sbm.sbs_per_mb - 1;
1631 uint64_t nb_sb = vm->sbm.sbs_per_mb;
1644 if (vm->sbm.next_mb_id > vm->sbm.last_usable_mb_id)
1657 vm->sbm.mb_count[VIRTIO_MEM_SBM_MB_UNUSED]++;
1658 *mb_id = vm->sbm.next_mb_id++;
1671 const int count = min_t(int, *nb_sb, vm->sbm.sbs_per_mb);
1689 if (count == vm->sbm.sbs_per_mb)
1732 if (sb_id >= vm->sbm.sbs_per_mb)
1736 sb_id + count < vm->sbm.sbs_per_mb &&
1749 sb_id * vm->sbm.sb_size);
1750 nr_pages = PFN_DOWN(count * vm->sbm.sb_size);
1754 if (virtio_mem_sbm_test_sb_plugged(vm, mb_id, 0, vm->sbm.sbs_per_mb))
1767 uint64_t nb_sb = diff / vm->sbm.sb_size;
1947 if (!virtio_mem_sbm_test_sb_plugged(vm, mb_id, 0, vm->sbm.sbs_per_mb))
1953 if (virtio_mem_sbm_test_sb_unplugged(vm, mb_id, 0, vm->sbm.sbs_per_mb)) {
1980 const unsigned long nr_pages = PFN_DOWN(vm->sbm.sb_size) * count;
1986 sb_id * vm->sbm.sb_size);
2031 if (*nb_sb >= vm->sbm.sbs_per_mb &&
2032 virtio_mem_sbm_test_sb_plugged(vm, mb_id, 0, vm->sbm.sbs_per_mb)) {
2034 vm->sbm.sbs_per_mb);
2036 *nb_sb -= vm->sbm.sbs_per_mb;
2043 for (sb_id = vm->sbm.sbs_per_mb - 1; sb_id >= 0 && *nb_sb; sb_id--) {
2062 vm->sbm.have_unplugged_mb = 1;
2108 uint64_t nb_sb = diff / vm->sbm.sb_size;
2343 if (!vm->sbm.have_unplugged_mb)
2350 vm->sbm.have_unplugged_mb = false;
2362 vm->sbm.have_unplugged_mb = true;
2388 vm->sbm.last_usable_mb_id = virtio_mem_phys_to_mb_id(end_addr);
2390 vm->sbm.last_usable_mb_id--;
2463 if (!rc && vm->in_sbm && vm->sbm.have_unplugged_mb)
2567 vm->sbm.sb_size = sb_size;
2568 vm->sbm.sbs_per_mb = memory_block_size_bytes() /
2569 vm->sbm.sb_size;
2574 vm->sbm.first_mb_id = virtio_mem_phys_to_mb_id(addr);
2575 vm->sbm.next_mb_id = vm->sbm.first_mb_id;
2608 (unsigned long long)vm->sbm.sb_size);
3044 vfree(vm->sbm.mb_states);
3045 vfree(vm->sbm.sb_states);