All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Yang Hongyang <yanghy@cn.fujitsu.com>, xen-devel@lists.xen.org
Cc: wei.liu2@citrix.com, ian.campbell@citrix.com,
	wency@cn.fujitsu.com, guijianfeng@cn.fujitsu.com,
	yunhong.jiang@intel.com, eddie.dong@intel.com,
	rshriram@cs.ubc.ca, ian.jackson@eu.citrix.com
Subject: Re: [PATCH v1 COLO Pre 03/12] tools/libxc: export xc_bitops.h
Date: Tue, 2 Jun 2015 11:11:22 +0100	[thread overview]
Message-ID: <556D814A.7090909@citrix.com> (raw)
In-Reply-To: <1433237180-21181-4-git-send-email-yanghy@cn.fujitsu.com>

On 02/06/15 10:26, Yang Hongyang wrote:
> When we are under COLO, we will send dirty page bitmap info from
> secondary to primary at every checkpoint. So we need to get/test
> the dirty page bitmap. We just expose xc_bitops.h for libxl use.
>
> NOTE:
>   Need to make clean and rerun configure to get it compiled.
>
> Signed-off-by: Yang Hongyang <yanghy@cn.fujitsu.com>

I like this change, but lets take the opportunity to fix some of the
issues in it.

> ---
>  tools/libxc/include/xc_bitops.h | 76 +++++++++++++++++++++++++++++++++++++++++
>  tools/libxc/xc_bitops.h         | 76 -----------------------------------------
>  2 files changed, 76 insertions(+), 76 deletions(-)
>  create mode 100644 tools/libxc/include/xc_bitops.h
>  delete mode 100644 tools/libxc/xc_bitops.h
>
> diff --git a/tools/libxc/include/xc_bitops.h b/tools/libxc/include/xc_bitops.h
> new file mode 100644
> index 0000000..cd749f4
> --- /dev/null
> +++ b/tools/libxc/include/xc_bitops.h
> @@ -0,0 +1,76 @@
> +#ifndef XC_BITOPS_H
> +#define XC_BITOPS_H 1

No need for a 1 here

> +
> +/* bitmap operations for single threaded access */
> +
> +#include <stdlib.h>
> +#include <string.h>
> +
> +#define BITS_PER_LONG (sizeof(unsigned long) * 8)

All defines like this need XC_ prefixes, and CHAR_BIT should be used in
preference to 8.

> +#define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6)

This name is misleading, as it is in terms of bits not bytes. 
XC_BITMAP_SHIFT perhaps?

> +
> +#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr)/BITS_PER_LONG]
> +#define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG)

I would recommend dropping these and open coding the few cases below. 
It would be far more clear.

> +
> +/* calculate required space for number of longs needed to hold nr_bits */
> +static inline int bitmap_size(int nr_bits)

"int" has been inappropriate everywhere in this file.  unsigned long
please (or settle on unsigned int everywhere)

> +{
> +    int nr_long, nr_bytes;
> +    nr_long = (nr_bits + BITS_PER_LONG - 1) >> ORDER_LONG;

This calculation can overflow.

(nr_bits >> ORDER_LONG) + !!(nr_bits % BITS_PER_LONG)

> +    nr_bytes = nr_long * sizeof(unsigned long);
> +    return nr_bytes;
> +}
> +
> +static inline unsigned long *bitmap_alloc(int nr_bits)
> +{
> +    return calloc(1, bitmap_size(nr_bits));
> +}
> +
> +static inline void bitmap_set(unsigned long *addr, int nr_bits)
> +{
> +    memset(addr, 0xff, bitmap_size(nr_bits));
> +}
> +
> +static inline void bitmap_clear(unsigned long *addr, int nr_bits)
> +{
> +    memset(addr, 0, bitmap_size(nr_bits));
> +}
> +
> +static inline int test_bit(int nr, unsigned long *addr)

const *addr, as this is a read-only operation.

> +{
> +    return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1;
> +}
> +
> +static inline void clear_bit(int nr, unsigned long *addr)
> +{
> +    BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr));
> +}
> +
> +static inline void set_bit(int nr, unsigned long *addr)
> +{
> +    BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr));
> +}

It would be nice to be consistent on whether the bitmap pointer or the
bit is the first parameter.  Perhaps a second cleanup patch which makes
this consistent and adjusts all current callers.

~Andrew

