1e2462113SFrancesco Romani /*
2e2462113SFrancesco Romani * QEMU System Emulator block write threshold notification
3e2462113SFrancesco Romani *
4e2462113SFrancesco Romani * Copyright Red Hat, Inc. 2014
5e2462113SFrancesco Romani *
6e2462113SFrancesco Romani * Authors:
7e2462113SFrancesco Romani * Francesco Romani <fromani@redhat.com>
8e2462113SFrancesco Romani *
9e2462113SFrancesco Romani * This work is licensed under the terms of the GNU LGPL, version 2 or later.
10e2462113SFrancesco Romani * See the COPYING.LIB file in the top-level directory.
11e2462113SFrancesco Romani */
12e2462113SFrancesco Romani
1380c71a24SPeter Maydell #include "qemu/osdep.h"
14*e2c1c34fSMarkus Armbruster #include "block/block-io.h"
15e2462113SFrancesco Romani #include "block/block_int.h"
16e2462113SFrancesco Romani #include "block/write-threshold.h"
17e688df6bSMarkus Armbruster #include "qapi/error.h"
189af23989SMarkus Armbruster #include "qapi/qapi-commands-block-core.h"
199af23989SMarkus Armbruster #include "qapi/qapi-events-block-core.h"
20e2462113SFrancesco Romani
bdrv_write_threshold_get(const BlockDriverState * bs)21e2462113SFrancesco Romani uint64_t bdrv_write_threshold_get(const BlockDriverState *bs)
22e2462113SFrancesco Romani {
23e2462113SFrancesco Romani return bs->write_threshold_offset;
24e2462113SFrancesco Romani }
25e2462113SFrancesco Romani
bdrv_write_threshold_set(BlockDriverState * bs,uint64_t threshold_bytes)26e2462113SFrancesco Romani void bdrv_write_threshold_set(BlockDriverState *bs, uint64_t threshold_bytes)
27e2462113SFrancesco Romani {
2894783301SVladimir Sementsov-Ogievskiy bs->write_threshold_offset = threshold_bytes;
29e2462113SFrancesco Romani }
30e2462113SFrancesco Romani
qmp_block_set_write_threshold(const char * node_name,uint64_t threshold_bytes,Error ** errp)31e2462113SFrancesco Romani void qmp_block_set_write_threshold(const char *node_name,
32e2462113SFrancesco Romani uint64_t threshold_bytes,
33e2462113SFrancesco Romani Error **errp)
34e2462113SFrancesco Romani {
35e2462113SFrancesco Romani BlockDriverState *bs;
36e2462113SFrancesco Romani
37e2462113SFrancesco Romani bs = bdrv_find_node(node_name);
38e2462113SFrancesco Romani if (!bs) {
396ec46ad5SMarkus Armbruster error_setg(errp, "Device '%s' not found", node_name);
40e2462113SFrancesco Romani return;
41e2462113SFrancesco Romani }
42e2462113SFrancesco Romani
43e2462113SFrancesco Romani bdrv_write_threshold_set(bs, threshold_bytes);
44e2462113SFrancesco Romani }
4594783301SVladimir Sementsov-Ogievskiy
bdrv_write_threshold_check_write(BlockDriverState * bs,int64_t offset,int64_t bytes)4694783301SVladimir Sementsov-Ogievskiy void bdrv_write_threshold_check_write(BlockDriverState *bs, int64_t offset,
4794783301SVladimir Sementsov-Ogievskiy int64_t bytes)
4894783301SVladimir Sementsov-Ogievskiy {
4994783301SVladimir Sementsov-Ogievskiy int64_t end = offset + bytes;
5094783301SVladimir Sementsov-Ogievskiy uint64_t wtr = bs->write_threshold_offset;
5194783301SVladimir Sementsov-Ogievskiy
5294783301SVladimir Sementsov-Ogievskiy if (wtr > 0 && end > wtr) {
5394783301SVladimir Sementsov-Ogievskiy qapi_event_send_block_write_threshold(bs->node_name, end - wtr, wtr);
5494783301SVladimir Sementsov-Ogievskiy
5594783301SVladimir Sementsov-Ogievskiy /* autodisable to avoid flooding the monitor */
5694783301SVladimir Sementsov-Ogievskiy bdrv_write_threshold_set(bs, 0);
5794783301SVladimir Sementsov-Ogievskiy }
5894783301SVladimir Sementsov-Ogievskiy }
59