[CRIU] [PATCH 4/4] deduplication: add punching via fallocate for list of regions
Pavel Emelyanov
xemul at parallels.com
Thu Oct 10 01:55:36 PDT 2013
On 10/09/2013 06:06 PM, Tikhomirov Pavel wrote:
>
> Signed-off-by: Tikhomirov Pavel <snorcht at gmail.com>
> ---
> cr-dedup.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++--
> include/cr-dedup.h | 9 +++++++++
> 2 files changed, 58 insertions(+), 2 deletions(-)
>
> diff --git a/cr-dedup.c b/cr-dedup.c
> index 645f435..a93cff1 100755
> --- a/cr-dedup.c
> +++ b/cr-dedup.c
> @@ -21,7 +21,12 @@ int cr_dedup(pid_t pid)
> unsigned long va, i, off;
> struct iovec iov, iov2;
>
> - ret = open_page_read(pid, &pr);
> + struct list_head *pos, *q;
> + struct to_punch * to_punch_temp = NULL;
> + struct to_punch * tmp;
> + LIST_HEAD(to_punch_list);
> +
> + ret = open_page_rw(pid, &pr);
> if (ret)
> return -1;
>
> @@ -50,6 +55,8 @@ int cr_dedup(pid_t pid)
> goto exit;
>
> off = 0;
> + to_punch_temp = (struct to_punch *)malloc(sizeof(struct to_punch));
Use xmalloc, don't cast types and check for NULL return value.
> + to_punch_temp->off = -1;
> while (1) {
> unsigned long nr;
> if (iov.iov_base != iov2.iov_base) {
> @@ -99,7 +106,20 @@ int cr_dedup(pid_t pid)
> if (memcmp(buf, buf2, PAGE_SIZE) != 0) {
> pr_info("Pages Not Equal : %lu\n", va);
> } else {
> -
> + if (to_punch_temp->off == -1) {
> + to_punch_temp->off = off;
> + to_punch_temp->nr_pages = 1;
> + } else {
> + if (to_punch_temp->off + to_punch_temp->nr_pages == off)
> + to_punch_temp->nr_pages++;
> + else {
> + list_add(&(to_punch_temp->list), &(to_punch_list));
> + to_punch_temp = (struct to_punch *)malloc(sizeof(struct to_punch));
> + to_punch_temp->off = off;
> + to_punch_temp->nr_pages = 1;
> + //write temp to list
No // comments please. Use the /* */ ones.
> + }
> + }
> }
>
> off++;
> @@ -123,6 +143,22 @@ int cr_dedup(pid_t pid)
> if (ret <= 0)
> break;
> }
> +
> + if (to_punch_temp->off != -1) {
> + list_add(&(to_punch_temp->list), &(to_punch_list));
> + //write temp to list
> + }
> +
> + //Punching is here
> + list_for_each(pos, &to_punch_list){
> + tmp= list_entry(pos, struct to_punch, list);
> + pr_err("Punch hole: off=%lu/nr_pages=%lu\n", tmp->off, tmp->nr_pages);
> + ret = fallocate(pr.fd_pg, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, tmp->off * PAGE_SIZE, tmp->nr_pages * PAGE_SIZE);
> + if (ret != 0) {
> + pr_err("Error fallocate : %d\n", errno);
> + goto exit;
> + }
> + }
> exit:
> pr_info("Dedup test END\n");
>
> @@ -141,5 +177,16 @@ exit:
> return ret;
> }
>
> + if (to_punch_temp)
> + if(to_punch_temp->off == -1)
> + free(to_punch_temp);
> +
> + //cleen list
> + list_for_each_safe(pos, q, &to_punch_list){
> + to_punch_temp = list_entry(pos, struct to_punch, list);
> + list_del(pos);
> + free(to_punch_temp);
> + }
> +
> return 0;
> }
> diff --git a/include/cr-dedup.h b/include/cr-dedup.h
> index 4a66e03..b1d7848 100644
> --- a/include/cr-dedup.h
> +++ b/include/cr-dedup.h
> @@ -1,6 +1,15 @@
> #ifndef __CR_DEDUP_H__
> #define __CR_DEDUP_H__
>
> +#define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */
> +#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */
> +
> +struct to_punch{
> + struct list_head list;
> + unsigned long off;
> + unsigned long nr_pages;
> +};
> +
> int cr_dedup(pid_t pid);
>
> #endif
>
More information about the CRIU
mailing list