]> exis.tech > repos - linux.git/blobdiff - mm/page_reporting.c
Merge tag 'hwmon-for-v7.2-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/groec...
[linux.git] / mm / page_reporting.c
index 7418f2e500bb481dd6c64466cc140f4a0283ac70..942e84b6908af75ff75ed400126c76b2c3962109 100644 (file)
@@ -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);