Commit 19629537bd8d81fa7a32f2df5c39419afded04fa
Committed by
Anthony Liguori
1 parent
9f9e28cd
introduce set_rate_limit function for QEMUFile
This patch converts the current callers of qemu_fopen_ops(). Signed-off-by: Glauber Costa <glommer@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
3 changed files
with
43 additions
and
10 deletions
buffered_file.c
| @@ -198,6 +198,19 @@ static int buffered_rate_limit(void *opaque) | @@ -198,6 +198,19 @@ static int buffered_rate_limit(void *opaque) | ||
| 198 | return 0; | 198 | return 0; |
| 199 | } | 199 | } |
| 200 | 200 | ||
| 201 | +static size_t buffered_set_rate_limit(void *opaque, size_t new_rate) | ||
| 202 | +{ | ||
| 203 | + QEMUFileBuffered *s = opaque; | ||
| 204 | + | ||
| 205 | + if (s->has_error) | ||
| 206 | + goto out; | ||
| 207 | + | ||
| 208 | + s->xfer_limit = new_rate / 10; | ||
| 209 | + | ||
| 210 | +out: | ||
| 211 | + return s->xfer_limit; | ||
| 212 | +} | ||
| 213 | + | ||
| 201 | static void buffered_rate_tick(void *opaque) | 214 | static void buffered_rate_tick(void *opaque) |
| 202 | { | 215 | { |
| 203 | QEMUFileBuffered *s = opaque; | 216 | QEMUFileBuffered *s = opaque; |
| @@ -237,7 +250,8 @@ QEMUFile *qemu_fopen_ops_buffered(void *opaque, | @@ -237,7 +250,8 @@ QEMUFile *qemu_fopen_ops_buffered(void *opaque, | ||
| 237 | s->close = close; | 250 | s->close = close; |
| 238 | 251 | ||
| 239 | s->file = qemu_fopen_ops(s, buffered_put_buffer, NULL, | 252 | s->file = qemu_fopen_ops(s, buffered_put_buffer, NULL, |
| 240 | - buffered_close, buffered_rate_limit); | 253 | + buffered_close, buffered_rate_limit, |
| 254 | + buffered_set_rate_limit); | ||
| 241 | 255 | ||
| 242 | s->timer = qemu_new_timer(rt_clock, buffered_rate_tick, s); | 256 | s->timer = qemu_new_timer(rt_clock, buffered_rate_tick, s); |
| 243 | 257 |
hw/hw.h
| @@ -36,10 +36,17 @@ typedef int (QEMUFileCloseFunc)(void *opaque); | @@ -36,10 +36,17 @@ typedef int (QEMUFileCloseFunc)(void *opaque); | ||
| 36 | */ | 36 | */ |
| 37 | typedef int (QEMUFileRateLimit)(void *opaque); | 37 | typedef int (QEMUFileRateLimit)(void *opaque); |
| 38 | 38 | ||
| 39 | +/* Called to change the current bandwidth allocation. This function must return | ||
| 40 | + * the new actual bandwidth. It should be new_rate if everything goes ok, and | ||
| 41 | + * the old rate otherwise | ||
| 42 | + */ | ||
| 43 | +typedef size_t (QEMUFileSetRateLimit)(void *opaque, size_t new_rate); | ||
| 44 | + | ||
| 39 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, | 45 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, |
| 40 | QEMUFileGetBufferFunc *get_buffer, | 46 | QEMUFileGetBufferFunc *get_buffer, |
| 41 | QEMUFileCloseFunc *close, | 47 | QEMUFileCloseFunc *close, |
| 42 | - QEMUFileRateLimit *rate_limit); | 48 | + QEMUFileRateLimit *rate_limit, |
| 49 | + QEMUFileSetRateLimit *set_rate_limit); | ||
| 43 | QEMUFile *qemu_fopen(const char *filename, const char *mode); | 50 | QEMUFile *qemu_fopen(const char *filename, const char *mode); |
| 44 | QEMUFile *qemu_fopen_socket(int fd); | 51 | QEMUFile *qemu_fopen_socket(int fd); |
| 45 | QEMUFile *qemu_popen(FILE *popen_file, const char *mode); | 52 | QEMUFile *qemu_popen(FILE *popen_file, const char *mode); |
| @@ -73,6 +80,7 @@ unsigned int qemu_get_be16(QEMUFile *f); | @@ -73,6 +80,7 @@ unsigned int qemu_get_be16(QEMUFile *f); | ||
| 73 | unsigned int qemu_get_be32(QEMUFile *f); | 80 | unsigned int qemu_get_be32(QEMUFile *f); |
| 74 | uint64_t qemu_get_be64(QEMUFile *f); | 81 | uint64_t qemu_get_be64(QEMUFile *f); |
| 75 | int qemu_file_rate_limit(QEMUFile *f); | 82 | int qemu_file_rate_limit(QEMUFile *f); |
| 83 | +size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate); | ||
| 76 | int qemu_file_has_error(QEMUFile *f); | 84 | int qemu_file_has_error(QEMUFile *f); |
| 77 | void qemu_file_set_error(QEMUFile *f); | 85 | void qemu_file_set_error(QEMUFile *f); |
| 78 | 86 |
savevm.c
| @@ -159,6 +159,7 @@ struct QEMUFile { | @@ -159,6 +159,7 @@ struct QEMUFile { | ||
| 159 | QEMUFileGetBufferFunc *get_buffer; | 159 | QEMUFileGetBufferFunc *get_buffer; |
| 160 | QEMUFileCloseFunc *close; | 160 | QEMUFileCloseFunc *close; |
| 161 | QEMUFileRateLimit *rate_limit; | 161 | QEMUFileRateLimit *rate_limit; |
| 162 | + QEMUFileSetRateLimit *set_rate_limit; | ||
| 162 | void *opaque; | 163 | void *opaque; |
| 163 | int is_write; | 164 | int is_write; |
| 164 | 165 | ||
| @@ -239,9 +240,9 @@ QEMUFile *qemu_popen(FILE *popen_file, const char *mode) | @@ -239,9 +240,9 @@ QEMUFile *qemu_popen(FILE *popen_file, const char *mode) | ||
| 239 | s->popen_file = popen_file; | 240 | s->popen_file = popen_file; |
| 240 | 241 | ||
| 241 | if(mode[0] == 'r') { | 242 | if(mode[0] == 'r') { |
| 242 | - s->file = qemu_fopen_ops(s, NULL, popen_get_buffer, popen_close, NULL); | 243 | + s->file = qemu_fopen_ops(s, NULL, popen_get_buffer, popen_close, NULL, NULL); |
| 243 | } else { | 244 | } else { |
| 244 | - s->file = qemu_fopen_ops(s, popen_put_buffer, NULL, popen_close, NULL); | 245 | + s->file = qemu_fopen_ops(s, popen_put_buffer, NULL, popen_close, NULL, NULL); |
| 245 | } | 246 | } |
| 246 | fprintf(stderr, "qemu_popen: returning result of qemu_fopen_ops\n"); | 247 | fprintf(stderr, "qemu_popen: returning result of qemu_fopen_ops\n"); |
| 247 | return s->file; | 248 | return s->file; |
| @@ -264,7 +265,7 @@ QEMUFile *qemu_fopen_socket(int fd) | @@ -264,7 +265,7 @@ QEMUFile *qemu_fopen_socket(int fd) | ||
| 264 | QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket)); | 265 | QEMUFileSocket *s = qemu_mallocz(sizeof(QEMUFileSocket)); |
| 265 | 266 | ||
| 266 | s->fd = fd; | 267 | s->fd = fd; |
| 267 | - s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL); | 268 | + s->file = qemu_fopen_ops(s, NULL, socket_get_buffer, socket_close, NULL, NULL); |
| 268 | return s->file; | 269 | return s->file; |
| 269 | } | 270 | } |
| 270 | 271 | ||
| @@ -308,9 +309,9 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode) | @@ -308,9 +309,9 @@ QEMUFile *qemu_fopen(const char *filename, const char *mode) | ||
| 308 | goto fail; | 309 | goto fail; |
| 309 | 310 | ||
| 310 | if (!strcmp(mode, "wb")) | 311 | if (!strcmp(mode, "wb")) |
| 311 | - return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL); | 312 | + return qemu_fopen_ops(s, file_put_buffer, NULL, file_close, NULL, NULL); |
| 312 | else if (!strcmp(mode, "rb")) | 313 | else if (!strcmp(mode, "rb")) |
| 313 | - return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL); | 314 | + return qemu_fopen_ops(s, NULL, file_get_buffer, file_close, NULL, NULL); |
| 314 | 315 | ||
| 315 | fail: | 316 | fail: |
| 316 | if (s->outfile) | 317 | if (s->outfile) |
| @@ -356,15 +357,16 @@ static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_wr | @@ -356,15 +357,16 @@ static QEMUFile *qemu_fopen_bdrv(BlockDriverState *bs, int64_t offset, int is_wr | ||
| 356 | s->base_offset = offset; | 357 | s->base_offset = offset; |
| 357 | 358 | ||
| 358 | if (is_writable) | 359 | if (is_writable) |
| 359 | - return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL); | 360 | + return qemu_fopen_ops(s, block_put_buffer, NULL, bdrv_fclose, NULL, NULL); |
| 360 | 361 | ||
| 361 | - return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL); | 362 | + return qemu_fopen_ops(s, NULL, block_get_buffer, bdrv_fclose, NULL, NULL); |
| 362 | } | 363 | } |
| 363 | 364 | ||
| 364 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, | 365 | QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, |
| 365 | QEMUFileGetBufferFunc *get_buffer, | 366 | QEMUFileGetBufferFunc *get_buffer, |
| 366 | QEMUFileCloseFunc *close, | 367 | QEMUFileCloseFunc *close, |
| 367 | - QEMUFileRateLimit *rate_limit) | 368 | + QEMUFileRateLimit *rate_limit, |
| 369 | + QEMUFileSetRateLimit *set_rate_limit) | ||
| 368 | { | 370 | { |
| 369 | QEMUFile *f; | 371 | QEMUFile *f; |
| 370 | 372 | ||
| @@ -375,6 +377,7 @@ QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, | @@ -375,6 +377,7 @@ QEMUFile *qemu_fopen_ops(void *opaque, QEMUFilePutBufferFunc *put_buffer, | ||
| 375 | f->get_buffer = get_buffer; | 377 | f->get_buffer = get_buffer; |
| 376 | f->close = close; | 378 | f->close = close; |
| 377 | f->rate_limit = rate_limit; | 379 | f->rate_limit = rate_limit; |
| 380 | + f->set_rate_limit = set_rate_limit; | ||
| 378 | f->is_write = 0; | 381 | f->is_write = 0; |
| 379 | 382 | ||
| 380 | return f; | 383 | return f; |
| @@ -552,6 +555,14 @@ int qemu_file_rate_limit(QEMUFile *f) | @@ -552,6 +555,14 @@ int qemu_file_rate_limit(QEMUFile *f) | ||
| 552 | return 0; | 555 | return 0; |
| 553 | } | 556 | } |
| 554 | 557 | ||
| 558 | +size_t qemu_file_set_rate_limit(QEMUFile *f, size_t new_rate) | ||
| 559 | +{ | ||
| 560 | + if (f->set_rate_limit) | ||
| 561 | + return f->set_rate_limit(f->opaque, new_rate); | ||
| 562 | + | ||
| 563 | + return 0; | ||
| 564 | +} | ||
| 565 | + | ||
| 555 | void qemu_put_be16(QEMUFile *f, unsigned int v) | 566 | void qemu_put_be16(QEMUFile *f, unsigned int v) |
| 556 | { | 567 | { |
| 557 | qemu_put_byte(f, v >> 8); | 568 | qemu_put_byte(f, v >> 8); |