From: Paolo Bonzini <pbonzini@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
Anthony Liguori <aliguori@us.ibm.com>,
qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 3/3] aio: rename AIOPool to AIOCBInfo
Date: Fri, 02 Nov 2012 15:50:31 +0100 [thread overview]
Message-ID: <5093DDB7.1000709@redhat.com> (raw)
In-Reply-To: <1351697677-31598-4-git-send-email-stefanha@redhat.com>
Il 31/10/2012 16:34, Stefan Hajnoczi ha scritto:
> Now that AIOPool no longer keeps a freelist, it isn't really a "pool"
> anymore. Rename it to AIOCBInfo and make it const since it no longer
> needs to be modified.
>
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> block.c | 22 +++++++++++-----------
> block/blkdebug.c | 4 ++--
> block/blkverify.c | 4 ++--
> block/curl.c | 4 ++--
> block/gluster.c | 6 +++---
> block/iscsi.c | 12 ++++++------
> block/linux-aio.c | 4 ++--
> block/qed.c | 4 ++--
> block/rbd.c | 4 ++--
> block/sheepdog.c | 4 ++--
> block/win32-aio.c | 4 ++--
> dma-helpers.c | 4 ++--
> hw/ide/core.c | 4 ++--
> qemu-aio.h | 8 ++++----
> thread-pool.c | 4 ++--
> 15 files changed, 46 insertions(+), 46 deletions(-)
>
> diff --git a/block.c b/block.c
> index ea0f7d8..854ebd6 100644
> --- a/block.c
> +++ b/block.c
> @@ -3521,7 +3521,7 @@ int bdrv_aio_multiwrite(BlockDriverState *bs, BlockRequest *reqs, int num_reqs)
>
> void bdrv_aio_cancel(BlockDriverAIOCB *acb)
> {
> - acb->pool->cancel(acb);
> + acb->aiocb_info->cancel(acb);
> }
>
> /* block I/O throttling */
> @@ -3711,7 +3711,7 @@ static void bdrv_aio_cancel_em(BlockDriverAIOCB *blockacb)
> qemu_aio_release(acb);
> }
>
> -static AIOPool bdrv_em_aio_pool = {
> +static const AIOCBInfo bdrv_em_aiocb_info = {
> .aiocb_size = sizeof(BlockDriverAIOCBSync),
> .cancel = bdrv_aio_cancel_em,
> };
> @@ -3740,7 +3740,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
> {
> BlockDriverAIOCBSync *acb;
>
> - acb = qemu_aio_get(&bdrv_em_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&bdrv_em_aiocb_info, bs, cb, opaque);
> acb->is_write = is_write;
> acb->qiov = qiov;
> acb->bounce = qemu_blockalign(bs, qiov->size);
> @@ -3785,7 +3785,7 @@ static void bdrv_aio_co_cancel_em(BlockDriverAIOCB *blockacb)
> qemu_aio_flush();
> }
>
> -static AIOPool bdrv_em_co_aio_pool = {
> +static const AIOCBInfo bdrv_em_co_aiocb_info = {
> .aiocb_size = sizeof(BlockDriverAIOCBCoroutine),
> .cancel = bdrv_aio_co_cancel_em,
> };
> @@ -3828,7 +3828,7 @@ static BlockDriverAIOCB *bdrv_co_aio_rw_vector(BlockDriverState *bs,
> Coroutine *co;
> BlockDriverAIOCBCoroutine *acb;
>
> - acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
> acb->req.sector = sector_num;
> acb->req.nb_sectors = nb_sectors;
> acb->req.qiov = qiov;
> @@ -3858,7 +3858,7 @@ BlockDriverAIOCB *bdrv_aio_flush(BlockDriverState *bs,
> Coroutine *co;
> BlockDriverAIOCBCoroutine *acb;
>
> - acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
> co = qemu_coroutine_create(bdrv_aio_flush_co_entry);
> qemu_coroutine_enter(co, acb);
>
> @@ -3884,7 +3884,7 @@ BlockDriverAIOCB *bdrv_aio_discard(BlockDriverState *bs,
>
> trace_bdrv_aio_discard(bs, sector_num, nb_sectors, opaque);
>
> - acb = qemu_aio_get(&bdrv_em_co_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&bdrv_em_co_aiocb_info, bs, cb, opaque);
> acb->req.sector = sector_num;
> acb->req.nb_sectors = nb_sectors;
> co = qemu_coroutine_create(bdrv_aio_discard_co_entry);
> @@ -3904,13 +3904,13 @@ void bdrv_init_with_whitelist(void)
> bdrv_init();
> }
>
> -void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
> +void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque)
> {
> BlockDriverAIOCB *acb;
>
> - acb = g_slice_alloc(pool->aiocb_size);
> - acb->pool = pool;
> + acb = g_slice_alloc(aiocb_info->aiocb_size);
> + acb->aiocb_info = aiocb_info;
> acb->bs = bs;
> acb->cb = cb;
> acb->opaque = opaque;
> @@ -3920,7 +3920,7 @@ void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
> void qemu_aio_release(void *p)
> {
> BlockDriverAIOCB *acb = p;
> - g_slice_free1(acb->pool->aiocb_size, acb);
> + g_slice_free1(acb->aiocb_info->aiocb_size, acb);
> }
>
> /**************************************************************/
> diff --git a/block/blkdebug.c b/block/blkdebug.c
> index 1206d52..d61ece8 100644
> --- a/block/blkdebug.c
> +++ b/block/blkdebug.c
> @@ -41,7 +41,7 @@ typedef struct BlkdebugAIOCB {
>
> static void blkdebug_aio_cancel(BlockDriverAIOCB *blockacb);
>
> -static AIOPool blkdebug_aio_pool = {
> +static const AIOCBInfo blkdebug_aiocb_info = {
> .aiocb_size = sizeof(BlkdebugAIOCB),
> .cancel = blkdebug_aio_cancel,
> };
> @@ -335,7 +335,7 @@ static BlockDriverAIOCB *inject_error(BlockDriverState *bs,
> return NULL;
> }
>
> - acb = qemu_aio_get(&blkdebug_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&blkdebug_aiocb_info, bs, cb, opaque);
> acb->ret = -error;
>
> bh = qemu_bh_new(error_callback_bh, acb);
> diff --git a/block/blkverify.c b/block/blkverify.c
> index 9d5f1ec..4beede7 100644
> --- a/block/blkverify.c
> +++ b/block/blkverify.c
> @@ -48,7 +48,7 @@ static void blkverify_aio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool blkverify_aio_pool = {
> +static const AIOCBInfo blkverify_aiocb_info = {
> .aiocb_size = sizeof(BlkverifyAIOCB),
> .cancel = blkverify_aio_cancel,
> };
> @@ -233,7 +233,7 @@ static BlkverifyAIOCB *blkverify_aio_get(BlockDriverState *bs, bool is_write,
> BlockDriverCompletionFunc *cb,
> void *opaque)
> {
> - BlkverifyAIOCB *acb = qemu_aio_get(&blkverify_aio_pool, bs, cb, opaque);
> + BlkverifyAIOCB *acb = qemu_aio_get(&blkverify_aiocb_info, bs, cb, opaque);
>
> acb->bh = NULL;
> acb->is_write = is_write;
> diff --git a/block/curl.c b/block/curl.c
> index c1074cd..1179484 100644
> --- a/block/curl.c
> +++ b/block/curl.c
> @@ -438,7 +438,7 @@ static void curl_aio_cancel(BlockDriverAIOCB *blockacb)
> // Do we have to implement canceling? Seems to work without...
> }
>
> -static AIOPool curl_aio_pool = {
> +static const AIOCBInfo curl_aiocb_info = {
> .aiocb_size = sizeof(CURLAIOCB),
> .cancel = curl_aio_cancel,
> };
> @@ -505,7 +505,7 @@ static BlockDriverAIOCB *curl_aio_readv(BlockDriverState *bs,
> {
> CURLAIOCB *acb;
>
> - acb = qemu_aio_get(&curl_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&curl_aiocb_info, bs, cb, opaque);
>
> acb->qiov = qiov;
> acb->sector_num = sector_num;
> diff --git a/block/gluster.c b/block/gluster.c
> index 3588d73..1c90174 100644
> --- a/block/gluster.c
> +++ b/block/gluster.c
> @@ -388,7 +388,7 @@ static void qemu_gluster_aio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool gluster_aio_pool = {
> +static const AIOCBInfo gluster_aiocb_info = {
> .aiocb_size = sizeof(GlusterAIOCB),
> .cancel = qemu_gluster_aio_cancel,
> };
> @@ -439,7 +439,7 @@ static BlockDriverAIOCB *qemu_gluster_aio_rw(BlockDriverState *bs,
> size = nb_sectors * BDRV_SECTOR_SIZE;
> s->qemu_aio_count++;
>
> - acb = qemu_aio_get(&gluster_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&gluster_aiocb_info, bs, cb, opaque);
> acb->size = size;
> acb->ret = 0;
> acb->finished = NULL;
> @@ -484,7 +484,7 @@ static BlockDriverAIOCB *qemu_gluster_aio_flush(BlockDriverState *bs,
> GlusterAIOCB *acb;
> BDRVGlusterState *s = bs->opaque;
>
> - acb = qemu_aio_get(&gluster_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&gluster_aiocb_info, bs, cb, opaque);
> acb->size = 0;
> acb->ret = 0;
> acb->finished = NULL;
> diff --git a/block/iscsi.c b/block/iscsi.c
> index d0b1a10..a6a819d 100644
> --- a/block/iscsi.c
> +++ b/block/iscsi.c
> @@ -133,7 +133,7 @@ iscsi_aio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool iscsi_aio_pool = {
> +static const AIOCBInfo iscsi_aiocb_info = {
> .aiocb_size = sizeof(IscsiAIOCB),
> .cancel = iscsi_aio_cancel,
> };
> @@ -234,7 +234,7 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num,
> uint64_t lba;
> struct iscsi_data data;
>
> - acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
> trace_iscsi_aio_writev(iscsi, sector_num, nb_sectors, opaque, acb);
>
> acb->iscsilun = iscsilun;
> @@ -325,7 +325,7 @@ iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num,
>
> qemu_read_size = BDRV_SECTOR_SIZE * (size_t)nb_sectors;
>
> - acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
> trace_iscsi_aio_readv(iscsi, sector_num, nb_sectors, opaque, acb);
>
> acb->iscsilun = iscsilun;
> @@ -430,7 +430,7 @@ iscsi_aio_flush(BlockDriverState *bs,
> struct iscsi_context *iscsi = iscsilun->iscsi;
> IscsiAIOCB *acb;
>
> - acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
>
> acb->iscsilun = iscsilun;
> acb->canceled = 0;
> @@ -483,7 +483,7 @@ iscsi_aio_discard(BlockDriverState *bs,
> IscsiAIOCB *acb;
> struct unmap_list list[1];
>
> - acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
>
> acb->iscsilun = iscsilun;
> acb->canceled = 0;
> @@ -558,7 +558,7 @@ static BlockDriverAIOCB *iscsi_aio_ioctl(BlockDriverState *bs,
>
> assert(req == SG_IO);
>
> - acb = qemu_aio_get(&iscsi_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque);
>
> acb->iscsilun = iscsilun;
> acb->canceled = 0;
> diff --git a/block/linux-aio.c b/block/linux-aio.c
> index 6ca984d..91ef863 100644
> --- a/block/linux-aio.c
> +++ b/block/linux-aio.c
> @@ -140,7 +140,7 @@ static void laio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool laio_pool = {
> +static const AIOCBInfo laio_aiocb_info = {
> .aiocb_size = sizeof(struct qemu_laiocb),
> .cancel = laio_cancel,
> };
> @@ -154,7 +154,7 @@ BlockDriverAIOCB *laio_submit(BlockDriverState *bs, void *aio_ctx, int fd,
> struct iocb *iocbs;
> off_t offset = sector_num * 512;
>
> - laiocb = qemu_aio_get(&laio_pool, bs, cb, opaque);
> + laiocb = qemu_aio_get(&laio_aiocb_info, bs, cb, opaque);
> laiocb->nbytes = nb_sectors * 512;
> laiocb->ctx = s;
> laiocb->ret = -EINPROGRESS;
> diff --git a/block/qed.c b/block/qed.c
> index 6c182ca..0b5374a 100644
> --- a/block/qed.c
> +++ b/block/qed.c
> @@ -30,7 +30,7 @@ static void qed_aio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool qed_aio_pool = {
> +static const AIOCBInfo qed_aiocb_info = {
> .aiocb_size = sizeof(QEDAIOCB),
> .cancel = qed_aio_cancel,
> };
> @@ -1311,7 +1311,7 @@ static BlockDriverAIOCB *qed_aio_setup(BlockDriverState *bs,
> BlockDriverCompletionFunc *cb,
> void *opaque, int flags)
> {
> - QEDAIOCB *acb = qemu_aio_get(&qed_aio_pool, bs, cb, opaque);
> + QEDAIOCB *acb = qemu_aio_get(&qed_aiocb_info, bs, cb, opaque);
>
> trace_qed_aio_setup(bs->opaque, acb, sector_num, nb_sectors,
> opaque, flags);
> diff --git a/block/rbd.c b/block/rbd.c
> index 015a9db..0aaacaf 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -570,7 +570,7 @@ static void qemu_rbd_aio_cancel(BlockDriverAIOCB *blockacb)
> acb->cancelled = 1;
> }
>
> -static AIOPool rbd_aio_pool = {
> +static const AIOCBInfo rbd_aiocb_info = {
> .aiocb_size = sizeof(RBDAIOCB),
> .cancel = qemu_rbd_aio_cancel,
> };
> @@ -672,7 +672,7 @@ static BlockDriverAIOCB *rbd_start_aio(BlockDriverState *bs,
>
> BDRVRBDState *s = bs->opaque;
>
> - acb = qemu_aio_get(&rbd_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&rbd_aiocb_info, bs, cb, opaque);
> acb->cmd = cmd;
> acb->qiov = qiov;
> if (cmd == RBD_AIO_DISCARD) {
> diff --git a/block/sheepdog.c b/block/sheepdog.c
> index 9306174..a48f58c 100644
> --- a/block/sheepdog.c
> +++ b/block/sheepdog.c
> @@ -420,7 +420,7 @@ static void sd_aio_cancel(BlockDriverAIOCB *blockacb)
> acb->canceled = true;
> }
>
> -static AIOPool sd_aio_pool = {
> +static const AIOCBInfo sd_aiocb_info = {
> .aiocb_size = sizeof(SheepdogAIOCB),
> .cancel = sd_aio_cancel,
> };
> @@ -431,7 +431,7 @@ static SheepdogAIOCB *sd_aio_setup(BlockDriverState *bs, QEMUIOVector *qiov,
> {
> SheepdogAIOCB *acb;
>
> - acb = qemu_aio_get(&sd_aio_pool, bs, cb, opaque);
> + acb = qemu_aio_get(&sd_aiocb_info, bs, cb, opaque);
>
> acb->qiov = qiov;
>
> diff --git a/block/win32-aio.c b/block/win32-aio.c
> index c34dc73..444c228 100644
> --- a/block/win32-aio.c
> +++ b/block/win32-aio.c
> @@ -131,7 +131,7 @@ static void win32_aio_cancel(BlockDriverAIOCB *blockacb)
> }
> }
>
> -static AIOPool win32_aio_pool = {
> +static const AIOCBInfo win32_aiocb_info = {
> .aiocb_size = sizeof(QEMUWin32AIOCB),
> .cancel = win32_aio_cancel,
> };
> @@ -145,7 +145,7 @@ BlockDriverAIOCB *win32_aio_submit(BlockDriverState *bs,
> uint64_t offset = sector_num * 512;
> DWORD rc;
>
> - waiocb = qemu_aio_get(&win32_aio_pool, bs, cb, opaque);
> + waiocb = qemu_aio_get(&win32_aiocb_info, bs, cb, opaque);
> waiocb->nbytes = nb_sectors * 512;
> waiocb->qiov = qiov;
> waiocb->is_read = (type == QEMU_AIO_READ);
> diff --git a/dma-helpers.c b/dma-helpers.c
> index 0c18e9e..4f5fb64 100644
> --- a/dma-helpers.c
> +++ b/dma-helpers.c
> @@ -195,7 +195,7 @@ static void dma_aio_cancel(BlockDriverAIOCB *acb)
> dma_complete(dbs, 0);
> }
>
> -static AIOPool dma_aio_pool = {
> +static const AIOCBInfo dma_aiocb_info = {
> .aiocb_size = sizeof(DMAAIOCB),
> .cancel = dma_aio_cancel,
> };
> @@ -205,7 +205,7 @@ BlockDriverAIOCB *dma_bdrv_io(
> DMAIOFunc *io_func, BlockDriverCompletionFunc *cb,
> void *opaque, DMADirection dir)
> {
> - DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
> + DMAAIOCB *dbs = qemu_aio_get(&dma_aiocb_info, bs, cb, opaque);
>
> trace_dma_bdrv_io(dbs, bs, sector_num, (dir == DMA_DIRECTION_TO_DEVICE));
>
> diff --git a/hw/ide/core.c b/hw/ide/core.c
> index d683a8c..7d6b0fa 100644
> --- a/hw/ide/core.c
> +++ b/hw/ide/core.c
> @@ -336,7 +336,7 @@ static void trim_aio_cancel(BlockDriverAIOCB *acb)
> qemu_aio_release(iocb);
> }
>
> -static AIOPool trim_aio_pool = {
> +static const AIOCBInfo trim_aiocb_info = {
> .aiocb_size = sizeof(TrimAIOCB),
> .cancel = trim_aio_cancel,
> };
> @@ -360,7 +360,7 @@ BlockDriverAIOCB *ide_issue_trim(BlockDriverState *bs,
> TrimAIOCB *iocb;
> int i, j, ret;
>
> - iocb = qemu_aio_get(&trim_aio_pool, bs, cb, opaque);
> + iocb = qemu_aio_get(&trim_aiocb_info, bs, cb, opaque);
> iocb->bh = qemu_bh_new(ide_trim_bh_cb, iocb);
> iocb->ret = 0;
>
> diff --git a/qemu-aio.h b/qemu-aio.h
> index b29c509..3889fe9 100644
> --- a/qemu-aio.h
> +++ b/qemu-aio.h
> @@ -21,19 +21,19 @@
> typedef struct BlockDriverAIOCB BlockDriverAIOCB;
> typedef void BlockDriverCompletionFunc(void *opaque, int ret);
>
> -typedef struct AIOPool {
> +typedef struct AIOCBInfo {
> void (*cancel)(BlockDriverAIOCB *acb);
> size_t aiocb_size;
> -} AIOPool;
> +} AIOCBInfo;
>
> struct BlockDriverAIOCB {
> - AIOPool *pool;
> + const AIOCBInfo *aiocb_info;
> BlockDriverState *bs;
> BlockDriverCompletionFunc *cb;
> void *opaque;
> };
>
> -void *qemu_aio_get(AIOPool *pool, BlockDriverState *bs,
> +void *qemu_aio_get(const AIOCBInfo *aiocb_info, BlockDriverState *bs,
> BlockDriverCompletionFunc *cb, void *opaque);
> void qemu_aio_release(void *p);
>
> diff --git a/thread-pool.c b/thread-pool.c
> index 266f12f..894cde6 100644
> --- a/thread-pool.c
> +++ b/thread-pool.c
> @@ -206,7 +206,7 @@ static void thread_pool_cancel(BlockDriverAIOCB *acb)
> qemu_mutex_unlock(&lock);
> }
>
> -static AIOPool thread_pool_cb_pool = {
> +static const AIOCBInfo thread_pool_aiocb_info = {
> .aiocb_size = sizeof(ThreadPoolElement),
> .cancel = thread_pool_cancel,
> };
> @@ -216,7 +216,7 @@ BlockDriverAIOCB *thread_pool_submit_aio(ThreadPoolFunc *func, void *arg,
> {
> ThreadPoolElement *req;
>
> - req = qemu_aio_get(&thread_pool_cb_pool, NULL, cb, opaque);
> + req = qemu_aio_get(&thread_pool_aiocb_info, NULL, cb, opaque);
> req->func = func;
> req->arg = arg;
> req->state = THREAD_QUEUED;
>
Didn't really review it, but if it compiles... :)
Paolo
next prev parent reply other threads:[~2012-11-02 14:50 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-31 15:34 [Qemu-devel] [PATCH v2 0/3] aio: use g_slice_alloc() for AIOCB pooling Stefan Hajnoczi
2012-10-31 15:34 ` [Qemu-devel] [PATCH v2 1/3] aio: switch aiocb_size type int -> size_t Stefan Hajnoczi
2012-11-02 14:49 ` Paolo Bonzini
2012-10-31 15:34 ` [Qemu-devel] [PATCH v2 2/3] aio: use g_slice_alloc() for AIOCB pooling Stefan Hajnoczi
2012-11-02 14:49 ` Paolo Bonzini
2012-11-12 10:34 ` Kevin Wolf
2012-11-12 10:37 ` Paolo Bonzini
2012-11-12 10:42 ` Kevin Wolf
2012-10-31 15:34 ` [Qemu-devel] [PATCH v2 3/3] aio: rename AIOPool to AIOCBInfo Stefan Hajnoczi
2012-11-02 14:50 ` Paolo Bonzini [this message]
2012-11-12 10:34 ` [Qemu-devel] [PATCH v2 0/3] aio: use g_slice_alloc() for AIOCB pooling Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5093DDB7.1000709@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.