> +
> +static inline int test_and_clear_bit(int nr, unsigned long *addr)
> +{
> +    int oldbit = test_bit(nr, addr);
> +    clear_bit(nr, addr);
> +    return oldbit;
> +}
> +
> +static inline int test_and_set_bit(int nr, unsigned long *addr)
> +{
> +    int oldbit = test_bit(nr, addr);
> +    set_bit(nr, addr);
> +    return oldbit;
> +}
> +
> +static inline void bitmap_or(unsigned long *dst, const unsigned long *other,
> +                             int nr_bits)
> +{
> +    int i, nr_longs = (bitmap_size(nr_bits) / sizeof(unsigned long));
> +    for ( i = 0; i < nr_longs; ++i )
> +        dst[i] |= other[i];
> +}
> +
> +#endif  /* XC_BITOPS_H */
> diff --git a/tools/libxc/xc_bitops.h b/tools/libxc/xc_bitops.h
> deleted file mode 100644
> index cd749f4..0000000
> --- a/tools/libxc/xc_bitops.h
> +++ /dev/null
> @@ -1,76 +0,0 @@
> -#ifndef XC_BITOPS_H
> -#define XC_BITOPS_H 1
> -
> -/* bitmap operations for single threaded access */
> -
> -#include <stdlib.h>
> -#include <string.h>
> -
> -#define BITS_PER_LONG (sizeof(unsigned long) * 8)
> -#define ORDER_LONG (sizeof(unsigned long) == 4 ? 5 : 6)
> -
> -#define BITMAP_ENTRY(_nr,_bmap) ((_bmap))[(_nr)/BITS_PER_LONG]
> -#define BITMAP_SHIFT(_nr) ((_nr) % BITS_PER_LONG)
> -
> -/* calculate required space for number of longs needed to hold nr_bits */
> -static inline int bitmap_size(int nr_bits)
> -{
> -    int nr_long, nr_bytes;
> -    nr_long = (nr_bits + BITS_PER_LONG - 1) >> ORDER_LONG;
> -    nr_bytes = nr_long * sizeof(unsigned long);
> -    return nr_bytes;
> -}
> -
> -static inline unsigned long *bitmap_alloc(int nr_bits)
> -{
> -    return calloc(1, bitmap_size(nr_bits));
> -}
> -
> -static inline void bitmap_set(unsigned long *addr, int nr_bits)
> -{
> -    memset(addr, 0xff, bitmap_size(nr_bits));
> -}
> -
> -static inline void bitmap_clear(unsigned long *addr, int nr_bits)
> -{
> -    memset(addr, 0, bitmap_size(nr_bits));
> -}
> -
> -static inline int test_bit(int nr, unsigned long *addr)
> -{
> -    return (BITMAP_ENTRY(nr, addr) >> BITMAP_SHIFT(nr)) & 1;
> -}
> -
> -static inline void clear_bit(int nr, unsigned long *addr)
> -{
> -    BITMAP_ENTRY(nr, addr) &= ~(1UL << BITMAP_SHIFT(nr));
> -}
> -
> -static inline void set_bit(int nr, unsigned long *addr)
> -{
> -    BITMAP_ENTRY(nr, addr) |= (1UL << BITMAP_SHIFT(nr));
> -}
> -
> -static inline int test_and_clear_bit(int nr, unsigned long *addr)
> -{
> -    int oldbit = test_bit(nr, addr);
> -    clear_bit(nr, addr);
> -    return oldbit;
> -}
> -
> -static inline int test_and_set_bit(int nr, unsigned long *addr)
> -{
> -    int oldbit = test_bit(nr, addr);
> -    set_bit(nr, addr);
> -    return oldbit;
> -}
> -
> -static inline void bitmap_or(unsigned long *dst, const unsigned long *other,
> -                             int nr_bits)
> -{
> -    int i, nr_longs = (bitmap_size(nr_bits) / sizeof(unsigned long));
> -    for ( i = 0; i < nr_longs; ++i )
> -        dst[i] |= other[i];
> -}
> -
> -#endif  /* XC_BITOPS_H */

  reply	other threads:[~2015-06-02 10:11 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-02  9:26 [PATCH v1 COLO Pre 00/12] Prerequisite patches for COLO Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 01/12] tools/libxc: support to resume uncooperative HVM guests Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 02/12] libxc/restore: zero ioreq page only one time Yang Hongyang
2015-06-02 10:16   ` Andrew Cooper
2015-06-02 10:25     ` Wen Congyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 03/12] tools/libxc: export xc_bitops.h Yang Hongyang
2015-06-02 10:11   ` Andrew Cooper [this message]
2015-06-04  1:01     ` Yang Hongyang
2015-06-04  8:36       ` Ian Campbell
2015-06-04  8:51         ` Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 04/12] tools/libxl: introduce a new API libxl__domain_restore() to load qemu state Yang Hongyang
2015-06-02  9:38   ` Wen Congyang
2015-06-02  9:49     ` Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 05/12] tools/libxl: Introduce a new internal API libxl__domain_unpause() Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 06/12] tools/libxl: Update libxl__domain_unpause() to support qemu-xen Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 07/12] tools/libxl: introduce libxl__domain_common_switch_qemu_logdirty() Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 08/12] tools/libxl: Update libxl_save_msgs_gen.pl to support return data from xl to xc Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 09/12] tools/libxl: Add back channel to allow migration target send data back Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 10/12] tools/libxl: rename remus device to checkpoint device Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 11/12] tools/libxl: adjust the indentation Yang Hongyang
2015-06-02  9:26 ` [PATCH v1 COLO Pre 12/12] tools/libxl: don't touch remus in checkpoint_device Yang Hongyang

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=556D814A.7090909@citrix.com \
    --to=andrew.cooper3@citrix.com \
    --cc=eddie.dong@intel.com \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=ian.campbell@citrix.com \
    --cc=ian.jackson@eu.citrix.com \
    --cc=rshriram@cs.ubc.ca \
    --cc=wei.liu2@citrix.com \
    --cc=wency@cn.fujitsu.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yanghy@cn.fujitsu.com \
    --cc=yunhong.jiang@intel.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.