From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010041.outbound.protection.outlook.com [52.101.85.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3AD4336EF8 for ; Mon, 15 Jun 2026 09:19:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.41 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781515159; cv=fail; b=pQz23oy5AcRVsNfPf4TWqC6B7eY1MWrbAay/TGEFRlADucHl+IPOgY6iY6fZFjKlPUrWp3RJixZJuT15QxLcB502HpqZcYsw85J/clJ+RtpDbnIyQlk40bM9mrMlmzS2RePDcpmv1eeNYO72X3LmErqPkmxJVrT26BY0einDVN4= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781515159; c=relaxed/simple; bh=OpFap71BGsaztlUT1Ydh1/wA9eHzmWF9A8X/kAKDVbo=; h=Message-ID:Date:Subject:To:Cc:References:From:In-Reply-To: Content-Type:MIME-Version; b=NHXXoTxw3uzCEEy4AvqQxpOwKqXBNzrjRIHEibH7LQPfyRNOwbZrNmz4KKLpRH9m2gPpY3fJFScUe4C5YMMThkZHwAplPvgzr2bAbUYfGVNVskqOFDz0RRKcoePpucpCmqD4KMnasuPe/oB5PsviVSPvghOstu8jTyKKtwl6MnA= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com; spf=fail smtp.mailfrom=amd.com; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b=cE/nXaO7; arc=fail smtp.client-ip=52.101.85.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=amd.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=amd.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=amd.com header.i=@amd.com header.b="cE/nXaO7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CUlvNgRTcFpDSZ7VhRSH4ntbSzgiKTIRnqVm/YammoE0bHDx6Ct3dv8lhuyaJQ3D11Dfp7A6sVYRRLHz+vQAnI5Fl0zWQZFyV/tidvCVwMvzmw587tCalesvXTAl9S2KCxSCFMy8hp7uAUkdNsrf6H+juyWC4j1+kOrhMaxcmsPMdgI28E/xrAkQMKFE8PBEYcY6ZjTNlbhrfdgdP6z4X6SH3rFH5LSgytHMVLKjFxsbpDYbiBTTYmatblfjCRlbcmSps+T5kAMDtRr6L0T/vJQHTAlEcu4a4Z6+P2Y3TdZcfPZjGFnUnw17D05FMyDI/0N2Jrlxf/bT+3oCzE5VAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BIVILeEDjDV5j/zmD6ZlHFukm8DbXC0WNdBMTnVFdBY=; b=N7bHXZrpB3ChECXh/rE3gnYrHzAisWnhu5s1mPlXP2cdczGjH3usU4f2eV5kP8aJZtPZdiqB1a1gefw8ao4Rnm5vLKm0RVMtdn80Ymb6QZDvg6lQhZe58dsLYFXpFqY6eJ+nHy1EVy4QlOcYNpwVB0pdd1al9ubEruuwVmZQJFGSFVl7cRwfjEGYN44L280i9Mwb+szgDxUhGlTi5IFDIEW5nVuVoXxYgjBqe4u+LluqOgA778hOiUl7oHz/pe7WzKe2kHKemjNOdG26OX8ZISZ9BYn+/HJj4AAfy5Qop8NZ7IDoh8olPcbOUoyvrjCR6fJsb//l20SEjyn8fwVqaQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amd.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BIVILeEDjDV5j/zmD6ZlHFukm8DbXC0WNdBMTnVFdBY=; b=cE/nXaO7Pz+iVU2Zv2kMrP+8L0C8YftdspoGIhXUZnpRP5M1dAlFO6duJUcAsiN6QgV9mrCS/uC+2rVvn6YXDMBr0aR1vi0A3T04YYpfzUCm4JFCtaW6N5LvSb0BPWVwUviMbkS1wcXS2FhQLcXkfzGhhjYbSksjYyIZEZYoWOU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=amd.com; Received: from CY8PR12MB7433.namprd12.prod.outlook.com (2603:10b6:930:53::22) by PH8PR12MB7302.namprd12.prod.outlook.com (2603:10b6:510:221::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.113.18; Mon, 15 Jun 2026 09:19:13 +0000 Received: from CY8PR12MB7433.namprd12.prod.outlook.com ([fe80::faae:d638:bdc9:4bf6]) by CY8PR12MB7433.namprd12.prod.outlook.com ([fe80::faae:d638:bdc9:4bf6%3]) with mapi id 15.21.0113.015; Mon, 15 Jun 2026 09:19:12 +0000 Message-ID: <44c996b7-e95c-4a9e-99fe-4f66aa21279e@amd.com> Date: Mon, 15 Jun 2026 11:18:58 +0200 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2] mm: page_reporting: allow driver to set batch capacity To: "Michael S. Tsirkin" , linux-kernel@vger.kernel.org Cc: Miaohe Lin , "David Hildenbrand (Arm)" , Jason Wang , Xuan Zhuo , Eugenio Perez , Muchun Song , Oscar Salvador , Andrew Morton , Lorenzo Stoakes , "Liam R. Howlett" , Vlastimil Babka , Mike Rapoport , Suren Baghdasaryan , Michal Hocko , Brendan Jackman , Johannes Weiner , Zi Yan , Baolin Wang , Nico Pache , Ryan Roberts , Dev Jain , Barry Song , Lance Yang , Hugh Dickins , Matthew Brost , Joshua Hahn , Rakie Kim , Byungchul Park , Gregory Price , Ying Huang , Alistair Popple , Christoph Lameter , David Rientjes , Roman Gushchin , Harry Yoo , Axel Rasmussen , Yuanchu Xie , Wei Xu , Chris Li , Kairui Song , Kemeng Shi , Nhat Pham , Baoquan He , virtualization@lists.linux.dev, linux-mm@kvack.org, Andrea Arcangeli , Naoya Horiguchi , Alexander Duyck References: Content-Language: en-US From: "Gupta, Pankaj" In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-ClientProxiedBy: FR0P281CA0001.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:15::6) To CY8PR12MB7433.namprd12.prod.outlook.com (2603:10b6:930:53::22) Precedence: bulk X-Mailing-List: virtualization@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY8PR12MB7433:EE_|PH8PR12MB7302:EE_ X-MS-Office365-Filtering-Correlation-Id: adeed595-09b3-4238-1b07-08decabf2a2a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|366016|1800799024|23010399003|56012099006|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: vED1dLNJHX+yQE4ZzbCuw1zAGgmOTA2gvf5UrVSKak4nQqF1a2D8YO6RgPjn9u/c3i/DV1nFSljNUdq5dQDL2BtiKSLqIoIK+wTK7ylyX2N8/0NBI45BQbcWRHREtauyCy0wTVanKLN2sQJuyrHQ/NssioiGM54iBTpH4q8jYrla7ufVpOkJvGJaz+umYq3qUh/vKpAfoYEGRPeTUXDc7MAYUp4RsPfPAALXUge3c+20OcOJ7Ksssy6KARr7V3YBWAmxK30DGfrS4zfK0kRmyViYVCz2Sw2Nxnju1FQ1jOUoovWItKUGNnoTZoq2DUYPZLLFN2ZPWw8JufJKJZXo5f2EZIN1MglOudVMjRXFNQrNxn/Wz3zREF/innutuOTCCyRQDIQwzt2BwXGwOfnTnsogIE2IecPdIr8+sOzkx2UbMQYP85+90kLLGfitPWnBjWjGpepr4jjZhz3rPLmJPqbz0QF9TQm4X4DQ8auUMFQMP4B0SuUiILdIoPvaphEvEe/dkQGbxDOqaWVMo8RntoEa/7GF/LWdJwRrbALbKJisY3KOQJHNL5srFGLyTbpGB4YbaBlQJrSwWvs2MrSozLj2y5git9L/O7IigBz1CtA7g+al6eMiFIqi3egxnWUcpLiWRu2J7mh1hd7SN/boZvgF+GjKlgi6ApoKSUXlQNGjk+F7nQz6rwyAAL8LTDn/ X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY8PR12MB7433.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(366016)(1800799024)(23010399003)(56012099006)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cXZCUnQxbU8yRkZnRHhiczVzWkhJbE5rYnhuSlNXcEpGTHFYb2YyaVg1L0o0?= =?utf-8?B?QmFoRFVobmszZ3dtenFtWmFuTTcyc3dRL1hFdjB6dHBiaTVNUDRCLzlQR1Qr?= =?utf-8?B?M2NOOXdxakQxczFzZ3dkcHRYNk5MVE9WNk5ickdZWUdlRm5nRHB3VTJYWnRE?= =?utf-8?B?c2p6SjVTdjdSVnNVSmxJa2pVYWwwKy9HKzg2NDJBNm5PQTNUcTRaUURYL3hv?= =?utf-8?B?dktkUk1mQ1pZcnZCaFZ5VGVJMGhCYTVFdW9aTkRpVS9LMHVvY2p2YjNhS0NV?= =?utf-8?B?TjFpNmZ2V1QrUC9qUTRqTXZSWFBHUTI2eHEvS3hLUzdSbDBzMjVYN3VwSzJs?= =?utf-8?B?YStiTG5OUytjWEtvUDdlQkh1Ni9RNXlZb1lRMjJxRndVb1RzK2hNeU15T2xn?= =?utf-8?B?eXB0dnZQd0pJMkhPWDR2QWQ4RU56dE5rbTJXYUNVZzIwVUFveGovMkZmT1px?= =?utf-8?B?QmxEMFM1N2ZyMklKQkNuMEt4UXpnenNnQUN4ajFTZkNFQmVjWmN3OUQ1Vk4r?= =?utf-8?B?WHVnVGp1enVqTDBrMmdZNWJZUWNhY20yQlV5Mk5TY3JhdnRzaFVnUHRXQlJW?= =?utf-8?B?NzBaMXZkU2NpWktVU3NicnhUV3BoOFZTN0xEOGxqRm1WTCt3a0FVcG9taFdY?= =?utf-8?B?a1BkT1lOUEpFdTN3SjJTOS9OMzlGQ09KMnZFWXFESWZZSXh1YkpyTVEyWURW?= =?utf-8?B?cU81MGFMb3RNd3pEWDZTSFUxUm8xWDBDNnNsUHRNa1RISFloOXFUbHFENm80?= =?utf-8?B?L01hTTBLL3E3aHNBMXROYlMyNk9VMWl5OGVQR2RVN3MrcnNQRjlFWEVBc0Nz?= =?utf-8?B?VGlka2ZMWlhJN0tKaWZQWDB4Yjg1aE5VRlR6ZEdqZXI3RG9lbllWWTZmSG1H?= =?utf-8?B?dmk0SnRNbWYyS003dFcrZjdlT3o3RUxrUVE0cmV0YnpoRGZjYmlsRU1CTVBj?= =?utf-8?B?a2VkVmVUbi80SEdaWnFtTk92YU02Vk1HT2JSVytJSzZTNXRzbXlPcFBkU00y?= =?utf-8?B?TTk3UGtyQ3NWU1puVDFhbi9PbkVCMEtXMXUyNWI0N3JDa05NWlJXRy84QkFZ?= =?utf-8?B?dm0xb0lyMTc3eDZkQVYxdU16bnJwS2NkODA0bWhUaGRnWVNDMjhxWjBYUnJE?= =?utf-8?B?ZTFkUHBUR3lNbURnSG8yNjk2VmNEUWpsVThVaGk4Q2wrdXdjKzE4cHFkZVl4?= =?utf-8?B?bkZ2Nml2WUs5Smx3ci9Vd3hSZ0pLY05rZlBLd0tJKzd1cjRNOFVoanI3RG9i?= =?utf-8?B?MmlSWkVFZVBpRVBYcEJFMGtGcXlMenpjbWZYUlNVemU2Uk9ka0doUVFRRlpo?= =?utf-8?B?WGNrZlZtWVR3NG5VbEorT09Bbk5LV012N1g0QWd0RnliVTU2RDhkUXNKYnhM?= =?utf-8?B?V0MvNi8xYVlwb2FjTTBCekloMzM2TWZsT3lYRmZGUzZzMnpWaER0Q3gzVXJx?= =?utf-8?B?UEVmaEkrTzZmYnhHeENCVDVaU1Raa3NKOGRCTXdETUJCK05WMDJLOGdNNzNH?= =?utf-8?B?YVI5Z1pvVzVhQnpIdmxkdHR1V2l4clZGTS9JaklZSmMzTjA3ZkJhdW5NWEgz?= =?utf-8?B?akRBUDZFT04zbVBKMC96SExQeW5rVS9aMTdDK1ZCMTNOaVlNMURmcVhYa3Zu?= =?utf-8?B?RmlSdHpoZ09HbDB2Y1l5ek1VcEhVWjlDZmdEVzhCRExLMG9YNGFnWGhnOFM2?= =?utf-8?B?bXNiV2lMcnU1RERTYWcrc054L1M5ZGcwdERmWG1jVnVHTFdlZWVBSE9YbnZ5?= =?utf-8?B?NUgyWUdsNldDZk4rQmg4bzBLSVR2MllTeXo0TW9SandSbDY0RDNiKzcwNVk5?= =?utf-8?B?Z3JoNEQ4UVNSQzRrdi8wSXpGb3IzdXBJTUFZZkxzL2N4clhZU2F2dnNTZVd0?= =?utf-8?B?UlpnSXRPTEFXallUcTdoWHFwNGtWUSs0RzlGbTFhbGlueHJnMTAvbjVlNmtT?= =?utf-8?B?MVhCd0ZCT3d1c3BrTUJNTFV6b2JIdmdEV1g2MjB5R25uSlg2ZU04NUZWUGNl?= =?utf-8?B?VnBmdzQycFFhaVpLSFpJKy9SNkpPUzRjNzVjMXQzbGpMNzZSVDE0QlpQQTc1?= =?utf-8?B?d2RzTVlONGxjOGtSZDRHYXFvZkJpY0FHZy9BMTJGY1V6b2xYQ25XNWtxbnVU?= =?utf-8?B?K2huRTdZZFk4MnhqYVBlV0lyWmVqL0p1ZGJOMEJWdjROY0ZHS2lHZTljclND?= =?utf-8?B?b3NsdVBhdS9QNlBySjFuTGFKUjdhQXhnazU0TXA5ank0RmFkQmJ3WWFpWXdP?= =?utf-8?B?akZkbjNqVGU2MnF4U0NoYXovZ3dqV0lNMkhrMmgwZFFBajRwSnc5b3oyRkFB?= =?utf-8?Q?Q/mj80pG2pO/ADGo+W?= X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: adeed595-09b3-4238-1b07-08decabf2a2a X-MS-Exchange-CrossTenant-AuthSource: CY8PR12MB7433.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Jun 2026 09:19:12.9052 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oyiBTfSkfBitRDL8IBso+MsuderJyyAuL99uZmc/FsYXFjs/D6kDopggieie7Jm7qNAV7ZlC6s4CpbIWv4IhMg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7302 > At the moment, if a virtio balloon device has a page reporting vq but > its size is < PAGE_REPORTING_CAPACITY (32), the balloon driver fails > probe. > > But, there's no way for host to know this value, so it can easily > create a smaller vq and suddenly adding the reporting capability > to the device makes all of the driver fail. Not pretty. > > Add a capacity field to page_reporting_dev_info so drivers can > control the maximum number of pages per report batch. > > In virtio-balloon, set the capacity to the reporting virtqueue size, > letting page_reporting adapt to whatever the device provides. > > Capacity need not be a power of two. Code previously called out > division by PAGE_REPORTING_CAPACITY as cheap since it was a power > of 2, but no performance difference was observed with non-power-of-2 > values. > > If capacity is 0 or exceeds PAGE_REPORTING_CAPACITY, it defaults > to PAGE_REPORTING_CAPACITY. The 0 check and the clamping is done in > page_reporting_register(), before the reporting work is scheduled, > so we never get division by 0. > > Fixes: b0c504f15471 ("virtio-balloon: add support for providing free page reports to host") > Signed-off-by: Michael S. Tsirkin > Assisted-by: Claude:claude-opus-4-6 > --- > Changes v1->v2: > - Document capacity=0 as default in commit log > - Document that capacity need not be a power of two > - Drop unnecessary comment about integer division cost > - Update comment on capacity field: "0 (default) means PAGE_REPORTING_CAPACITY" > > drivers/virtio/virtio_balloon.c | 5 +---- > include/linux/page_reporting.h | 3 +++ > mm/page_reporting.c | 24 ++++++++++++------------ > 3 files changed, 16 insertions(+), 16 deletions(-) > > diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c > index f6c2dff33f8a..6a1a610c2cb1 100644 > --- a/drivers/virtio/virtio_balloon.c > +++ b/drivers/virtio/virtio_balloon.c > @@ -1017,10 +1017,6 @@ static int virtballoon_probe(struct virtio_device *vdev) > unsigned int capacity; > > capacity = virtqueue_get_vring_size(vb->reporting_vq); > - if (capacity < PAGE_REPORTING_CAPACITY) { > - err = -ENOSPC; > - goto out_unregister_oom; > - } > > vb->pr_dev_info.order = PAGE_REPORTING_ORDER_UNSPECIFIED; > > @@ -1041,6 +1037,7 @@ static int virtballoon_probe(struct virtio_device *vdev) > vb->pr_dev_info.order = 5; > #endif > > + vb->pr_dev_info.capacity = capacity; > err = page_reporting_register(&vb->pr_dev_info); > if (err) > goto out_unregister_oom; > diff --git a/include/linux/page_reporting.h b/include/linux/page_reporting.h > index 9d4ca5c218a0..048578118a4b 100644 > --- a/include/linux/page_reporting.h > +++ b/include/linux/page_reporting.h > @@ -22,6 +22,9 @@ struct page_reporting_dev_info { > > /* Minimal order of page reporting */ > unsigned int order; > + > + /* Max pages per report batch; 0 (default) means PAGE_REPORTING_CAPACITY */ > + unsigned int capacity; > }; > > /* Tear-down and bring-up for page reporting devices */ > diff --git a/mm/page_reporting.c b/mm/page_reporting.c > index 7418f2e500bb..942e84b6908a 100644 > --- a/mm/page_reporting.c > +++ b/mm/page_reporting.c > @@ -173,11 +173,8 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone, > * any pages that may have already been present from the previous > * list processed. This should result in us reporting all pages on > * an idle system in about 30 seconds. > - * > - * The division here should be cheap since PAGE_REPORTING_CAPACITY > - * should always be a power of 2. > */ > - budget = DIV_ROUND_UP(area->nr_free, PAGE_REPORTING_CAPACITY * 16); > + budget = DIV_ROUND_UP(area->nr_free, prdev->capacity * 16); > > /* loop through free list adding unreported pages to sg list */ > list_for_each_entry_safe(page, next, list, lru) { > @@ -222,10 +219,10 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone, > spin_unlock_irq(&zone->lock); > > /* begin processing pages in local list */ > - err = prdev->report(prdev, sgl, PAGE_REPORTING_CAPACITY); > + err = prdev->report(prdev, sgl, prdev->capacity); > > /* reset offset since the full list was reported */ > - *offset = PAGE_REPORTING_CAPACITY; > + *offset = prdev->capacity; > > /* update budget to reflect call to report function */ > budget--; > @@ -234,7 +231,7 @@ page_reporting_cycle(struct page_reporting_dev_info *prdev, struct zone *zone, > spin_lock_irq(&zone->lock); > > /* flush reported pages from the sg list */ > - page_reporting_drain(prdev, sgl, PAGE_REPORTING_CAPACITY, !err); > + page_reporting_drain(prdev, sgl, prdev->capacity, !err); > > /* > * Reset next to first entry, the old next isn't valid > @@ -260,13 +257,13 @@ static int > page_reporting_process_zone(struct page_reporting_dev_info *prdev, > struct scatterlist *sgl, struct zone *zone) > { > - unsigned int order, mt, leftover, offset = PAGE_REPORTING_CAPACITY; > + unsigned int order, mt, leftover, offset = prdev->capacity; > unsigned long watermark; > int err = 0; > > /* Generate minimum watermark to be able to guarantee progress */ > watermark = low_wmark_pages(zone) + > - (PAGE_REPORTING_CAPACITY << page_reporting_order); > + (prdev->capacity << page_reporting_order); > > /* > * Cancel request if insufficient free memory or if we failed > @@ -290,7 +287,7 @@ page_reporting_process_zone(struct page_reporting_dev_info *prdev, > } > > /* report the leftover pages before going idle */ > - leftover = PAGE_REPORTING_CAPACITY - offset; > + leftover = prdev->capacity - offset; > if (leftover) { > sgl = &sgl[offset]; > err = prdev->report(prdev, sgl, leftover); > @@ -322,11 +319,11 @@ static void page_reporting_process(struct work_struct *work) > atomic_set(&prdev->state, state); > > /* allocate scatterlist to store pages being reported on */ > - sgl = kmalloc_objs(*sgl, PAGE_REPORTING_CAPACITY); > + sgl = kmalloc_objs(*sgl, prdev->capacity); > if (!sgl) > goto err_out; > > - sg_init_table(sgl, PAGE_REPORTING_CAPACITY); > + sg_init_table(sgl, prdev->capacity); > > for_each_zone(zone) { > err = page_reporting_process_zone(prdev, sgl, zone); > @@ -377,6 +374,9 @@ int page_reporting_register(struct page_reporting_dev_info *prdev) > page_reporting_order = pageblock_order; > } > > + if (!prdev->capacity || prdev->capacity > PAGE_REPORTING_CAPACITY) > + prdev->capacity = PAGE_REPORTING_CAPACITY; > + > /* initialize state and work structures */ > atomic_set(&prdev->state, PAGE_REPORTING_IDLE); > INIT_DELAYED_WORK(&prdev->work, &page_reporting_process); With the comment change pointed by David, Reviewed-by: Pankaj Gupta