Re: [PATCH v13 3/9] block: add emulation for copy

From: Nitesh Shetty
Date: Wed Aug 02 2023 - 00:31:32 EST

On 23/07/20 09:50AM, Christoph Hellwig wrote:
+static void *blkdev_copy_alloc_buf(sector_t req_size, sector_t *alloc_size,
+ gfp_t gfp_mask)
+ int min_size = PAGE_SIZE;
+ void *buf;
+ while (req_size >= min_size) {
+ buf = kvmalloc(req_size, gfp_mask);
+ if (buf) {
+ *alloc_size = req_size;
+ return buf;
+ }
+ /* retry half the requested size */
+ req_size >>= 1;
+ }
+ return NULL;

Is there any good reason for using vmalloc instead of a bunch
of distcontiguous pages?

kvmalloc seemed convenient for the purpose. We will need to call alloc_page in a loop to guarantee discontigous pages. Do you prefer that over kvmalloc?

+ ctx = kzalloc(sizeof(struct copy_ctx), gfp_mask);
+ if (!ctx)
+ goto err_ctx;

I'd suspect it would be better to just allocte a single buffer and
only have a single outstanding copy. That will reduce the bandwith
you can theoretically get, but copies tend to be background operations
anyway. It will reduce the required memory, and thus the chance for
this operation to fail on a loaded system. It will also dramatically
reduce the effect on memory managment.

Next version will have that change.

Thank You,
Nitesh Shetty