| 727 | /* ---- rehash */ |
| 728 | |
| 729 | static int |
| 730 | vmem_rehash(vmem_t *vm, vmem_size_t newhashsize) |
| 731 | { |
| 732 | bt_t *bt; |
| 733 | struct vmem_hashlist *newhashlist; |
| 734 | struct vmem_hashlist *oldhashlist; |
| 735 | vmem_size_t i, oldhashsize; |
| 736 | |
| 737 | MPASS(newhashsize > 0); |
| 738 | |
| 739 | newhashlist = malloc(sizeof(struct vmem_hashlist) * newhashsize, |
| 740 | M_VMEM, M_NOWAIT); |
| 741 | if (newhashlist == NULL) |
| 742 | return ENOMEM; |
| 743 | for (i = 0; i < newhashsize; i++) { |
| 744 | LIST_INIT(&newhashlist[i]); |
| 745 | } |
| 746 | |
| 747 | VMEM_LOCK(vm); |
| 748 | oldhashlist = vm->vm_hashlist; |
| 749 | oldhashsize = vm->vm_hashsize; |
| 750 | vm->vm_hashlist = newhashlist; |
| 751 | vm->vm_hashsize = newhashsize; |
| 752 | if (oldhashlist == NULL) { |
| 753 | VMEM_UNLOCK(vm); |
| 754 | return 0; |
| 755 | } |
| 756 | for (i = 0; i < oldhashsize; i++) { |
| 757 | while ((bt = LIST_FIRST(&oldhashlist[i])) != NULL) { |
| 758 | bt_rembusy(vm, bt); |
| 759 | bt_insbusy(vm, bt); |
| 760 | } |
| 761 | } |
| 762 | VMEM_UNLOCK(vm); |
| 763 | |
| 764 | if (oldhashlist != vm->vm_hash0) |
| 765 | free(oldhashlist, M_VMEM); |
| 766 | |
| 767 | return 0; |
| 768 | } |
| 769 | |
| 770 | static void |
| 771 | vmem_periodic_kick(void *dummy) |
no test coverage detected