All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Roger Pau Monne <roger.pau@citrix.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2] block: char devices on FreeBSD are not behind a pager
Date: Tue, 21 Oct 2014 13:51:23 +0200	[thread overview]
Message-ID: <544648BB.4090408@redhat.com> (raw)
In-Reply-To: <1413887956-28027-1-git-send-email-roger.pau@citrix.com>

On 2014-10-21 at 12:39, Roger Pau Monne wrote:
> Introduce a new flag to mark devices that require requests to be aligned and
> replace the usage of BDRV_O_NOCACHE and O_DIRECT with this flag when
> appropriate.
>
> If a character device is used as a backend on a FreeBSD host set this flag
> unconditionally.
>
> Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>
> ---
> Changes since v1:
>   - Intead of appending BDRV_O_NOCACHE and O_DIRECT when a char dev is used
>     on FreeBSD introduce a new flag that is used to mark if a device needs
>     requests to be aligned.
> ---
>   block/raw-posix.c | 25 ++++++++++++++++++++-----
>   1 file changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/block/raw-posix.c b/block/raw-posix.c
> index 86ce4f2..b5361f7 100644
> --- a/block/raw-posix.c
> +++ b/block/raw-posix.c
> @@ -150,6 +150,7 @@ typedef struct BDRVRawState {
>       bool has_discard:1;
>       bool has_write_zeroes:1;
>       bool discard_zeroes:1;
> +    bool needs_alignement:1;

First, it's "alignment". Second, urgh, do you really want to use a bit 
field here? :-/

I know and see that there is pre-existing code here which does it, but I 
personally find it pretty ugly. There is no need to use one whatsoever.

>   #ifdef CONFIG_FIEMAP
>       bool skip_fiemap;
>   #endif
> @@ -230,7 +231,7 @@ static void raw_probe_alignment(BlockDriverState *bs, int fd, Error **errp)
>   
>       /* For /dev/sg devices the alignment is not really used.
>          With buffered I/O, we don't have any restrictions. */
> -    if (bs->sg || !(s->open_flags & O_DIRECT)) {
> +    if (bs->sg || !s->needs_alignement) {
>           bs->request_alignment = 1;
>           s->buf_align = 1;
>           return;
> @@ -446,6 +447,8 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
>   
>       s->has_discard = true;
>       s->has_write_zeroes = true;
> +    if ((bs->open_flags & BDRV_O_NOCACHE) != 0)
> +        s->needs_alignement = true;

This is not conforming to the qemu coding style (always put {} around 
blocks).

>       if (fstat(s->fd, &st) < 0) {
>           error_setg_errno(errp, errno, "Could not stat file");
> @@ -472,6 +475,17 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
>           }
>   #endif
>       }
> +#ifdef __FreeBSD__
> +    if (S_ISCHR(st.st_mode)) {
> +        /*
> +         * The file is a char device (disk), which on FreeBSD isn't behind
> +         * a pager, so force all requests to be aligned. This is needed
> +         * so Qemu makes sure all IO operations on the device are aligned
> +         * to sector size, or else FreeBSD will reject them with EINVAL.
> +         */
> +        s->needs_alignement = true;
> +    }
> +#endif
>   
>   #ifdef CONFIG_XFS
>       if (platform_test_xfs_fd(s->fd)) {
> @@ -1076,11 +1090,12 @@ static BlockDriverAIOCB *raw_aio_submit(BlockDriverState *bs,
>           return NULL;
>   
>       /*
> -     * If O_DIRECT is used the buffer needs to be aligned on a sector
> -     * boundary.  Check if this is the case or tell the low-level
> -     * driver that it needs to copy the buffer.
> +     * Check if the underlying device requires requests to be aligned,
> +     * and if the request we are trying to submit is aligned or not.
> +     * If this is the case tell the low-level driver that it needs
> +     * to copy the buffer.
>        */
> -    if ((bs->open_flags & BDRV_O_NOCACHE)) {
> +    if (s->needs_alignement) {
>           if (!bdrv_qiov_is_aligned(bs, qiov)) {
>               type |= QEMU_AIO_MISALIGNED;
>   #ifdef CONFIG_LINUX_AIO

With s/alignement/alignment/ and the conditional block changed to 
conform to the qemu coding style:

Reviewed-by: Max Reitz <mreitz@redhat.com>

You are free to keep needs_alignment a bit field or not (the R-b stands 
either way). I wouldn't make it a bit field but I leave it up to you.

Max

      reply	other threads:[~2014-10-21 11:51 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-21 10:39 [Qemu-devel] [PATCH v2] block: char devices on FreeBSD are not behind a pager Roger Pau Monne
2014-10-21 11:51 ` Max Reitz [this message]

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=544648BB.4090408@redhat.com \
    --to=mreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=roger.pau@citrix.com \
    --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.