1
The following changes since commit fb68096da3d35e64c88cd610c1fa42766c58e92a:
1
The following changes since commit 711c0418c8c1ce3a24346f058b001c4c5a2f0f81:
2
2
3
Revert "tests: use memfd in vhost-user-test" (2018-02-13 09:51:52 +0000)
3
Merge remote-tracking branch 'remotes/philmd/tags/mips-20210702' into staging (2021-07-04 14:04:12 +0100)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
git://github.com/stefanha/qemu.git tags/block-pull-request
7
https://gitlab.com/stefanha/qemu.git tags/block-pull-request
8
8
9
for you to fetch changes up to 64b01feca991e5b19a5d750ef77cdca92b68bdbb:
9
for you to fetch changes up to 9f460c64e13897117f35ffb61f6f5e0102cabc70:
10
10
11
misc: fix spelling (2018-02-13 15:38:17 +0000)
11
block/io: Merge discard request alignments (2021-07-06 14:28:55 +0100)
12
13
----------------------------------------------------------------
14
Pull request
12
15
13
----------------------------------------------------------------
16
----------------------------------------------------------------
14
17
15
----------------------------------------------------------------
18
Akihiko Odaki (3):
19
block/file-posix: Optimize for macOS
20
block: Add backend_defaults property
21
block/io: Merge discard request alignments
16
22
17
Fam Zheng (2):
23
Stefan Hajnoczi (2):
18
Add a git-publish configuration file
24
util/async: add a human-readable name to BHs for debugging
19
README: Document 'git-publish' workflow
25
util/async: print leaked BH name when AioContext finalizes
20
26
21
Marc-André Lureau (1):
27
include/block/aio.h | 31 ++++++++++++++++++++++---
22
misc: fix spelling
28
include/hw/block/block.h | 3 +++
23
29
include/qemu/main-loop.h | 4 +++-
24
Stefan Hajnoczi (1):
30
block/file-posix.c | 27 ++++++++++++++++++++--
25
vl: pause vcpus before stopping iothreads
31
block/io.c | 2 ++
26
32
hw/block/block.c | 42 ++++++++++++++++++++++++++++++----
27
Wolfgang Bumiller (1):
33
tests/unit/ptimer-test-stubs.c | 2 +-
28
ratelimit: don't align wait time with slices
34
util/async.c | 25 ++++++++++++++++----
29
35
util/main-loop.c | 4 ++--
30
include/qemu/ratelimit.h | 11 ++++-----
36
tests/qemu-iotests/172.out | 38 ++++++++++++++++++++++++++++++
31
util/qemu-coroutine-lock.c | 2 +-
37
10 files changed, 161 insertions(+), 17 deletions(-)
32
vl.c | 12 ++++++++--
33
.gitpublish | 58 ++++++++++++++++++++++++++++++++++++++++++++++
34
README | 31 ++++++++++++++++++++++++-
35
5 files changed, 104 insertions(+), 10 deletions(-)
36
create mode 100644 .gitpublish
37
38
38
--
39
--
39
2.14.3
40
2.31.1
40
41
41
diff view generated by jsdifflib
1
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
1
It can be difficult to debug issues with BHs in production environments.
2
Although BHs can usually be identified by looking up their ->cb()
3
function pointer, this requires debug information for the program. It is
4
also not possible to print human-readable diagnostics about BHs because
5
they have no identifier.
2
6
3
It is possible for rate limited writes to keep overshooting a slice's
7
This patch adds a name to each BH. The name is not unique per instance
4
quota by a tiny amount causing the slice-aligned waiting period to
8
but differentiates between cb() functions, which is usually enough. It's
5
effectively halve the rate.
9
done by changing aio_bh_new() and friends to macros that stringify cb.
6
10
7
Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
11
The next patch will use the name field when reporting leaked BHs.
8
Reviewed-by: Alberto Garcia <berto@igalia.com>
12
9
Message-id: 20180207071758.6818-1-w.bumiller@proxmox.com
10
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
13
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
15
Message-Id: <20210414200247.917496-2-stefanha@redhat.com>
11
---
16
---
12
include/qemu/ratelimit.h | 11 +++++------
17
include/block/aio.h | 31 ++++++++++++++++++++++++++++---
13
1 file changed, 5 insertions(+), 6 deletions(-)
18
include/qemu/main-loop.h | 4 +++-
19
tests/unit/ptimer-test-stubs.c | 2 +-
20
util/async.c | 9 +++++++--
21
util/main-loop.c | 4 ++--
22
5 files changed, 41 insertions(+), 9 deletions(-)
14
23
15
diff --git a/include/qemu/ratelimit.h b/include/qemu/ratelimit.h
24
diff --git a/include/block/aio.h b/include/block/aio.h
16
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
17
--- a/include/qemu/ratelimit.h
26
--- a/include/block/aio.h
18
+++ b/include/qemu/ratelimit.h
27
+++ b/include/block/aio.h
19
@@ -XXX,XX +XXX,XX @@ typedef struct {
28
@@ -XXX,XX +XXX,XX @@ void aio_context_acquire(AioContext *ctx);
20
static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
29
/* Relinquish ownership of the AioContext. */
30
void aio_context_release(AioContext *ctx);
31
32
+/**
33
+ * aio_bh_schedule_oneshot_full: Allocate a new bottom half structure that will
34
+ * run only once and as soon as possible.
35
+ *
36
+ * @name: A human-readable identifier for debugging purposes.
37
+ */
38
+void aio_bh_schedule_oneshot_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
39
+ const char *name);
40
+
41
/**
42
* aio_bh_schedule_oneshot: Allocate a new bottom half structure that will run
43
* only once and as soon as possible.
44
+ *
45
+ * A convenience wrapper for aio_bh_schedule_oneshot_full() that uses cb as the
46
+ * name string.
47
*/
48
-void aio_bh_schedule_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque);
49
+#define aio_bh_schedule_oneshot(ctx, cb, opaque) \
50
+ aio_bh_schedule_oneshot_full((ctx), (cb), (opaque), (stringify(cb)))
51
52
/**
53
- * aio_bh_new: Allocate a new bottom half structure.
54
+ * aio_bh_new_full: Allocate a new bottom half structure.
55
*
56
* Bottom halves are lightweight callbacks whose invocation is guaranteed
57
* to be wait-free, thread-safe and signal-safe. The #QEMUBH structure
58
* is opaque and must be allocated prior to its use.
59
+ *
60
+ * @name: A human-readable identifier for debugging purposes.
61
*/
62
-QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque);
63
+QEMUBH *aio_bh_new_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
64
+ const char *name);
65
+
66
+/**
67
+ * aio_bh_new: Allocate a new bottom half structure
68
+ *
69
+ * A convenience wrapper for aio_bh_new_full() that uses the cb as the name
70
+ * string.
71
+ */
72
+#define aio_bh_new(ctx, cb, opaque) \
73
+ aio_bh_new_full((ctx), (cb), (opaque), (stringify(cb)))
74
75
/**
76
* aio_notify: Force processing of pending events.
77
diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h
78
index XXXXXXX..XXXXXXX 100644
79
--- a/include/qemu/main-loop.h
80
+++ b/include/qemu/main-loop.h
81
@@ -XXX,XX +XXX,XX @@ void qemu_cond_timedwait_iothread(QemuCond *cond, int ms);
82
83
void qemu_fd_register(int fd);
84
85
-QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque);
86
+#define qemu_bh_new(cb, opaque) \
87
+ qemu_bh_new_full((cb), (opaque), (stringify(cb)))
88
+QEMUBH *qemu_bh_new_full(QEMUBHFunc *cb, void *opaque, const char *name);
89
void qemu_bh_schedule_idle(QEMUBH *bh);
90
91
enum {
92
diff --git a/tests/unit/ptimer-test-stubs.c b/tests/unit/ptimer-test-stubs.c
93
index XXXXXXX..XXXXXXX 100644
94
--- a/tests/unit/ptimer-test-stubs.c
95
+++ b/tests/unit/ptimer-test-stubs.c
96
@@ -XXX,XX +XXX,XX @@ int64_t qemu_clock_deadline_ns_all(QEMUClockType type, int attr_mask)
97
return deadline;
98
}
99
100
-QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
101
+QEMUBH *qemu_bh_new_full(QEMUBHFunc *cb, void *opaque, const char *name)
21
{
102
{
22
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
103
QEMUBH *bh = g_new(QEMUBH, 1);
23
- uint64_t delay_slices;
104
24
+ double delay_slices;
105
diff --git a/util/async.c b/util/async.c
25
106
index XXXXXXX..XXXXXXX 100644
26
assert(limit->slice_quota && limit->slice_ns);
107
--- a/util/async.c
27
108
+++ b/util/async.c
28
@@ -XXX,XX +XXX,XX @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
109
@@ -XXX,XX +XXX,XX @@ enum {
29
return 0;
110
30
}
111
struct QEMUBH {
31
112
AioContext *ctx;
32
- /* Quota exceeded. Calculate the next time slice we may start
113
+ const char *name;
33
- * sending data again. */
114
QEMUBHFunc *cb;
34
- delay_slices = (limit->dispatched + limit->slice_quota - 1) /
115
void *opaque;
35
- limit->slice_quota;
116
QSLIST_ENTRY(QEMUBH) next;
36
+ /* Quota exceeded. Wait based on the excess amount and then start a new
117
@@ -XXX,XX +XXX,XX @@ static QEMUBH *aio_bh_dequeue(BHList *head, unsigned *flags)
37
+ * slice. */
118
return bh;
38
+ delay_slices = (double)limit->dispatched / limit->slice_quota;
39
limit->slice_end_time = limit->slice_start_time +
40
- delay_slices * limit->slice_ns;
41
+ (uint64_t)(delay_slices * limit->slice_ns);
42
return limit->slice_end_time - now;
43
}
119
}
44
120
121
-void aio_bh_schedule_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque)
122
+void aio_bh_schedule_oneshot_full(AioContext *ctx, QEMUBHFunc *cb,
123
+ void *opaque, const char *name)
124
{
125
QEMUBH *bh;
126
bh = g_new(QEMUBH, 1);
127
@@ -XXX,XX +XXX,XX @@ void aio_bh_schedule_oneshot(AioContext *ctx, QEMUBHFunc *cb, void *opaque)
128
.ctx = ctx,
129
.cb = cb,
130
.opaque = opaque,
131
+ .name = name,
132
};
133
aio_bh_enqueue(bh, BH_SCHEDULED | BH_ONESHOT);
134
}
135
136
-QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque)
137
+QEMUBH *aio_bh_new_full(AioContext *ctx, QEMUBHFunc *cb, void *opaque,
138
+ const char *name)
139
{
140
QEMUBH *bh;
141
bh = g_new(QEMUBH, 1);
142
@@ -XXX,XX +XXX,XX @@ QEMUBH *aio_bh_new(AioContext *ctx, QEMUBHFunc *cb, void *opaque)
143
.ctx = ctx,
144
.cb = cb,
145
.opaque = opaque,
146
+ .name = name,
147
};
148
return bh;
149
}
150
diff --git a/util/main-loop.c b/util/main-loop.c
151
index XXXXXXX..XXXXXXX 100644
152
--- a/util/main-loop.c
153
+++ b/util/main-loop.c
154
@@ -XXX,XX +XXX,XX @@ void main_loop_wait(int nonblocking)
155
156
/* Functions to operate on the main QEMU AioContext. */
157
158
-QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque)
159
+QEMUBH *qemu_bh_new_full(QEMUBHFunc *cb, void *opaque, const char *name)
160
{
161
- return aio_bh_new(qemu_aio_context, cb, opaque);
162
+ return aio_bh_new_full(qemu_aio_context, cb, opaque, name);
163
}
164
165
/*
45
--
166
--
46
2.14.3
167
2.31.1
47
168
48
diff view generated by jsdifflib
1
From: Marc-André Lureau <marcandre.lureau@redhat.com>
1
BHs must be deleted before the AioContext is finalized. If not, it's a
2
bug and probably indicates that some part of the program still expects
3
the BH to run in the future. That can lead to memory leaks, inconsistent
4
state, or just hangs.
2
5
3
s/pupulate/populate
6
Unfortunately the assert(flags & BH_DELETED) call in aio_ctx_finalize()
7
is difficult to debug because the assertion failure contains no
8
information about the BH!
4
9
5
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
10
Use the QEMUBH name field added in the previous patch to show a useful
6
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
11
error when a leaked BH is detected.
7
Message-id: 20180208162447.10851-1-marcandre.lureau@redhat.com
12
13
Suggested-by: Eric Ernst <eric.g.ernst@gmail.com>
8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
14
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
15
Message-Id: <20210414200247.917496-3-stefanha@redhat.com>
9
---
16
---
10
util/qemu-coroutine-lock.c | 2 +-
17
util/async.c | 16 ++++++++++++++--
11
1 file changed, 1 insertion(+), 1 deletion(-)
18
1 file changed, 14 insertions(+), 2 deletions(-)
12
19
13
diff --git a/util/qemu-coroutine-lock.c b/util/qemu-coroutine-lock.c
20
diff --git a/util/async.c b/util/async.c
14
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
15
--- a/util/qemu-coroutine-lock.c
22
--- a/util/async.c
16
+++ b/util/qemu-coroutine-lock.c
23
+++ b/util/async.c
17
@@ -XXX,XX +XXX,XX @@ void qemu_co_queue_run_restart(Coroutine *co)
24
@@ -XXX,XX +XXX,XX @@ aio_ctx_finalize(GSource *source)
18
* invalid memory. Therefore, use a temporary queue and do not touch
25
assert(QSIMPLEQ_EMPTY(&ctx->bh_slice_list));
19
* the "co" coroutine as soon as you enter another one.
26
20
*
27
while ((bh = aio_bh_dequeue(&ctx->bh_list, &flags))) {
21
- * In its turn resumed "co" can pupulate "co_queue_wakeup" queue with
28
- /* qemu_bh_delete() must have been called on BHs in this AioContext */
22
+ * In its turn resumed "co" can populate "co_queue_wakeup" queue with
29
- assert(flags & BH_DELETED);
23
* new coroutines to be woken up. The caller, who has resumed "co",
30
+ /*
24
* will be responsible for traversing the same queue, which may cause
31
+ * qemu_bh_delete() must have been called on BHs in this AioContext. In
25
* a different wakeup order but not any missing wakeups.
32
+ * many cases memory leaks, hangs, or inconsistent state occur when a
33
+ * BH is leaked because something still expects it to run.
34
+ *
35
+ * If you hit this, fix the lifecycle of the BH so that
36
+ * qemu_bh_delete() and any associated cleanup is called before the
37
+ * AioContext is finalized.
38
+ */
39
+ if (unlikely(!(flags & BH_DELETED))) {
40
+ fprintf(stderr, "%s: BH '%s' leaked, aborting...\n",
41
+ __func__, bh->name);
42
+ abort();
43
+ }
44
45
g_free(bh);
46
}
26
--
47
--
27
2.14.3
48
2.31.1
28
49
29
diff view generated by jsdifflib
1
Commit dce8921b2baaf95974af8176406881872067adfa ("iothread: Stop threads
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
before main() quits") introduced iothread_stop_all() to avoid the
3
following virtio-scsi assertion failure:
4
2
5
assert(blk_get_aio_context(d->conf.blk) == s->ctx);
3
This commit introduces "punch hole" operation and optimizes transfer
4
block size for macOS.
6
5
7
Back then the assertion failed because when bdrv_close_all() made
6
Thanks to Konstantin Nazarov for detailed analysis of a flaw in an
8
d->conf.blk NULL, blk_get_aio_context() returned the global AioContext
7
old version of this change:
9
instead of s->ctx.
8
https://gist.github.com/akihikodaki/87df4149e7ca87f18dc56807ec5a1bc5#gistcomment-3654667
10
9
11
The same assertion can still fail today when vcpus submit new I/O
10
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
12
requests after iothread_stop_all() has moved the BDS to the global
11
Message-id: 20210705130458.97642-1-akihiko.odaki@gmail.com
13
AioContext.
14
15
This patch hardens the iothread_stop_all() approach by pausing vcpus
16
before calling iothread_stop_all().
17
18
Note that the assertion failure is a race condition. It is not possible
19
to reproduce it reliably.
20
21
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
22
Message-id: 20180201110708.8080-1-stefanha@redhat.com
23
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
12
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
24
---
13
---
25
vl.c | 12 ++++++++++--
14
block/file-posix.c | 27 +++++++++++++++++++++++++--
26
1 file changed, 10 insertions(+), 2 deletions(-)
15
1 file changed, 25 insertions(+), 2 deletions(-)
27
16
28
diff --git a/vl.c b/vl.c
17
diff --git a/block/file-posix.c b/block/file-posix.c
29
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
30
--- a/vl.c
19
--- a/block/file-posix.c
31
+++ b/vl.c
20
+++ b/block/file-posix.c
32
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv, char **envp)
21
@@ -XXX,XX +XXX,XX @@
33
22
#if defined(HAVE_HOST_BLOCK_DEVICE)
34
main_loop();
23
#include <paths.h>
35
replay_disable_events();
24
#include <sys/param.h>
25
+#include <sys/mount.h>
26
#include <IOKit/IOKitLib.h>
27
#include <IOKit/IOBSD.h>
28
#include <IOKit/storage/IOMediaBSDClient.h>
29
@@ -XXX,XX +XXX,XX @@ static void raw_refresh_limits(BlockDriverState *bs, Error **errp)
30
return;
31
}
32
33
+#if defined(__APPLE__) && (__MACH__)
34
+ struct statfs buf;
36
+
35
+
37
+ /* The ordering of the following is delicate. Stop vcpus to prevent new
36
+ if (!fstatfs(s->fd, &buf)) {
38
+ * I/O requests being queued by the guest. Then stop IOThreads (this
37
+ bs->bl.opt_transfer = buf.f_iosize;
39
+ * includes a drain operation and completes all request processing). At
38
+ bs->bl.pdiscard_alignment = buf.f_bsize;
40
+ * this point emulated devices are still associated with their IOThreads
39
+ }
41
+ * (if any) but no longer have any work to do. Only then can we close
40
+#endif
42
+ * block devices safely because we know there is no more I/O coming.
43
+ */
44
+ pause_all_vcpus();
45
iothread_stop_all();
46
-
47
- pause_all_vcpus();
48
bdrv_close_all();
49
+
41
+
50
res_free();
42
if (bs->sg || S_ISBLK(st.st_mode)) {
51
43
int ret = hdev_get_max_hw_transfer(s->fd, &st);
52
/* vhost-user must be cleaned up before chardevs. */
44
45
@@ -XXX,XX +XXX,XX @@ out:
46
}
47
}
48
49
+#if defined(CONFIG_FALLOCATE) || defined(BLKZEROOUT) || defined(BLKDISCARD)
50
static int translate_err(int err)
51
{
52
if (err == -ENODEV || err == -ENOSYS || err == -EOPNOTSUPP ||
53
@@ -XXX,XX +XXX,XX @@ static int translate_err(int err)
54
}
55
return err;
56
}
57
+#endif
58
59
#ifdef CONFIG_FALLOCATE
60
static int do_fallocate(int fd, int mode, off_t offset, off_t len)
61
@@ -XXX,XX +XXX,XX @@ static int handle_aiocb_discard(void *opaque)
62
}
63
} while (errno == EINTR);
64
65
- ret = -errno;
66
+ ret = translate_err(-errno);
67
#endif
68
} else {
69
#ifdef CONFIG_FALLOCATE_PUNCH_HOLE
70
ret = do_fallocate(s->fd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE,
71
aiocb->aio_offset, aiocb->aio_nbytes);
72
+ ret = translate_err(-errno);
73
+#elif defined(__APPLE__) && (__MACH__)
74
+ fpunchhole_t fpunchhole;
75
+ fpunchhole.fp_flags = 0;
76
+ fpunchhole.reserved = 0;
77
+ fpunchhole.fp_offset = aiocb->aio_offset;
78
+ fpunchhole.fp_length = aiocb->aio_nbytes;
79
+ if (fcntl(s->fd, F_PUNCHHOLE, &fpunchhole) == -1) {
80
+ ret = errno == ENODEV ? -ENOTSUP : -errno;
81
+ } else {
82
+ ret = 0;
83
+ }
84
#endif
85
}
86
87
- ret = translate_err(ret);
88
if (ret == -ENOTSUP) {
89
s->has_discard = false;
90
}
53
--
91
--
54
2.14.3
92
2.31.1
55
93
56
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
2
3
[Fixed s/git-profile/git-publish/ typo and s/for once/the first time/.
3
backend_defaults property allow users to control if default block
4
--Stefan]
4
properties should be decided with backend information.
5
5
6
Signed-off-by: Fam Zheng <famz@redhat.com>
6
If it is off, any backend information will be discarded, which is
7
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
7
suitable if you plan to perform live migration to a different disk backend.
8
Message-id: 20180205054725.25634-3-famz@redhat.com
8
9
If it is on, a block device may utilize backend information more
10
aggressively.
11
12
By default, it is auto, which uses backend information for block
13
sizes and ignores the others, which is consistent with the older
14
versions.
15
16
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
17
Message-id: 20210705130458.97642-2-akihiko.odaki@gmail.com
9
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
18
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
10
---
19
---
11
README | 31 ++++++++++++++++++++++++++++++-
20
include/hw/block/block.h | 3 +++
12
1 file changed, 30 insertions(+), 1 deletion(-)
21
hw/block/block.c | 42 ++++++++++++++++++++++++++++++++++----
13
22
tests/qemu-iotests/172.out | 38 ++++++++++++++++++++++++++++++++++
14
diff --git a/README b/README
23
3 files changed, 79 insertions(+), 4 deletions(-)
24
25
diff --git a/include/hw/block/block.h b/include/hw/block/block.h
15
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
16
--- a/README
27
--- a/include/hw/block/block.h
17
+++ b/README
28
+++ b/include/hw/block/block.h
18
@@ -XXX,XX +XXX,XX @@ The QEMU source code is maintained under the GIT version control system.
29
@@ -XXX,XX +XXX,XX @@
19
30
20
git clone git://git.qemu.org/qemu.git
31
typedef struct BlockConf {
21
32
BlockBackend *blk;
22
-When submitting patches, the preferred approach is to use 'git
33
+ OnOffAuto backend_defaults;
23
+When submitting patches, one common approach is to use 'git
34
uint32_t physical_block_size;
24
format-patch' and/or 'git send-email' to format & send the mail to the
35
uint32_t logical_block_size;
25
qemu-devel@nongnu.org mailing list. All patches submitted must contain
36
uint32_t min_io_size;
26
a 'Signed-off-by' line from the author. Patches should follow the
37
@@ -XXX,XX +XXX,XX @@ static inline unsigned int get_physical_block_exp(BlockConf *conf)
27
guidelines set out in the HACKING and CODING_STYLE files.
38
}
28
39
29
+A 'git-publish' utility was created to make above process less
40
#define DEFINE_BLOCK_PROPERTIES_BASE(_state, _conf) \
30
+cumbersome, and is highly recommended for making regular contributions,
41
+ DEFINE_PROP_ON_OFF_AUTO("backend_defaults", _state, \
31
+or even just for sending consecutive patch series revisions. It also
42
+ _conf.backend_defaults, ON_OFF_AUTO_AUTO), \
32
+requires a working 'git send-email' setup, and by default doesn't
43
DEFINE_PROP_BLOCKSIZE("logical_block_size", _state, \
33
+automate everything, so you may want to go through the above steps
44
_conf.logical_block_size), \
34
+manually the first time.
45
DEFINE_PROP_BLOCKSIZE("physical_block_size", _state, \
46
diff --git a/hw/block/block.c b/hw/block/block.c
47
index XXXXXXX..XXXXXXX 100644
48
--- a/hw/block/block.c
49
+++ b/hw/block/block.c
50
@@ -XXX,XX +XXX,XX @@ bool blkconf_blocksizes(BlockConf *conf, Error **errp)
51
{
52
BlockBackend *blk = conf->blk;
53
BlockSizes blocksizes;
54
- int backend_ret;
55
+ BlockDriverState *bs;
56
+ bool use_blocksizes;
57
+ bool use_bs;
35
+
58
+
36
+For installation instructions, please go to
59
+ switch (conf->backend_defaults) {
60
+ case ON_OFF_AUTO_AUTO:
61
+ use_blocksizes = !blk_probe_blocksizes(blk, &blocksizes);
62
+ use_bs = false;
63
+ break;
37
+
64
+
38
+ https://github.com/stefanha/git-publish
65
+ case ON_OFF_AUTO_ON:
66
+ use_blocksizes = !blk_probe_blocksizes(blk, &blocksizes);
67
+ bs = blk_bs(blk);
68
+ use_bs = bs;
69
+ break;
39
+
70
+
40
+The workflow with 'git-publish' is:
71
+ case ON_OFF_AUTO_OFF:
72
+ use_blocksizes = false;
73
+ use_bs = false;
74
+ break;
41
+
75
+
42
+ $ git checkout master -b my-feature
76
+ default:
43
+ $ # work on new commits, add your 'Signed-off-by' lines to each
77
+ abort();
44
+ $ git publish
78
+ }
45
+
79
46
+Your patch series will be sent and tagged as my-feature-v1 if you need to refer
80
- backend_ret = blk_probe_blocksizes(blk, &blocksizes);
47
+back to it in the future.
81
/* fill in detected values if they are not defined via qemu command line */
48
+
82
if (!conf->physical_block_size) {
49
+Sending v2:
83
- if (!backend_ret) {
50
+
84
+ if (use_blocksizes) {
51
+ $ git checkout my-feature # same topic branch
85
conf->physical_block_size = blocksizes.phys;
52
+ $ # making changes to the commits (using 'git rebase', for example)
86
} else {
53
+ $ git publish
87
conf->physical_block_size = BDRV_SECTOR_SIZE;
54
+
88
}
55
+Your patch series will be sent with 'v2' tag in the subject and the git tip
89
}
56
+will be tagged as my-feature-v2.
90
if (!conf->logical_block_size) {
57
+
91
- if (!backend_ret) {
58
Additional information on submitting patches can be found online via
92
+ if (use_blocksizes) {
59
the QEMU website
93
conf->logical_block_size = blocksizes.log;
60
94
} else {
95
conf->logical_block_size = BDRV_SECTOR_SIZE;
96
}
97
}
98
+ if (use_bs) {
99
+ if (!conf->opt_io_size) {
100
+ conf->opt_io_size = bs->bl.opt_transfer;
101
+ }
102
+ if (conf->discard_granularity == -1) {
103
+ if (bs->bl.pdiscard_alignment) {
104
+ conf->discard_granularity = bs->bl.pdiscard_alignment;
105
+ } else if (bs->bl.request_alignment != 1) {
106
+ conf->discard_granularity = bs->bl.request_alignment;
107
+ }
108
+ }
109
+ }
110
111
if (conf->logical_block_size > conf->physical_block_size) {
112
error_setg(errp,
113
diff --git a/tests/qemu-iotests/172.out b/tests/qemu-iotests/172.out
114
index XXXXXXX..XXXXXXX 100644
115
--- a/tests/qemu-iotests/172.out
116
+++ b/tests/qemu-iotests/172.out
117
@@ -XXX,XX +XXX,XX @@ Testing:
118
dev: floppy, id ""
119
unit = 0 (0x0)
120
drive = "floppy0"
121
+ backend_defaults = "auto"
122
logical_block_size = 512 (512 B)
123
physical_block_size = 512 (512 B)
124
min_io_size = 0 (0 B)
125
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2
126
dev: floppy, id ""
127
unit = 0 (0x0)
128
drive = "floppy0"
129
+ backend_defaults = "auto"
130
logical_block_size = 512 (512 B)
131
physical_block_size = 512 (512 B)
132
min_io_size = 0 (0 B)
133
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2
134
dev: floppy, id ""
135
unit = 1 (0x1)
136
drive = "floppy1"
137
+ backend_defaults = "auto"
138
logical_block_size = 512 (512 B)
139
physical_block_size = 512 (512 B)
140
min_io_size = 0 (0 B)
141
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2
142
dev: floppy, id ""
143
unit = 0 (0x0)
144
drive = "floppy0"
145
+ backend_defaults = "auto"
146
logical_block_size = 512 (512 B)
147
physical_block_size = 512 (512 B)
148
min_io_size = 0 (0 B)
149
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2.2
150
dev: floppy, id ""
151
unit = 1 (0x1)
152
drive = "floppy1"
153
+ backend_defaults = "auto"
154
logical_block_size = 512 (512 B)
155
physical_block_size = 512 (512 B)
156
min_io_size = 0 (0 B)
157
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -fdb TEST_DIR/t.qcow2.2
158
dev: floppy, id ""
159
unit = 0 (0x0)
160
drive = "floppy0"
161
+ backend_defaults = "auto"
162
logical_block_size = 512 (512 B)
163
physical_block_size = 512 (512 B)
164
min_io_size = 0 (0 B)
165
@@ -XXX,XX +XXX,XX @@ Testing: -fdb
166
dev: floppy, id ""
167
unit = 1 (0x1)
168
drive = "floppy1"
169
+ backend_defaults = "auto"
170
logical_block_size = 512 (512 B)
171
physical_block_size = 512 (512 B)
172
min_io_size = 0 (0 B)
173
@@ -XXX,XX +XXX,XX @@ Testing: -fdb
174
dev: floppy, id ""
175
unit = 0 (0x0)
176
drive = "floppy0"
177
+ backend_defaults = "auto"
178
logical_block_size = 512 (512 B)
179
physical_block_size = 512 (512 B)
180
min_io_size = 0 (0 B)
181
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2
182
dev: floppy, id ""
183
unit = 0 (0x0)
184
drive = "floppy0"
185
+ backend_defaults = "auto"
186
logical_block_size = 512 (512 B)
187
physical_block_size = 512 (512 B)
188
min_io_size = 0 (0 B)
189
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2,index=1
190
dev: floppy, id ""
191
unit = 1 (0x1)
192
drive = "floppy1"
193
+ backend_defaults = "auto"
194
logical_block_size = 512 (512 B)
195
physical_block_size = 512 (512 B)
196
min_io_size = 0 (0 B)
197
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2,index=1
198
dev: floppy, id ""
199
unit = 0 (0x0)
200
drive = "floppy0"
201
+ backend_defaults = "auto"
202
logical_block_size = 512 (512 B)
203
physical_block_size = 512 (512 B)
204
min_io_size = 0 (0 B)
205
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=floppy,file=TEST_DIR/t
206
dev: floppy, id ""
207
unit = 1 (0x1)
208
drive = "floppy1"
209
+ backend_defaults = "auto"
210
logical_block_size = 512 (512 B)
211
physical_block_size = 512 (512 B)
212
min_io_size = 0 (0 B)
213
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=floppy,file=TEST_DIR/t
214
dev: floppy, id ""
215
unit = 0 (0x0)
216
drive = "floppy0"
217
+ backend_defaults = "auto"
218
logical_block_size = 512 (512 B)
219
physical_block_size = 512 (512 B)
220
min_io_size = 0 (0 B)
221
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0
222
dev: floppy, id ""
223
unit = 0 (0x0)
224
drive = "none0"
225
+ backend_defaults = "auto"
226
logical_block_size = 512 (512 B)
227
physical_block_size = 512 (512 B)
228
min_io_size = 0 (0 B)
229
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,unit=1
230
dev: floppy, id ""
231
unit = 1 (0x1)
232
drive = "none0"
233
+ backend_defaults = "auto"
234
logical_block_size = 512 (512 B)
235
physical_block_size = 512 (512 B)
236
min_io_size = 0 (0 B)
237
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
238
dev: floppy, id ""
239
unit = 1 (0x1)
240
drive = "none1"
241
+ backend_defaults = "auto"
242
logical_block_size = 512 (512 B)
243
physical_block_size = 512 (512 B)
244
min_io_size = 0 (0 B)
245
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qco
246
dev: floppy, id ""
247
unit = 0 (0x0)
248
drive = "none0"
249
+ backend_defaults = "auto"
250
logical_block_size = 512 (512 B)
251
physical_block_size = 512 (512 B)
252
min_io_size = 0 (0 B)
253
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
254
dev: floppy, id ""
255
unit = 1 (0x1)
256
drive = "none0"
257
+ backend_defaults = "auto"
258
logical_block_size = 512 (512 B)
259
physical_block_size = 512 (512 B)
260
min_io_size = 0 (0 B)
261
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
262
dev: floppy, id ""
263
unit = 0 (0x0)
264
drive = "floppy0"
265
+ backend_defaults = "auto"
266
logical_block_size = 512 (512 B)
267
physical_block_size = 512 (512 B)
268
min_io_size = 0 (0 B)
269
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
270
dev: floppy, id ""
271
unit = 1 (0x1)
272
drive = "none0"
273
+ backend_defaults = "auto"
274
logical_block_size = 512 (512 B)
275
physical_block_size = 512 (512 B)
276
min_io_size = 0 (0 B)
277
@@ -XXX,XX +XXX,XX @@ Testing: -fda TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
278
dev: floppy, id ""
279
unit = 0 (0x0)
280
drive = "floppy0"
281
+ backend_defaults = "auto"
282
logical_block_size = 512 (512 B)
283
physical_block_size = 512 (512 B)
284
min_io_size = 0 (0 B)
285
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
286
dev: floppy, id ""
287
unit = 0 (0x0)
288
drive = "none0"
289
+ backend_defaults = "auto"
290
logical_block_size = 512 (512 B)
291
physical_block_size = 512 (512 B)
292
min_io_size = 0 (0 B)
293
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
294
dev: floppy, id ""
295
unit = 1 (0x1)
296
drive = "floppy1"
297
+ backend_defaults = "auto"
298
logical_block_size = 512 (512 B)
299
physical_block_size = 512 (512 B)
300
min_io_size = 0 (0 B)
301
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
302
dev: floppy, id ""
303
unit = 0 (0x0)
304
drive = "none0"
305
+ backend_defaults = "auto"
306
logical_block_size = 512 (512 B)
307
physical_block_size = 512 (512 B)
308
min_io_size = 0 (0 B)
309
@@ -XXX,XX +XXX,XX @@ Testing: -fdb TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.qcow2.2 -device fl
310
dev: floppy, id ""
311
unit = 1 (0x1)
312
drive = "floppy1"
313
+ backend_defaults = "auto"
314
logical_block_size = 512 (512 B)
315
physical_block_size = 512 (512 B)
316
min_io_size = 0 (0 B)
317
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
318
dev: floppy, id ""
319
unit = 1 (0x1)
320
drive = "none0"
321
+ backend_defaults = "auto"
322
logical_block_size = 512 (512 B)
323
physical_block_size = 512 (512 B)
324
min_io_size = 0 (0 B)
325
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
326
dev: floppy, id ""
327
unit = 0 (0x0)
328
drive = "floppy0"
329
+ backend_defaults = "auto"
330
logical_block_size = 512 (512 B)
331
physical_block_size = 512 (512 B)
332
min_io_size = 0 (0 B)
333
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
334
dev: floppy, id ""
335
unit = 1 (0x1)
336
drive = "none0"
337
+ backend_defaults = "auto"
338
logical_block_size = 512 (512 B)
339
physical_block_size = 512 (512 B)
340
min_io_size = 0 (0 B)
341
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=floppy,file=TEST_DIR/t.qcow2 -drive if=none,file=TEST_DIR/t.q
342
dev: floppy, id ""
343
unit = 0 (0x0)
344
drive = "floppy0"
345
+ backend_defaults = "auto"
346
logical_block_size = 512 (512 B)
347
physical_block_size = 512 (512 B)
348
min_io_size = 0 (0 B)
349
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -global floppy.drive=none0 -device
350
dev: floppy, id ""
351
unit = 0 (0x0)
352
drive = "none0"
353
+ backend_defaults = "auto"
354
logical_block_size = 512 (512 B)
355
physical_block_size = 512 (512 B)
356
min_io_size = 0 (0 B)
357
@@ -XXX,XX +XXX,XX @@ Testing: -device floppy
358
dev: floppy, id ""
359
unit = 0 (0x0)
360
drive = ""
361
+ backend_defaults = "auto"
362
logical_block_size = 512 (512 B)
363
physical_block_size = 512 (512 B)
364
min_io_size = 0 (0 B)
365
@@ -XXX,XX +XXX,XX @@ Testing: -device floppy,drive-type=120
366
dev: floppy, id ""
367
unit = 0 (0x0)
368
drive = ""
369
+ backend_defaults = "auto"
370
logical_block_size = 512 (512 B)
371
physical_block_size = 512 (512 B)
372
min_io_size = 0 (0 B)
373
@@ -XXX,XX +XXX,XX @@ Testing: -device floppy,drive-type=144
374
dev: floppy, id ""
375
unit = 0 (0x0)
376
drive = ""
377
+ backend_defaults = "auto"
378
logical_block_size = 512 (512 B)
379
physical_block_size = 512 (512 B)
380
min_io_size = 0 (0 B)
381
@@ -XXX,XX +XXX,XX @@ Testing: -device floppy,drive-type=288
382
dev: floppy, id ""
383
unit = 0 (0x0)
384
drive = ""
385
+ backend_defaults = "auto"
386
logical_block_size = 512 (512 B)
387
physical_block_size = 512 (512 B)
388
min_io_size = 0 (0 B)
389
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
390
dev: floppy, id ""
391
unit = 0 (0x0)
392
drive = "none0"
393
+ backend_defaults = "auto"
394
logical_block_size = 512 (512 B)
395
physical_block_size = 512 (512 B)
396
min_io_size = 0 (0 B)
397
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,drive-t
398
dev: floppy, id ""
399
unit = 0 (0x0)
400
drive = "none0"
401
+ backend_defaults = "auto"
402
logical_block_size = 512 (512 B)
403
physical_block_size = 512 (512 B)
404
min_io_size = 0 (0 B)
405
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,logical
406
dev: floppy, id ""
407
unit = 0 (0x0)
408
drive = "none0"
409
+ backend_defaults = "auto"
410
logical_block_size = 512 (512 B)
411
physical_block_size = 512 (512 B)
412
min_io_size = 0 (0 B)
413
@@ -XXX,XX +XXX,XX @@ Testing: -drive if=none,file=TEST_DIR/t.qcow2 -device floppy,drive=none0,physica
414
dev: floppy, id ""
415
unit = 0 (0x0)
416
drive = "none0"
417
+ backend_defaults = "auto"
418
logical_block_size = 512 (512 B)
419
physical_block_size = 512 (512 B)
420
min_io_size = 0 (0 B)
61
--
421
--
62
2.14.3
422
2.31.1
63
423
64
diff view generated by jsdifflib
1
From: Fam Zheng <famz@redhat.com>
1
From: Akihiko Odaki <akihiko.odaki@gmail.com>
2
2
3
git-publish [1] is a convenient tool to send patches and has been
3
Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
4
popular among QEMU developers. Recently it has been made available in
4
Message-id: 20210705130458.97642-3-akihiko.odaki@gmail.com
5
Fedora official repo thanks to Stefan's work.
6
7
One nice feature of the tool is a per-project configuration with
8
profiles, especially in which the cccmd option is a handy method to
9
create the Cc list.
10
11
[1]: https://github.com/stefanha/git-publish
12
13
Signed-off-by: Fam Zheng <famz@redhat.com>
14
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
15
Message-id: 20180205054725.25634-2-famz@redhat.com
16
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
5
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
17
---
6
---
18
.gitpublish | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7
block/io.c | 2 ++
19
1 file changed, 58 insertions(+)
8
1 file changed, 2 insertions(+)
20
create mode 100644 .gitpublish
21
9
22
diff --git a/.gitpublish b/.gitpublish
10
diff --git a/block/io.c b/block/io.c
23
new file mode 100644
11
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX
12
--- a/block/io.c
25
--- /dev/null
13
+++ b/block/io.c
26
+++ b/.gitpublish
14
@@ -XXX,XX +XXX,XX @@ void bdrv_parent_drained_begin_single(BdrvChild *c, bool poll)
27
@@ -XXX,XX +XXX,XX @@
15
28
+#
16
static void bdrv_merge_limits(BlockLimits *dst, const BlockLimits *src)
29
+# Common git-publish profiles that can be used to send patches to QEMU upstream.
17
{
30
+#
18
+ dst->pdiscard_alignment = MAX(dst->pdiscard_alignment,
31
+# See https://github.com/stefanha/git-publish for more information
19
+ src->pdiscard_alignment);
32
+#
20
dst->opt_transfer = MAX(dst->opt_transfer, src->opt_transfer);
33
+[gitpublishprofile "default"]
21
dst->max_transfer = MIN_NON_ZERO(dst->max_transfer, src->max_transfer);
34
+base = master
22
dst->max_hw_transfer = MIN_NON_ZERO(dst->max_hw_transfer,
35
+prefix = PATCH
36
+to = qemu-devel@nongnu.org
37
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
38
+
39
+[gitpublishprofile "rfc"]
40
+base = master
41
+prefix = RFC PATCH
42
+to = qemu-devel@nongnu.org
43
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
44
+
45
+[gitpublishprofile "stable"]
46
+base = master
47
+prefix = PATCH
48
+to = qemu-devel@nongnu.org
49
+cc = qemu-stable@nongnu.org
50
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
51
+
52
+[gitpublishprofile "trivial"]
53
+base = master
54
+prefix = PATCH
55
+to = qemu-devel@nongnu.org
56
+cc = qemu-trivial@nongnu.org
57
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
58
+
59
+[gitpublishprofile "block"]
60
+base = master
61
+prefix = PATCH
62
+to = qemu-devel@nongnu.org
63
+cc = qemu-block@nongnu.org
64
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
65
+
66
+[gitpublishprofile "arm"]
67
+base = master
68
+prefix = PATCH
69
+to = qemu-devel@nongnu.org
70
+cc = qemu-arm@nongnu.org
71
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
72
+
73
+[gitpublishprofile "s390"]
74
+base = master
75
+prefix = PATCH
76
+to = qemu-devel@nongnu.org
77
+cc = qemu-s390@nongnu.org
78
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
79
+
80
+[gitpublishprofile "ppc"]
81
+base = master
82
+prefix = PATCH
83
+to = qemu-devel@nongnu.org
84
+cc = qemu-ppc@nongnu.org
85
+cccmd = scripts/get_maintainer.pl --noroles --norolestats --nogit --nogit-fallback 2>/dev/null
86
--
23
--
87
2.14.3
24
2.31.1
88
25
89
diff view generated by jsdifflib