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); |