1 /* 2 * BlockBackend RAM Registrar 3 * 4 * SPDX-License-Identifier: GPL-2.0-or-later 5 */ 6 7 #include "qemu/osdep.h" 8 #include "sysemu/block-backend.h" 9 #include "sysemu/block-ram-registrar.h" 10 #include "qapi/error.h" 11 12 static void ram_block_added(RAMBlockNotifier *n, void *host, size_t size, 13 size_t max_size) 14 { 15 BlockRAMRegistrar *r = container_of(n, BlockRAMRegistrar, notifier); 16 Error *err = NULL; 17 18 if (!r->ok) { 19 return; /* don't try again if we've already failed */ 20 } 21 22 if (!blk_register_buf(r->blk, host, max_size, &err)) { 23 error_report_err(err); 24 ram_block_notifier_remove(&r->notifier); 25 r->ok = false; 26 } 27 } 28 29 static void ram_block_removed(RAMBlockNotifier *n, void *host, size_t size, 30 size_t max_size) 31 { 32 BlockRAMRegistrar *r = container_of(n, BlockRAMRegistrar, notifier); 33 blk_unregister_buf(r->blk, host, max_size); 34 } 35 36 void blk_ram_registrar_init(BlockRAMRegistrar *r, BlockBackend *blk) 37 { 38 r->blk = blk; 39 r->notifier = (RAMBlockNotifier){ 40 .ram_block_added = ram_block_added, 41 .ram_block_removed = ram_block_removed, 42 43 /* 44 * .ram_block_resized() is not necessary because we use the max_size 45 * value that does not change across resize. 46 */ 47 }; 48 r->ok = true; 49 50 ram_block_notifier_add(&r->notifier); 51 } 52 53 void blk_ram_registrar_destroy(BlockRAMRegistrar *r) 54 { 55 if (r->ok) { 56 ram_block_notifier_remove(&r->notifier); 57 } 58 } 59