| From c7b44fe9d388c5068aa40d78f6eaea042435e747 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Jun 2021 20:57:14 +0200 |
| Subject: virtio-mem: don't read big block size in Sub Block Mode |
| |
| From: David Hildenbrand <david@redhat.com> |
| |
| [ Upstream commit 500817bf5e110ad9b7138bc582971bb7ee77d6f7 ] |
| |
| We are reading a Big Block Mode value while in Sub Block Mode |
| when initializing. Fortunately, vm->bbm.bb_size maps to some counter |
| in the vm->sbm.mb_count array, which is 0 at that point in time. |
| |
| No harm done; still, this was unintended and is not future-proof. |
| |
| Fixes: 4ba50cd3355d ("virtio-mem: Big Block Mode (BBM) memory hotplug") |
| Signed-off-by: David Hildenbrand <david@redhat.com> |
| Link: https://lore.kernel.org/r/20210602185720.31821-2-david@redhat.com |
| Signed-off-by: Michael S. Tsirkin <mst@redhat.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/virtio/virtio_mem.c | 15 ++++++++------- |
| 1 file changed, 8 insertions(+), 7 deletions(-) |
| |
| diff --git a/drivers/virtio/virtio_mem.c b/drivers/virtio/virtio_mem.c |
| index 10ec60d81e84..3bf08b5bb359 100644 |
| --- a/drivers/virtio/virtio_mem.c |
| +++ b/drivers/virtio/virtio_mem.c |
| @@ -2420,6 +2420,10 @@ static int virtio_mem_init(struct virtio_mem *vm) |
| dev_warn(&vm->vdev->dev, |
| "Some device memory is not addressable/pluggable. This can make some memory unusable.\n"); |
| |
| + /* Prepare the offline threshold - make sure we can add two blocks. */ |
| + vm->offline_threshold = max_t(uint64_t, 2 * memory_block_size_bytes(), |
| + VIRTIO_MEM_DEFAULT_OFFLINE_THRESHOLD); |
| + |
| /* |
| * We want subblocks to span at least MAX_ORDER_NR_PAGES and |
| * pageblock_nr_pages pages. This: |
| @@ -2466,14 +2470,11 @@ static int virtio_mem_init(struct virtio_mem *vm) |
| vm->bbm.bb_size - 1; |
| vm->bbm.first_bb_id = virtio_mem_phys_to_bb_id(vm, addr); |
| vm->bbm.next_bb_id = vm->bbm.first_bb_id; |
| - } |
| |
| - /* Prepare the offline threshold - make sure we can add two blocks. */ |
| - vm->offline_threshold = max_t(uint64_t, 2 * memory_block_size_bytes(), |
| - VIRTIO_MEM_DEFAULT_OFFLINE_THRESHOLD); |
| - /* In BBM, we also want at least two big blocks. */ |
| - vm->offline_threshold = max_t(uint64_t, 2 * vm->bbm.bb_size, |
| - vm->offline_threshold); |
| + /* Make sure we can add two big blocks. */ |
| + vm->offline_threshold = max_t(uint64_t, 2 * vm->bbm.bb_size, |
| + vm->offline_threshold); |
| + } |
| |
| dev_info(&vm->vdev->dev, "start address: 0x%llx", vm->addr); |
| dev_info(&vm->vdev->dev, "region size: 0x%llx", vm->region_size); |
| -- |
| 2.30.2 |
| |