implement qemu_blockalign (Stefano Stabellini)
this patch adds a buffer_alignment field to BlockDriverState and implements a qemu_blockalign function that uses that field to allocate a memory aligned buffer to be used by the block driver. buffer_alignment is initialized to 512 but each block driver can set a different value (at the moment none of them do). This patch modifies ide.c, block-qcow.c, block-qcow2.c and block.c to use qemu_blockalign instead of qemu_memalign. There is only one place left that still uses qemu_memalign to allocate buffers used by block drivers that is posix-aio-compat:handle_aiocb_rw because it is not possible to get the BlockDriverState from that function. However I think it is not important because posix-aio-compat already deals with driver specific code so it is supposed to know its own needs. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@7229 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									94909d9fd9
								
							
						
					
					
						commit
						e268ca5232
					
				@ -641,7 +641,7 @@ static BlockDriverAIOCB *qcow_aio_readv(BlockDriverState *bs,
 | 
				
			|||||||
    acb->sector_num = sector_num;
 | 
					    acb->sector_num = sector_num;
 | 
				
			||||||
    acb->qiov = qiov;
 | 
					    acb->qiov = qiov;
 | 
				
			||||||
    if (qiov->niov > 1)
 | 
					    if (qiov->niov > 1)
 | 
				
			||||||
        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
 | 
					        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        acb->buf = (uint8_t *)qiov->iov->iov_base;
 | 
					        acb->buf = (uint8_t *)qiov->iov->iov_base;
 | 
				
			||||||
    acb->nb_sectors = nb_sectors;
 | 
					    acb->nb_sectors = nb_sectors;
 | 
				
			||||||
@ -736,7 +736,7 @@ static BlockDriverAIOCB *qcow_aio_writev(BlockDriverState *bs,
 | 
				
			|||||||
    acb->sector_num = sector_num;
 | 
					    acb->sector_num = sector_num;
 | 
				
			||||||
    acb->qiov = qiov;
 | 
					    acb->qiov = qiov;
 | 
				
			||||||
    if (qiov->niov > 1) {
 | 
					    if (qiov->niov > 1) {
 | 
				
			||||||
        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
 | 
					        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
 | 
				
			||||||
        qemu_iovec_to_buffer(qiov, acb->buf);
 | 
					        qemu_iovec_to_buffer(qiov, acb->buf);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        acb->buf = (uint8_t *)qiov->iov->iov_base;
 | 
					        acb->buf = (uint8_t *)qiov->iov->iov_base;
 | 
				
			||||||
 | 
				
			|||||||
@ -1412,7 +1412,7 @@ static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs,
 | 
				
			|||||||
    acb->sector_num = sector_num;
 | 
					    acb->sector_num = sector_num;
 | 
				
			||||||
    acb->qiov = qiov;
 | 
					    acb->qiov = qiov;
 | 
				
			||||||
    if (qiov->niov > 1) {
 | 
					    if (qiov->niov > 1) {
 | 
				
			||||||
        acb->buf = acb->orig_buf = qemu_memalign(512, qiov->size);
 | 
					        acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size);
 | 
				
			||||||
        if (is_write)
 | 
					        if (is_write)
 | 
				
			||||||
            qemu_iovec_to_buffer(qiov, acb->buf);
 | 
					            qemu_iovec_to_buffer(qiov, acb->buf);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
 | 
				
			|||||||
@ -165,7 +165,7 @@ static int raw_open(BlockDriverState *bs, const char *filename, int flags)
 | 
				
			|||||||
    s->fd = fd;
 | 
					    s->fd = fd;
 | 
				
			||||||
    s->aligned_buf = NULL;
 | 
					    s->aligned_buf = NULL;
 | 
				
			||||||
    if ((flags & BDRV_O_NOCACHE)) {
 | 
					    if ((flags & BDRV_O_NOCACHE)) {
 | 
				
			||||||
        s->aligned_buf = qemu_memalign(512, ALIGNED_BUFFER_SIZE);
 | 
					        s->aligned_buf = qemu_blockalign(bs, ALIGNED_BUFFER_SIZE);
 | 
				
			||||||
        if (s->aligned_buf == NULL) {
 | 
					        if (s->aligned_buf == NULL) {
 | 
				
			||||||
            ret = -errno;
 | 
					            ret = -errno;
 | 
				
			||||||
            close(fd);
 | 
					            close(fd);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								block.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								block.c
									
									
									
									
									
								
							@ -362,6 +362,8 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags,
 | 
				
			|||||||
    bs->is_temporary = 0;
 | 
					    bs->is_temporary = 0;
 | 
				
			||||||
    bs->encrypted = 0;
 | 
					    bs->encrypted = 0;
 | 
				
			||||||
    bs->valid_key = 0;
 | 
					    bs->valid_key = 0;
 | 
				
			||||||
 | 
					    /* buffer_alignment defaulted to 512, drivers can change this value */
 | 
				
			||||||
 | 
					    bs->buffer_alignment = 512;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (flags & BDRV_O_SNAPSHOT) {
 | 
					    if (flags & BDRV_O_SNAPSHOT) {
 | 
				
			||||||
        BlockDriverState *bs1;
 | 
					        BlockDriverState *bs1;
 | 
				
			||||||
@ -1390,7 +1392,7 @@ static BlockDriverAIOCB *bdrv_aio_rw_vector(BlockDriverState *bs,
 | 
				
			|||||||
    acb = qemu_aio_get(bs, cb, opaque);
 | 
					    acb = qemu_aio_get(bs, cb, opaque);
 | 
				
			||||||
    acb->is_write = is_write;
 | 
					    acb->is_write = is_write;
 | 
				
			||||||
    acb->qiov = qiov;
 | 
					    acb->qiov = qiov;
 | 
				
			||||||
    acb->bounce = qemu_memalign(512, qiov->size);
 | 
					    acb->bounce = qemu_blockalign(bs, qiov->size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!acb->bh)
 | 
					    if (!acb->bh)
 | 
				
			||||||
        acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
 | 
					        acb->bh = qemu_bh_new(bdrv_aio_bh_cb, acb);
 | 
				
			||||||
@ -1640,3 +1642,8 @@ BlockDriverAIOCB *bdrv_aio_ioctl(BlockDriverState *bs,
 | 
				
			|||||||
        return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
 | 
					        return drv->bdrv_aio_ioctl(bs, req, buf, cb, opaque);
 | 
				
			||||||
    return NULL;
 | 
					    return NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *qemu_blockalign(BlockDriverState *bs, size_t size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -145,6 +145,9 @@ struct BlockDriverState {
 | 
				
			|||||||
    /* Whether the disk can expand beyond total_sectors */
 | 
					    /* Whether the disk can expand beyond total_sectors */
 | 
				
			||||||
    int growable;
 | 
					    int growable;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* the memory alignment required for the buffers handled by this driver */
 | 
				
			||||||
 | 
					    int buffer_alignment;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* NOTE: the following infos are only hints for real hardware
 | 
					    /* NOTE: the following infos are only hints for real hardware
 | 
				
			||||||
       drivers. They are not used by the block driver */
 | 
					       drivers. They are not used by the block driver */
 | 
				
			||||||
    int cyls, heads, secs, translation;
 | 
					    int cyls, heads, secs, translation;
 | 
				
			||||||
@ -173,6 +176,8 @@ void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs,
 | 
				
			|||||||
                        BlockDriverCompletionFunc *cb, void *opaque);
 | 
					                        BlockDriverCompletionFunc *cb, void *opaque);
 | 
				
			||||||
void qemu_aio_release(void *p);
 | 
					void qemu_aio_release(void *p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *qemu_blockalign(BlockDriverState *bs, size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern BlockDriverState *bdrv_first;
 | 
					extern BlockDriverState *bdrv_first;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* BLOCK_INT_H */
 | 
					#endif /* BLOCK_INT_H */
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								hw/ide.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								hw/ide.c
									
									
									
									
									
								
							@ -2788,11 +2788,11 @@ static void ide_init2(IDEState *ide_state,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    for(i = 0; i < 2; i++) {
 | 
					    for(i = 0; i < 2; i++) {
 | 
				
			||||||
        s = ide_state + i;
 | 
					        s = ide_state + i;
 | 
				
			||||||
        s->io_buffer = qemu_memalign(512, IDE_DMA_BUF_SECTORS*512 + 4);
 | 
					 | 
				
			||||||
        if (i == 0)
 | 
					        if (i == 0)
 | 
				
			||||||
            s->bs = hd0;
 | 
					            s->bs = hd0;
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            s->bs = hd1;
 | 
					            s->bs = hd1;
 | 
				
			||||||
 | 
					        s->io_buffer = qemu_blockalign(s->bs, IDE_DMA_BUF_SECTORS*512 + 4);
 | 
				
			||||||
        if (s->bs) {
 | 
					        if (s->bs) {
 | 
				
			||||||
            bdrv_get_geometry(s->bs, &nb_sectors);
 | 
					            bdrv_get_geometry(s->bs, &nb_sectors);
 | 
				
			||||||
            bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
 | 
					            bdrv_guess_geometry(s->bs, &cylinders, &heads, &secs);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user