[Pdbg] [PATCH 3/6] htm: Use splice() to copy dump

Amitay Isaacs amitay at ozlabs.org
Wed Jul 4 14:18:41 AEST 2018


On Tue, 2018-07-03 at 16:58 +1000, Michael Neuling wrote:
> Gives 10% speedup for no more complexity.

How about copy_file_range()?

> 
> Signed-off-by: Michael Neuling <mikey at neuling.org>
> ---
>  libpdbg/htm.c | 26 ++++++++++++--------------
>  1 file changed, 12 insertions(+), 14 deletions(-)
> 
> diff --git a/libpdbg/htm.c b/libpdbg/htm.c
> index fa15f5f5d3..a494493935 100644
> --- a/libpdbg/htm.c
> +++ b/libpdbg/htm.c
> @@ -952,41 +952,39 @@ static int do_htm_status(struct htm *htm)
>  	return 1;
>  }
>  
> -#define COPY_BUF_SIZE getpagesize()
>  static int copy_file(int output, int input, uint64_t size)
>  {
> -	char *buf;
>  	size_t r;
> +	int pipefd[2];
> +	int rc = -1;
>  
> -	buf = malloc(COPY_BUF_SIZE);
> -	if (!buf) {
> -		PR_ERROR("Can't malloc buffer\n");
> -		return -1;
> +	if (pipe(pipefd)) {
> +		perror("pipe");
> +		exit(1);
>  	}
>  
>  	while (size) {
> -		r = read(input, buf, MIN(COPY_BUF_SIZE, size));
> +		r = splice(input, 0, pipefd[1], 0, size, 0);
>  		if (r == -1) {
>  			PR_ERROR("Failed to read\n");
>  			goto out;
>  		}
>  		if (r == 0) {
> -			PR_ERROR("EOF\n");
> +			PR_ERROR("Unexpect EOF\n");
>  			goto out;
>  		}
>  
> -		if (write(output, buf, r) != r) {
> +		if (splice(pipefd[0], 0, output, 0, r, 0) != r) {
>  			PR_ERROR("Short write!\n");
>  			goto out;
>  		}
>  		size -= r;
>  	}
> -
> -	return 0;
> -
> +	rc = 0;
>  out:
> -	free(buf);
> -	return -1;
> +	close(pipefd[1]);
> +	close(pipefd[0]);
> +	return rc;
>  
>  }
>  
> -- 
> 2.17.1
> 

Amitay.
-- 

Think. Then discretize.  - Rokhlin


More information about the Pdbg mailing list