linux/drivers/md/dm-kcopyd.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2002 Sistina Software (UK) Limited.
   3 * Copyright (C) 2006 Red Hat GmbH
   4 *
   5 * This file is released under the GPL.
   6 *
   7 * Kcopyd provides a simple interface for copying an area of one
   8 * block-device to one or more other block-devices, with an asynchronous
   9 * completion notification.
  10 */
  11
  12#include <linux/types.h>
  13#include <linux/atomic.h>
  14#include <linux/blkdev.h>
  15#include <linux/fs.h>
  16#include <linux/init.h>
  17#include <linux/list.h>
  18#include <linux/mempool.h>
  19#include <linux/module.h>
  20#include <linux/pagemap.h>
  21#include <linux/slab.h>
  22#include <linux/vmalloc.h>
  23#include <linux/workqueue.h>
  24#include <linux/mutex.h>
  25#include <linux/device-mapper.h>
  26#include <linux/dm-kcopyd.h>
  27
  28#include "dm.h"
  29
  30#define SUB_JOB_SIZE    128
  31#define SPLIT_COUNT     8
  32#define MIN_JOBS        8
  33#define RESERVE_PAGES   (DIV_ROUND_UP(SUB_JOB_SIZE << SECTOR_SHIFT, PAGE_SIZE))
  34
  35/*-----------------------------------------------------------------
  36 * Each kcopyd client has its own little pool of preallocated
  37 * pages for kcopyd io.
  38 *---------------------------------------------------------------*/
  39struct dm_kcopyd_client {
  40        struct page_list *pages;
  41        unsigned nr_reserved_pages;
  42        unsigned nr_free_pages;
  43
  44        struct dm_io_client *io_client;
  45
  46        wait_queue_head_t destroyq;
  47        atomic_t nr_jobs;
  48
  49        mempool_t *job_pool;
  50
  51        struct workqueue_struct *kcopyd_wq;
  52        struct work_struct kcopyd_work;
  53
  54/*
  55 * We maintain three lists of jobs:
  56 *
  57 * i)   jobs waiting for pages
  58 * ii)  jobs that have pages, and are waiting for the io to be issued.
  59 * iii) jobs that have completed.
  60 *
  61 * All three of these are protected by job_lock.
  62 */
  63        spinlock_t job_lock;
  64        struct list_head complete_jobs;
  65        struct list_head io_jobs;
  66        struct list_head pages_jobs;
  67};
  68
  69static struct page_list zero_page_list;
  70
  71static void wake(struct dm_kcopyd_client *kc)
  72{
  73        queue_work(kc->kcopyd_wq, &kc->kcopyd_work);
  74}
  75
  76/*
  77 * Obtain one page for the use of kcopyd.
  78 */
  79static struct page_list *alloc_pl(gfp_t gfp)
  80{
  81        struct page_list *pl;
  82
  83        pl = kmalloc(sizeof(*pl), gfp);
  84        if (!pl)
  85                return NULL;
  86
  87        pl->page = alloc_page(gfp);
  88        if (!pl->page) {
  89                kfree(pl);
  90                return NULL;
  91        }
  92
  93        return pl;
  94}
  95
  96static void free_pl(struct page_list *pl)
  97{
  98        __free_page(pl->page);
  99        kfree(pl);
 100}
 101
 102/*
 103 * Add the provided pages to a client's free page list, releasing
 104 * back to the system any beyond the reserved_pages limit.
 105 */
 106static void kcopyd_put_pages(struct dm_kcopyd_client *kc, struct page_list *pl)
 107{
 108        struct page_list *next;
 109
 110        do {
 111                next = pl->next;
 112
 113                if (kc->nr_free_pages >= kc->nr_reserved_pages)
 114                        free_pl(pl);
 115                else {
 116                        pl->next = kc->pages;
 117                        kc->pages = pl;
 118                        kc->nr_free_pages++;
 119                }
 120
 121                pl = next;
 122        } while (pl);
 123}
 124
 125static int kcopyd_get_pages(struct dm_kcopyd_client *kc,
 126                            unsigned int nr, struct page_list **pages)
 127{
 128        struct page_list *pl;
 129
 130        *pages = NULL;
 131
 132        do {
 133                pl = alloc_pl(__GFP_NOWARN | __GFP_NORETRY);
 134                if (unlikely(!pl)) {
 135                        /* Use reserved pages */
 136                        pl = kc->pages;
 137                        if (unlikely(!pl))
 138                                goto out_of_memory;
 139                        kc->pages = pl->next;
 140                        kc->nr_free_pages--;
 141                }
 142                pl->next = *pages;
 143                *pages = pl;
 144        } while (--nr);
 145
 146        return 0;
 147
 148out_of_memory:
 149        if (*pages)
 150                kcopyd_put_pages(kc, *pages);
 151        return -ENOMEM;
 152}
 153
 154/*
 155 * These three functions resize the page pool.
 156 */
 157static void drop_pages(struct page_list *pl)
 158{
 159        struct page_list *next;
 160
 161        while (pl) {
 162                next = pl->next;
 163                free_pl(pl);
 164                pl = next;
 165        }
 166}
 167
 168/*
 169 * Allocate and reserve nr_pages for the use of a specific client.
 170 */
 171static int client_reserve_pages(struct dm_kcopyd_client *kc, unsigned nr_pages)
 172{
 173        unsigned i;
 174        struct page_list *pl = NULL, *next;
 175
 176        for (i = 0; i < nr_pages; i++) {
 177                next = alloc_pl(GFP_KERNEL);
 178                if (!next) {
 179                        if (pl)
 180                                drop_pages(pl);
 181                        return -ENOMEM;
 182                }
 183                next->next = pl;
 184                pl = next;
 185        }
 186
 187        kc->nr_reserved_pages += nr_pages;
 188        kcopyd_put_pages(kc, pl);
 189
 190        return 0;
 191}
 192
 193static void client_free_pages(struct dm_kcopyd_client *kc)
 194{
 195        BUG_ON(kc->nr_free_pages != kc->nr_reserved_pages);
 196        drop_pages(kc->pages);
 197        kc->pages = NULL;
 1e="L{vers/mda href="+code=next" class="sref">next */
 140 159        struct2/a>      2 
      
ZE" class="sref">PAGE_SIZE)) 32sref">pl<2a>); 32sux/slab.hopyd.c#L101" id="L101" c2ass="2ine" name="L101"> 101 32sloc.hrivers/md/dm-kcopyd.c#L123" id2"L103" class="line" name="L103"evsran c57">an do> 168/* 37 * pages for kcopyd io.nr_res=" hrefnt_free_pages(struct dm_kcopyd_client<2a> *<20="+code=drop_c#L192" id="L192" class="line" name="L192"> 192 linuxL26"> 26="+code=page_list" class2"sref2>page_list *list_head 68 next" class="srelagline" name="L198elagl"> 68 p21ine" name="L159"> 159 struct2a>; 166} 111 2 21yd.c#L100" id="L100" class= * Err" iL191="driver0" iL168"> 168/* 2 101 * pages for kcopyd io.nr_free_pageent. 68 next" class="srwriteeer * 68 free_pl2ne2 166} 26="L117"> 117 2 21"drivers/md/dm-kcopyd.c#L77" * Eiverr READ " iWRITEine" name="L166"> 166} 167 * pages for kcopyd io.> 68 gfp_t 192 list_head 192 68 190 2nux/slab.hh> 166} 22L103" class="line" name="L10 * Ter0 naminam-kcop8" id="LtransferL168"> 168/*> * pages for kcopyd io.kcopyd_get_href="+code=dm_kcopyd_client"um_ namline" name="L198"um_ naml"> 68 192 list_head [ef">list_head ]68 266#include < 27 8" cl22page_list *pl) 159 struct2a href="d2ivers/md/dm-kcopyd.c#L132" id=23id="L109" claL166" id="L166" class="line" name="L166"> 166} 166} 101 103 168/* = * pages for kcopyd io. * 192 list_head 192 )) { } 136 2 23" id="L165" class="line" name="L165"> 12-kcopyd.c2L137" id="L137" class="l2ne" n2me="L137"> 137L166" id="L166" class="line" name="L166"> 166} 167 166} /*-artsL168"> 168/* * pages for kcopyd io.kc<2a>->} list_head 62 */ 142 2 2 +code=wait_queue_head_t" class="sref">wait_queue_hsub href="+code=io_jobssub hrefclass="comment"> */ wait_queue_hsectorf="drivers/md/dm-kectorf=="sref">wait_queue_hprogres } */ pl<2a>; <2 href="drivers/md/dm-kcopyd.c#L144" id="2144" clas2="line" name="L144"> 1442/a> 24ne" name="L65"> 65 struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1masterss="es" class="srefmasterss="class="comment"> */ 66 struct 47 27" class=2line" name="L147"> 147 192 192 */ out_of_memory2/a>: 2s="line" name="L49"> 49 1502 list_head 193static void pages);2dm_kcopyd_client * 151 2 25 192 pl; 192 "">nr_res=""class="e" name="L125"> 125static int <2f">ENOMEM2/a>; 65 struc#L76"ss="es" class="sref">nr_res=" hre) *r 125static int <2fmd/dm-kc2opyd.c#L153" id="L153" c2ass="25e" name="L134"> 134 href="+s" class="sref"s_alignof__"drivers/md/dm-__alignof__opyd.c#L192" id="L192" clasc#L76"ss="es" class="sref">nr_res=" hre), 0sref">nr_pagespages); /* 192 193static void * These three functio2s res25; drop_pages( 157<2a>static void 47 2ct .m_kcopyd_client"2" class="line" name="L182"> copyd.c#L73" id="L73opyd.c#L68" id="L68" class="line" name="L68"> 68 .m_kcopyd_clientdrivers/md/dm-kcopyd.c#L86" id="L86" class="lZERO_PAGEers/md/dm-kcopyZERO_PAGEopyd.0md/dm-kcopyd.c#L196" id="L196" class2p26130" class="line" name="L130"> 130 2="L160" c2ass="line" name="L160"> 260pl); 2lass="lin2" name="L162"> 162 2 26a href="drivers/md/dm-kcopyd.c#L122" id=2="drivers2md/dm-kcopyd.c#L163" id=2L163"26 } while ( 193static void dm_kcopyd_client *; 192 pl); 2l7"> 157<2 } page_list * 192 pl; pages); 69static struct
class="comment"> * pages for kcopyd io.(struc2 * pages for kcopyd io.kc2 unsi27ne" name="L101"> 101 168/*2172 * pages for kcopyd io. 65 struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1popers/md/dm-kcopydopopyd.c#L192" id="L192" clasct 125static int <2pl = 2a href="+code=NULL" clas2="sre27">kcopyd_get_pages(struct 192 193static void i2/a> =27code=nr" class="sref">nr, struct 177 *nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href">pl; pages); GFP_KERNEL); next" class="srelagline" name="L198elagl"> 68 next) { 69static struct 180 f">wait_queue_hspin_pan _irqsave192"> 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 2ss="sref"2pl); 81 2> 2 return -<2 href2"+code=ENOMEM"xt = reead" empt4>__GFP_NORETRY); 183 2 2 pl; reead" ent14>nr_res=" hree>next" class="srid="L173" class="li"L68"> nf="+code=pl" class="sref">pl); 2sef="+cod2vers/md/dm-kcopyd.c#L1842 id="2>gfp); nf="+code=pl" class="sref">pl); 2sl = 2f="+code=pl" class="sref2>plkcopyd_get_> 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 2s"> 177 47 2ne" name=2L188"> 188 pl); 2yd_put_pa2es( 992a href="d2ivers/md/dm-kcopyd.c#L182" id=29130" class="line" name="L130"> 130 2 href="dr2vers/md/dm-kcopyd.c#L1902 id="2190" cL191" id="L191" class="linepushers/md/dm-kcopydushopyd.c#L192" id="L192" clasct *nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" hrename="L193"> 193static void next" class="srelagline" name="L198elagl"> 68 c#L192" id="L192" class="line" name="L192"> 192 pl; linut;ne2"line" na2e="L196"> 196 2 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 2197" clas2="line" name="L197"> 1972/a> 2 e>next" class="srhref="+code=io_jobshrefclasff="+code=pl" class="sref">pl); 21e" name=252" class=64o*4g6r4comme2t"> *2href="+code=__free_page" classpin_unpan _irqrnamore192"> 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 3e" name="3140"> 140 993/a> 3 kfree(pl<3a>); 81 3sux/slab.3opyd.c#L101" id="L101" c3ass="30yd.c#L191" id="L191" class="linedusha href="+code=list_hdusha hreopyd.c#L192" id="L192" clasct *nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" hrename="L193"> 193static void client_free_pages(struct next" class="srelagline" name="L198elagl"> 68 65 strus="line" name="L192"> 192 pl; lin3nt" class3"sref">dm_kcopyd_client<3a> *<30" id="L165" class="line" name="L165"> 13xL26"> 23="+code=page_list" class3"sref30 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 3rs/md/dm-3copyd.c#L108" id="L108" 3lass=30ref="+code=__free_page" clasead" add e>next" class="srhref="+code=io_jobshrefclasff="+code=pl" class="sref">pl); 3p310ef="+code=__free_page" classpin_unpan _irqrnamore192"> 192 73 62next" class="srelagline" name="L198elagl"> nf="+code=pl" class="sref">pl); 3a>; 189 <3lass="lin3" name="L111"> 111 3 31class="line" name="L81"> 81 3next 3 101 class="comment"> * pages for kcopyd io. * pages for kcopyd io. 153 168/*free_pl3 168/* 168/* 23="L117"> 117 3 31"drivers/md/dm-kcopyd.c#L77"*="L1750: err" 168"> 168/* 167 168/*> _0: cand="L1tpprocess ye8L168"> 168/*> * pages for kcopyd io.> nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" hrename="L193"> 193static void > > } pl; > f">pl; 68 kcopyd_get_href="+colo7">next" class="srwriteeer * f">pl; 68 192 list_head 192 pl; 192 236#include < * 192 pl; lin3 class="l3ine" name="L27"> 2738" cl32code=kcopyd_put_pages" class="sref">kco3uct kc->kc-> name="L193"> 193static void 180 id="L192" clasc#L76"served_pages" class="sref">nr_reserved_pages += nr_pageskc->pl); 3 * 101 class="comment"> * pages for kcopyd io. 101 * pages for kcopyd io. 168/* * pages for kcopyd io.)) { nr_pages 193static void 136 3 33; i += nr_pages 73 62pl); 3 L26"> 23L137" id="L137" class="l3ne" n33 192 += sref">nr_pages sref">nr_pages} pl); 3 class="l3rivers/md/dm-kcopyd.c#L138" id33code=kcopyd_put_pages" class="sref">kco3 73 193static void 180 id="L192" claswake_upers/md/dm-kcopywake_upopyd.copyd.c#L73" id="L73" class="line" name="L73"> 73 < namro4q192"> 192 pl); 3sref">kc<3a>-> 81 3s="line" 3ame="L142"> 142 3 3 pl); 3s> = 189 <3smd/dm-kc3ode=pl" class="sref">pl<3a>; <3 href="drivers/md/dm-kcopyd.c#L144" id="3144" clas3="line" name="L144"> 1443/a> 346d.c#L191" id="L191" class="liness="commsio1} next" class="srerr" 1} 193static void nr, struct *nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href">.c#L192" id="L192" clasc#L76"ss="es" class="sref">nr_res=" hrefd)ref">nr_pages} pl); 3sclass="l3line" name="L147"> 147 * 192 pl; lin3memory" c3ass="sref">out_of_memory3/a>: 3s="line" name="L49"> 49 1503 } __GFP_NORETRY); pages);3nr_pages =">pl; 193static void 151 3 35 |">pl; } lin3m> = ; lin3mmd/dm-kc3opyd.c#L153" id="L153" c3ass="35e" name="L134"> 134 pl; f">1e/linux/mempool.h" class="fref">lin3m44" clas3t">/* ne3d * These three functio3s res35; = += n">__GFP_NORETRY); static void nea> pl; 73 } nr_pagespl); 3ct += pl); 3rs/md/dm-3copyd.c#L159" id="L159" 3lass=36ivers/md/dm-kcopyd.c#L179" id, pl); 3r 1503code=page_list" class="s3ef">p36"> 180 class="line" name="L189"> 189 <3="L160" c3ass="line" name="L160"> 360 189 <3=lass="li3" name="L162"> 162 3 36a hrelass="line" name="L189"> 189 <3=> = =">pl; 193static void ); 73 } nr_pagespl); 3 ne3; __GFP_NORETRY); 157<3 } ne178" class="lins="es" class="srefs=" hrecopyd.c#L182" id="L1rw * =>pl; pl); 3 t 73 } nr_pagespl); 3n> 189 <3ate and r3serve nr_pages for the u3e of 37ef">kfree((struc3 += pl); 3/ass="lin3=kc" class="sref">kc3 unsi37a href="drivers/md/dm-kcopyd.c#L122" id=3d="L172" 3lass="line" name="L172">3172 class="comment"> * pages for kcopyd io. = 3a href="+code=NULL" clas3="sre37/dm-kcopyd.c#L155" id="L155" Requeid> * pages for kcopyd io.; i3/a> =37>< class="line" name="L103"a*-articular0" iL168"> 168/* 177 * pages for kcopyd io.GFP_KERNEL); nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" hrename="L193"> 193static void next) { 6__GFP_NORETRY); 180 ent. pl); 3ss="sref"3pl); 192 73 } =>__GFP_NORETRY); pl; e" name="L125"> 125static int <3lass="lin3" name="L183"> 183 3 3 pl; e" name="L125"> 125static int <3lef="+cod3vers/md/dm-kcopyd.c#L1843 id="3>gfp); 62pl; kc-> 125static int <3ll = 3f="+code=pl" class="sref3>plkcopyd_get_pages 192 0e" name="L125"> 125static int <3l/a>; 192 pl; 125static int <3l"> 177ne.m_kcopyd_client"otify="+code=io_jobsnotify .m_kcopyd_clientcontexi1} pl; 125static int <3l class="3L188"> 188 192 pl; 73 192 125static int <3yd_put_pa3es(pl); 3a href="d3ivers/md/dm-kcopyd.c#L183" id=39130" class="line" name="L130"> 130 3 href="dr3vers/md/dm-kcopyd.c#L1903 id="39 se="L178" class="lins="es" class="srefs=" hrecopyd.c#L182" id="L1rw * =">pl; 193static void pl; 192 , 1srcopyd.c#L73" id="L73s="es" class="srefs=" hrecopyd.c#L182" id="L1source192"> 192 sref">nr_pagespages); lin3ode=dm_kc3pyd_client" class="sref"3dm_kc39gfp); pl; 192 , .c#L73" id="L73s="es" class="srefs=" hrecopyd.c#L182" id="L1"um_ namline" name="L198"um_ naml"> , .c#L73" id="L73s="es" class="srefs=" hrecopyd.c#L182" id="L1 namline" name="L198 naml"> sref">nr_pagespages); = 3"+code=nr_free_pages" cl3ss="s39 = ne3"line" na3e="L196"> 196 3pl); 3197" clas3="line" name="L197"> 1973/a> 3 *39code=kcopyd_put_pages" class="sref">kco4e" name="4140"> 140 nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" hrename="L193"> 193static void 4 k__GFP_NORETRY); pl<4a>); pl); 4sux/slab.4opyd.c#L101" id="L101" c4ass="40 pl; += [0].m_kcopyd_clientcou"L192"> 192 sref">nr_pages _9md/dm-kcopyd.c#L196" id="L196" class4sloc.hpl; nr_regeved_pages" class="sref">nr_regeved_pagges += nr_pageskc->pl); 4 * back t4 the system any beyond t4e res40ne" name="L65xt = __GFP_NORETRY); dm_kcopyd_client<4a> *<40; * pages for kcopyd io. 24="+code=page_list" class4"sref40next" class="sref">ne178" class="linpushers/md/dm-kcopydushopyd.copyd.c#L73" id="L73s="es" class="srefs=" hrecopyd.c#L182" id="L1id="L193" class="line" 3"> 73 } nr_pagespl); 4rs/md/dm-4copyd.c#L108" id="L108" 4lass=40rivers/md/dm-kcopyd.c, pl); 4p410a href="drivclass="line" name="L189"> 189 <4a>; 130 4lass="lin4" name="L111"> 111 4 41 se="L178" class="linr *dname="L193"> 193static void 4 < id="L104" class="lin> icand="L1tp"o="comm now"* class="comment"> * pages for kcopyd io.lin4free_pl4pl); 4 189 <4aL26"> 24="L117"> 117 4 41class="line" name="L47"> 47 4 167 class="comment"> * pages for kcopyd io.> asopossible. R"L91"snd="Laou"L">ass="comment"> * pages for kcopyd io.; > 168/*> * pages for kcopyd io.> * 192 125static int <4lloc.h> 192 .c#L192" id="L192" clasc#L76"ss="es" class="sref">nr_res=" hrefd)name="L193"> 193static void > ); 65 struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=pl" class="sref">pl); 4x > nr_pages 192 f">0f="+code=pl" class="sref">pl); 4xL26"> 246#include < 47 4 class="l4ine" name="L27"> 2748" cl42rivers/md/dm-while (/a> += pl; __GFP_NORETRY); 49 180 id="L192" clasr *pl; 192 += pl); 4 * 81 4 ux/slab.4f="drivers/md/dm-kcopyd.4#L13143 __GFP_NORETRY); * pages for kcopyd io. 134 e="L178" class="lins="es" class="srefs=" hrecopyd.c#L182" id="L1rw * =">pl; 193static void )) { kcopyd_get_pages(struct = .href="+colo7") -1Lf="+code=pl" class="sref">pl); 4 136 4 43; lin4 L26"> 24L137" id="L137" class="l4ne" n43next" class="sref">nea> f">1e/linux/mempool.h" class="fref">lin4 class="l4rivers/md/dm-kcopyd.c#L148" id43rivers/md/dm-kcopyd.c#L178" i id="L192" claspushers/md/dm-kcopydushopyd.copyd.c#L73" id="L73" class="line" name="L73"> 73 } nr_pagespl); 4 pl); 4 href="d4L140" class="line" name=4L140"44"> 180 class="line" name="L189"> 189 <4sref">kc<4a>-> 81 4s="line" 4ame="L142"> 142 4 44 __GFP_NORETRY); * pages for kcopyd io.pl<4a>; <44#L104" id="L104" class="line * W"Laouldnd="L1tpserviceid=hre" inATMe> oclass="comment"> * pages for kcopyd io. 1444/a> 44/dm-kcopyd.c#L155" id="L155" * pushed=hre" inbacknon 168/* * pages for kcopyd io.nea> pl; kcopyd.c#L193" s="es" class="srefs=" hrenf="+code=pl" class="sref">pl); 4 class="l4line" name="L147"> 147 pl); 4memory" c4ass="sref">out_of_memory4/a>: 45ivers/md/dm-kcopyd.c#class="line" name="L189"> 189 <4> 1504 130 4de=pages"4class="sref">pages);4nr_pages 192 ++f="+code=pl" class="sref">pl); 4m="line" 4e" name="L151"> 151 4 45 189 <4>> = ; 192 f="+code=pl" class="sref">pl); 4m* back t4t">/* 189 <4> * These three functio4s res45" id="L165" class="line" name="L165"> 14d href="d4a>static void class="comment"> * pages for kcopyd io. 167 168/* * pages for kcopyd io.4code=page_list" class="s4ef">p46"> 18L191" id="L191" class="linedo_worame="L62"> 62 62 193static void 460); 162 4 46 192 pl; r_of192"> 192 r_ofopyd./dm-kcopyd.c#L1worame="L62"> 62 125static int <4=> = 192 62pl); 4 href="dr4vers/md/dm-kcopyd.c#L1644 id="46yd_clientc#L192" id="L192" clasblk_plugme="L62"> 62; 62pl); 4 * back t4f="+code=pl" class="sref4>plne4; class="comment"> * pages for kcopyd io. 157<4 } 168/* 167 168/* 168/*4serve nr_pages for the u4e of 47bs that have completed. 168/*L168"> 168/*kc4 unsi47ne" name="L101"> 101 * pages for kcopyd io.4172 62 62pl); 4ref="+cod4=page_list" class="sref"4page_47ne" name="L11pl; 73 } nr_pagesnr_pagespl); 4r* back t4a href="+code=NULL" clas4="sre476e" name="L11pl; 73 <kc->nr_pagesnr_pagespl); 4r i4a> =34f="+code=drop_pages" class="sa href="d="91} 73 <nr_pagesnr_pagespl); 4r 1_plufinishL62"> 62d.c#L73" id="L73plugme="L62"> 62pl); 4ref="+cod4opyd.c#L1KERNEL); 189 <4> ) { 49 * pages for kcopyd io. 157<3pl);4 * pages for kcopyd io. 157<3=kc" clas return -<3 href38 4 101 ass=py, o">arwimd/dmcl8">has hrb hrpl"> upan> ofsranmment"> * pages for kcopyd io. 157<3lass="lin183"> 183 3 3 4 <48ss="line" name="L103"ef="drive> 168/* 153 * pages for kcopyd io.plnr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=3"> 193static void nr, struct * 192 pl; lin3 class="43L188"> 148 73 <lin3 class="43es(<4 href="+code=kc3 clas3904 href49pagee="L178" class="lint" clasdeunlikelio_jobsnotify unlikelid.c#Lref="+cr ass="srefs=" hrecopyd.c#L182" id="L1source192"> 192 sref">nr__clientcou"L192"> 192 sref">nr_93"> 193static void id="L192" clasr d/dm-kcopydushopyd.copyd.c#L73" id="L73" class="line" name="L73"> 73 } nr_pagespl); 4 kc-> name="L193"> 193static void 73 } nr_pagespl); 3n> lin3ode=dm_k43pyd_clie4t" class="sref"3dm_kc39g4p4; 73 kc->nr_pagespl); 3n> ; += pl); 3/ass="li43e="L196"4 196 3 189 <4aL26"> 23="line" 4ame="L197"> 1973/a> 3 4 47 4 class="l352" clas4=64o*4g6r4comme3t"> *39c4de=kc49se ent. eg" inss="opydn= f">pl,olo7">next" class="srwriteeer * f">plL125"> 125static int <4=> = 145 193static void k__5FP_NORETRY); pl54a>); * pages for kcopyd io.; ; <=pl" class="sref">pl); 4xL26"> 54rivers/m5/dm-kcopyd.c#L143" id40 5 } 50href id="L192" clasblk_L19rtsector_a href="ontexis=sector_aa>; f">0f="+code=pl" class="sref">pl); 4xL26"> 54 c#L192" id="L192" clasblk_plugm" hrefd/dm="sref">nr_res=" hrefd/dm-kcopyd.c#L1s="es" clsubd/dm="sref">nr_res=subd/dm="+codeid="L192" clasc#L76"ss="es" class="sref">nr_res=" hrefd)ref">nr_pages} pl); 3sclass="54 the sys5em any beyond t4e res40n5" nam50"L65"> 65 struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=; nr_res=subd/dm="+c182" id="L1masterss="es" class="srefmasterss="clas =">plpl); 3sclass="547the sys5e196 3 192 pl; lin3 class="54="+code=5age_list" class4"sref40n5xt" c50ne" name="L47"> 47 4 class="54copyd.c#5108" id="L108" 4lass=40r5vers/50e=__free_page" clasead" add mu="+_loc> 62d.c#L73" id="L73" class="ass="srefs=" hrecopyd.c#L182" id="L1id="L193"loc> 62d.c#=pl" class="sref">pl); 3/ass="li54code=pag5_list" class="s4ef">p4105 href51ame="L49"> 49 * pages for kcopyd io. 111 4 41<5a> 5 se="L178" class="linr * f">pl3"> 193static void < id="L104="L73" class="ass="srefs=" hrecopyd.c#L182" id="L1id="L193" * f">1e/linux/mempool.h" class="fref">lin4 class="54code=nr_5ree_pages" clas4="sre41 5 <51ile ( f">pl3"> 193static void free_pl4(struct 4="L73" class="ass="srefs=" hrecopyd.c#L182" id="L1id="L193" * |">pl; |">pllin4 class="547the sys5l" class="sref"4pl 14d href="54="L117">5117 4 41c5ass="518 sent. * pages for kcopyd io. 167 class=">(struct * Only diL10tc8"more f="+ cla">are>haserviceidbeen 167rerog8/* &5t; * pages for kcopyd io.>5 f">1e/linu73" i73" i ref="+cr ass="srefs=" hrecopyd.c#L182" id="L1source192 * f">pl3 || * pages for kcopyd io.> nid="L1source192drivers/md/dm-teid_bi=s="s/a> += n">__GFP_NORETRY); >5 < id="L104" class="lin> icand="L1tass=dmcln"+c chunks fuf="+ *omment"> * pages for kcopyd io. 42 5 <5 href="+code= sea hrefplugme="L6rogresa href=processss="9gresa; krogresa href=processss="9gresaempool.h" class="fref">lin4 class="54eue.h f">0f="+codeef="+cr ass="srefs=" hrecopyd.c#L182" id="L1source192"> 192 sref">nr__clientcou"L192"> 192 sref">nr_ -ea hrefplugme="L6rogresa href=processss="9gresaempool.h" class="fref">lin4 class="54 the sys5ivers/md/dm-kco4s="sr42n5" nam52get_pages(struct class="linr > 192 sref">nr_9RETRY); sref">nr___GFP_s="linr SUB_JOB *3"> 193static void #in5lude <nea> 192 f">0f="+codeef="+cr SUB_JOB *empool.h" class="fref">lin4 class="54copyd.c#5="L27"> 2748" cl42r5vers/52yd_put_pages" class="sref">kco4e" name=54f="+code5page_list" clas4="sre43=5line"53dm-kcopyd.c#L179" idbrrikf="+s="lins="es" class="srefs=" hrecopyd.c#L182" id="L1s="sref">krogresa href=processss="9gresa + r_o192 f="+code=pl" class="sref">pl); 4m* back 54ivers/md5dm-kcopyd.c#L134" id=43"5 180<5a> id="L192ne" name="L189"> 189 <4aL26"> 54href="+c5de=pages" class4"sref43c5ass="53drivclass="line" name="L189"> 189 <3=lass="l54f="drive5s/md/dm-kcopyd.4#L13143 5 62d.c#=pl" class="sref">pl); 3/ass="li54ef="+cod5=alloc_pl" clas4="sre43 5 <53ile ( sref">nr_9RETRY); ))5{ (struct n> pl); 4m* back 547the sys5136 4 43;5 14d href="54L137" id5"L137" class="l4ne" n43n5xt" c5ass="sref">nea> yd.c#L1s="es" clsubd/dm="sref">nr_res=subd/dm="+codeyd.c#L1s="es" class="srefs=" href="+code=pl" class="sref">pl); 4x nr_res=subd/dm="+c182" id="L1masterss="> 192 sref">nr__clientcou"L192"sector href="ontexis=sector + r6rogresa href=processss="9gresaempool.h" class="fref">lin4 class="54="+code=5c" class="sref"4kcnr_res=subd/dm="+c182" id="L1masterss="> 192 sref">nr__clientcou"L192"> 192 f">0f="+codeef="+cr _o192 f="+code=pl" class="sref">pl); 4m* back 54L140" cl5ss="line" name=4L140"44"5 180<54s="line" name="L130"> 130 4de=pages54a>-><5 href="+code=nr4free_44c5ass="54L181" id="L1ef">nr_paps="ss="linr i href=ioss="9ss=ode=ode=p , .c#L73"p); 142 4 44 5 nr_res=subd/dm="+c182" id="L1masterss= name="L198 naml"> [0].m_kcopa hrefrriveer i href=ioss="9ss=ode=d_clientcou"L192"sector href="ontexis=sector + r6rogresa href=processss="9gresaempool.h" class="fref">lin4 class="54ef="+cod5copyd.c#L143" i4="L1444 5 <5 href="+code= s< id="L104 hrefs="es" clsubd/dm="sref">nr_res=subd/dm="+c182" id="L1masterss= name="L198 naml"> [0].m_kcopa hrefrriveer i href=ioss="9ss=ode=d_clientcou"L192"> 192 f">0f="+codeef="+cr _o192 f="+code=pl" class="sref">pl); 4m* back 54pyd.c#L15lass="sref">pl<4a>; <44#5104" 54 189 <3=lass="l54="line" 5ame="L144"> 1444/a> 44/5m-kco54f="+code=next" class="sref">ne4; nr_res=subd/dm="+c182" id="L1masterss=92 pl; eg" inss="opydn= pl); 4m* back 54L137" id5dm-kcopyd.c#L144" id=44n5xt" c5ass="sref">nea> p4 hrefs="es" clsubd/dm="sref">nr_res=subd/dm="+c182" id="L1masterss=/a>} pl; nr_res=subd/dm="+cpl" class="sref">pl); 4m* back 54rivers/m5e="L147"> 147 nr_res=subd/dm="+c=pl" class="sref">pl); 3/ass="li54ass="sre5">out_of_memory4/a>: 45i5ers/m55ame="L49"> 49 } P_NORclass="lins="es" clc_and_tdec_and_t192 subd/dmeGFP_NORETRY); pages);4 81 4s="line"54e" name=5L151"> 151 4 45 5 * pages for kcopyd io.; ass="opydiona whea>/* * pages for kcopyd io. ass="opydionsednhre*vsrymment"> * pages for kcopyd io.ar8/* class=" *1mment"> * pages for kcopyd io. 167 asswhea>are>becausinATMemment"> * pages for kcopyd io./* p46"5 18L156ave completed. * pages for kcopyd io. 460nr_pages 73 } nr_pagespl); 4 162 4 46 5 pl); 3/ass="li54md/dm-kc5pyd.c#L163" id=4L163"46 5 <5 href="+code= ne" name="L189"> 189 <3=lass="l54vers/md/5m-kcopyd.c#L1644 id="46y5_clie5tcne" name="L189"> 189 <3=lass="l54="line" 5pl" class="sref4>plne4; * pages for kcopyd io./* 167 * pages for kcopyd io.d/dm="sref">nr_res=spl">d/dm= struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1s="es" cl"es" class="srefmasterss="clas =">pl 193static void ); pl54 pl); 4m* back 54=kc" cla5s="sref">kc4 unsi47n5" nam5="L101l" class="sref">pl); 4m* back 54md/dm-kc5e" name="L172">4172pl 73 lin3 class="54=page_li5t" class="sref"4page_47n5" nam57vers/md/dm-kcopyd.c#L144" id="4<* back 54a href="5code=NULL" clas4="sre4765" nam5="L11pl; subd/dmeGFP_pageslin3 class="54ref="dri5 class="sref">i4a> =34f=5+code5drop_pages" clps="ss="linr i href=ioss="9ss=ode=ode=p); nea> p4 hrefs="es" cl"es" class="srefmasterss="clas =">plpl); 3sclass="54opyd.c#L5KERNEL); eg" inss="opydn= lin3 class="53s="sref"5next) { 189 <4a>; 189 <4a>; 81 4s="line"53=kc" cla5 return -<3 href38 5 struc#L76"ss=name="L192"> 192 promme="Lame="L81"> 81 4s="line"53md/dm-kc5183"> 183 3 3 5 <58href="+code= s< idlo7">nextn> , .c#L73"Ll="+code=pl" cs="line" namio_region [0].m_kcoLame="L81"> 81 4s="line"53=page_li5m-kcopyd.c#L1843 id="3>g5p58L134"> 134 e="Llo7">nextn> n">__GFP_pages rivers/md/notify_92134">id="L1masterss=92 pl,+-kcopyd.c#L1contexi1} 193static void ); nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=pl" class="sref">pl); 4x 47 4 class="53L188"> 158 * pages for kcopyd io.(<5 href="+code=kc3 clas3905 href59class="line" name="""""""""3"Pa hrps="Alloca allc arrays fu wake"snsistisib fuon3 malas "+cmment"> * pages for kcopyd io. 15753ivers/md5dm-kcopyd.c#L183" id=39150" cl59ave completed./* * pages for kcopyd io.lin3 class="53=client_5ree_pages" clas3="sre39 5 <59ile (5; * pages for kcopyd io./* 3 * pages for kcopyd io. 1973/a> 3 5 1ass="srefs=" hrecopyd.c#L182" id="L1id="L193" class="line" e/linux/m; lin3 class="5352" clas5=64o*4g6r4comme3t"> *39c5de=kc59e=__free_page" clasead" add ass="srefs=" hrecopyd.c#L182" id="L1elagline" name="L198elagl"> n">__GFP_; 19name="L198elagl"> n">__GFP_empool.h" class="fref">lin3 class="64140"> 146 f">1e/linux/=pl" class="sref">pl); 4xL26"> 64 k__601m-kcopyd.c#L" clasead" add ass="srefs=" hrecopyd.c#L182" id="L1elagline" * = .href="+c=pl" class="sref">pl); 4xL26"> 642 81 4s="line"64opyd.c#L601" id="L101" c4ass="40 6 , .c#L73"; 1ine" name="L198"um_ naml"> , .c#L73"pame="L81"> 81 4s="line"644pyd.c#L60ee_pages" clas3="sre39 6 } 60href id="L192" clasblk_L19rt"emc/m* [0].m_kcoLages [0].m_kcoLasizeofc#L193" fn192"> 1rname="L198 naml"> [0].m_kco) * a hreffn192"> 1ine" name="L198"um_ naml"> , .c#L73"9empool.h" class="fref">lin3 class="64 65 promme="9RETRY); 3 192 sref">nr_odeyd.c#L1s="es" clfrom promme="empool.h" class="fref">lin3 class="648the sys6eme="L197"> 1973/a> 3 6xt" c60ss="sref">nea> p4 hrefs="es" class="srefs=" hrecopyd.c#L182" id="L1s="sref">kc->->lin3 class="649the sys6e64o*4g6r4comme3t"> *39c6vers/60/dm-kcopyd.c#L178" i a hrefs="es" class="srefs=" hrecopyd.c#L182" id="L1elagline" * =">pl; a hrefs="es" clREAD* ="READme="empool.h" class="fref">lin3 class="64code=pag6_list" class="s4ef">p4106 href61drivclass="lin P_NORETRY); id="L192" clasr "emse2 192 sref">nr_, 0Lasizeof04 hrefs="es" class="srefs=" hrecopyd.c#L182" id="L1source192"> 192 sref">nr_9empool.h" class="fref">lin3 class="64" name="6111"> 111 4 41<6a> 61L181" id="L1ef">nr_pages 192 sref">nr__clientcou"L192"> 192 sref">nr_ deef="+cr ass="srefs=" hrecopyd.c#L182" id="L1source192 name="L198 naml"> [0].m_kcop0d_clientcou"L192"> 192 f">0f="+cempool.h" class="fref">lin3 class="64opyd.c#L6"+code=pl" clas4="sre41 6 -> name="L19empool.h" class="fref">lin3 class="644pyd.c#L6ree_pages" clas4="sre41 6 <61href="+code= sea hrefplugme="Lass="srefs=" hrecopyd.c#L182" id="L1elagline" * =">pl; a hrefs="es" cl *lin3 class="64 189 <4a>; free_pl4ne4; pl; plempool.h" class="fref">lin3 class="648the sys6117 4 41c6ass="61ef="+code=kc" classfn192"> 1ass="srefs=" hrecopyd.c#L182" id="L1id="L193"/a>} pl; } pl); 3sclass="64copyd.c#6ss="line" name=4L118"41n6" nam61e=__free_page" clasead" add ass="srefs=" hrecopyd.c#L182" id="L1elagline""es" class="srefmasterss="clas =">plpl); 4x &6t; 49 192 sref">nr__clientcou"L192"> 192 sref">nr_ _GFPdeef="+cr SUB_JOB *3"> 193static void npage" clasead" add iL10tc8 *pl); 4 >6 ); 42 6 <6 href="+code= sea hrefplugme="Lmu="+_ins/md/dm-teid_bi=smu="+_ins/d.c#L73" id="L73" class="ass="srefs=" hrecopyd.c#L182" id="L1id="L193"loc> 62d.c#=pl" class="sref">pl); 3/ass="li64eue.hkrogresa href=processss="9gresa +c=pl" class="sref">pl); 4xL26"> 64 the sys6ivers/md/dm-kco4s="sr42n6" nam62get_pages(struct id="L1source192"pl">d/dm="sref">nr_res=spl">d/dm= pl); 4 189 <4a>; #in6lude < 47 4 class="64copyd.c#6="L27"> 2748" cl42r6vers/62e=__free_pageass="li=pl" class="sref">pl); 4xL26"> 64f="+code6page_list" clas4="sre43=6line"63dm-kcne" name="L189"> 189 <4a>; a hrefs="es" clEXPORT_SYMBOL>->pl); 4 81 4s="line"64f="drive6s/md/dm-kcopyd.4#L13143 6 struc#L76"ss=name="L192"> 192 81 4s="line"64code=nr_6=alloc_pl" clas4="sre43 6 <63href="+code= s< idlo7">nexta hreffn192"> 1ine" name="L198"um_ naml"> , .c#L73"Ll="+code=pl" cs="line" namio_region [0].m_kcoLame="L81"> 81 4s="line"64pyd.c#L164" id="L134" cl4ss="l43e6 name63L134"> 134 e="Llo7">nexta hreffn192"> 19name="L198elagl"> n">__GFP_pages rivers/md/notify_92134">id="L1masterss=92 pl,+-kcopyd.c#L1contexi1} 193static void ))6{ ); 4 43;6-> , .c#L73"Llid="L1id="L193" name="L198 naml"> [0].m_kcoLages n">__GFP_pages pl,+d.c#L1contexi1} pl); 4 #in6"L137" class="l4ne" n43n6xt" c6ass="sne" name="L189"> 189 <4a>; ->pl); 4 49 192 81 4s="line"64a>-><6 href="+code=nr4free_44c6ass="64L181" id="L1ef">nr_paaaaaaaaaaaaaaaaaages rivers/md/notify_92134">id="L1masterss=92 pl,+-kcopyd.c#L1contexi1} 193static void 142 4 44 6 nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=pl" class="sref">pl); 4x pl<4a>; <44#6104" 64vers/md/dm-kcopyd.c#L144" id="4<* back 64="line" 6ame="L144"> 1444/a> 44/6m-kco64"L11pl; d="4<* back 647the sys6dm-kcopyd.c#L144" id=44&6t;< c645" class="line" name="L165"> 14d href="64L137" id6dm-kcopyd.c#L144" id=44n6xt" c64ef="+code=kc" classfn192"> 1"emse2 nr_res=" hrefd/dm-kco)9empool.h" class="fref">d="4<* back 64copyd.c#6e="L147"> 147 lin3 class="64ass="sre6">out_of_memory4/a>: 45i6ers/m65dm-kcopyd.c#L" clasead" add ass="srefs=" hrecopyd.c#L182" id="L1elagline" 2 pl; plempool.h" class="fref">lin3 class="64 6 } pl; } pl); 3sclass="64class="s6ef">pages);4pl); 4x 151 4 45 6 pl); 4m* back 64/a>; 73 lin3 class="64opyd.c#L653" id="L153" c4ass="45e6 name65vers/md/dm-kcopyd.c#L144" id="4<* back 64="line" 6an> ; pl); 4x 189 <4aL26"> 64L137" id6void ->lin3 class="64copyd.c#6age_list" class4"sref45n6" nam65yd_put_pages" class="sref">kco4e" name=64copyd.c#6159" id="L159" 4lass=46d6"L1696 classclass="liness="commsdivers/md/do_swhea> f">pl,olo7">next" class="srwriteeer * f">pl3"> 193static void p46"6 18L166P_NORETRY); pl64ass="lin6" name="L160"> 460nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=; lin3 class="64" name="6162"> 162 4 46 6 192 pl; lin3 class="64md/dm-kc6pyd.c#L163" id=4L163"46 6 <66ile ( f">1e/linux/id="L1elagline" * f">1e/linempool.h" class="fref">lin3 class="64="line" 6pl" class="sref4>pl; = .href="+cid="L1elagline" * = .href=empool.h" class="fref">lin3 class="647the sys6ers/md/dm-kcopy4.c#L146=6+code665" class="line" name="L165"> 14d href="64 } 1d/dm-kcopydushopyd.copyd.c#L73" id="L73" class="line" name="L73"> 73 } nr_pagespl); 4 += pl); 3/ass="li64="driver6/md/dm-kcopyd.c4L169"47d6"L16967dm-kcne" name="L189"> 189 <4a>; a hrefs="es" clEXPORT_SYMBOL>->pl); 3/ass="li64ass="lin6"+code=dm_kcopy4_clie47y6.c#L167ne" name="L81"> 81 4s="line"64=kc" cla6s="sref">kc4 unsi47n6" nam6="L101"ne" name="L10 L1mment"> * pages for kcopyd io.4172 * pages for kcopyd io./* * pages for kcopyd io.i4a> =34f=6+code6drop_p#if 0 * pages for kcopyd io. nr_res=" hrefddancel= struc#L76"ss="es" class="sref">nr_res=" hrefd/dm-kcopyd.c#L1s="es" class="srefs=" href="+code=, n> 62d.c#= * pages for kcopyd io.); ); pl63s="sref"6next) { * pages for kcopyd io.lin4 class="63 189 <4a>; * pages for kcopyd io. 183 3 3 6 <68ile ( * pages for kcopyd io.pl * pages for kcopyd io. * pages for kcopyd io. 192 168 ); pl63es(<6 href="+code=kc3 clas3906 href69drivclass="lin> ref="+c-a hrefs="es" clENOMEM>->lin3 class="63ivers/md6dm-kcopyd.c#L183" id=39160" cl691m-kcopyd.c#L="+code=pl" cs="line" name="L192"> 192 plempool.h" class="fref">lin3 class="63 81 4s="line"63n 0; 1pages" class="nf="+code=pages->pl); 3/ass="li63=client_6ree_pages" clas3="sre39 6 <69href id="L192clasref="+cr pages" class="nf="+code=l" class="sref">pl); 3/ass="li63=page_li6t" class="sref"3dm_kc39g6p69L134"> 134 eass="lia hrefs="es" clERR_PT/md/dm-DM_KCOPYDERR_PT/= ->pl); 3/ass="li63a href="6_free_pages" cl3ss="s39 6 ne4; 3_ins/md/dm-teid_bi=sspin_loc>_ins/d.c#L73" id="L73" class="line" name="L73"> 73 62ref==pl" class="sref">pl); 3/ass="li63 } 1973/a> 3 6 1INIT_LIST_HEAD* ="INIT_LIST_HEADd.c#L73" id="L73" class="line" name="L73"> 73 } nr_=pl" class="sref">pl); 3/ass="li63L188"> 16=64o*4g6r4comme3t"> *39c6de=kc69e=__free_page" clasead" add INIT_LIST_HEAD* ="INIT_LIST_HEADd.c#L73" id="L73" class="line" name="L73"> 73 } } nr_=pl" class="sref">pl); 3/ass="li74140"> 147 ="INIT_LIST_HEADd.c#L73" id="L73" class="line" name="L73"> 73 } } nr_=pl" class="sref">pl); 3/ass="li74140"> 147k__70s="line" name="L130"> 130 4de=pages742nr_pages} <_cach pl); 3/ass="li743pl); 3/ass="li744pyd.c#L70ee_pages" clas3="sre39 7 } 70href="+code= slin3 class="74 ; ="INIT_WORKd.c#L73" id="L73" class="line" name="L73"> 73 nr_res=" hrefdf="+>nr_pagesnr_res=do/f="+>nr_=pl" class="sref">pl); 3/ass="li747the sys7e196 3 73 nr_res=" hrefdfqGFP_; "" href"mment">Lame="L81"> 81 4s="line"748the sys7eme="L197"> 1973/a> 3 7xt" c70ss="sref">nea> pppppppppppppppppppppppppa hrefs="es" clWQ_NON_REENTRANT*->pl); 3/ass="li749the sys7e64o*4g6r4comme3t"> *39c7vers/70/dm-kcopyd.c#clasref="+cr pages" class="nf="+code182" id="L1id="L193"ers/md/fq="sref">nr_res=" hrefdfqGFP_=l" class="sref">pl); 3/ass="li74code=pag7_list" class="s4ef">p4107 href71dm-kcopyd.c#L179" idbgotolin3 class="74f="drive7s/md/dm-kcopyd.4#L10941170" cl71s="line" name="L130"> 130 4de=pages74" name="7111"> 111 4 41<7a> 712m-kcopyd.c#L" clasead" add pages" class="nf="+code182" id="L1id="L193"kc->->lin3 class="74opyd.c#L7"+code=pl" clas4="sre41 7 -> ->pl); 4xL26"> 744pyd.c#L7ree_pages" clas4="sre41 7 <71href id="L192" clasblk_L19rt *ref="+c ->nr_=pl" class="sref">pl); 3/ass="li74 ref==l" class="sref">pl); 3/ass="li74 the sys7ef">free_pl4(struct goto->lin3 class="747the sys7l" class="sref"4pl 14d href="748the sys7117 4 41c7ass="71ef="+code=kc" classfn192"> 1line" name="L73"> 73 "> 192 192ref="+c pl); 3/ass="li749the sys7ss="line" name=4L118"41n7" nam71/dm-kcopyd.c#clasa hrefprocessssIS_ER/md/dm-DM_KCOPYDIS_ER/= "> 192 192ref=NORETRY); &7t; ref="+c "> 192 192ref=Npl" class="sref">pl); 3/ass="li74h>7 id="L192goto"> 192 192me="empool.h" class="fref">lin3 class="74" name="7a>> 189 <4a>; >7 pl); 4m* back 74code=nr_7href="drivers/m4 42 7 <72href id="L192" clasblk_L19rtins/_waitqueue_head 73 nr_res=[0].royqref=Npl" class="sref">pl); 3/ass="li74 73 pl); 3/ass="li74 the sys7ivers/md/dm-kco4s="sr42n7" nam72f="+code=next" class="sref">ne4; plempool.h" class="fref">lin3 class="746#in7lude < 47 4 class="74copyd.c#7="L27"> 2748" cl42r7vers/72/dm-ka hrefs="es" clbad_io>"> 192 192me=":ame="L47"> 47 4 class="74f="+code7page_list" clas4="sre43=7line"73dm-kcopyd.c#L" clasead" add dm-kco_free_kc->pl); 3/ass="li74ivers/md7dm-kcopyd.c#L134" id=43"7 180<7a> a hrefs="es" clbad_sm-kco_kc-> 47 4 class="74" name="7de=pages" class4"sref43c7ass="732m-kcopyd.c#L" clasead" add [0].roy_f="+queuelass="line" e/l[0].roy_f="+queue= nr_res=" hrefdfqGFP_=pl" class="sref">pl); 3/ass="li74h>7s/md/dm-kcopyd.4#L13143 7 47 4 class="74code=nr_7=alloc_pl" clas4="sre43 7 <73href id="L192" clasblk_L19rtmempool_[0].roy="srefs=" href=mempool_[0].roy= pl); 3/ass="li74 47 4 class="74 the sys7{ ; pl); 3/ass="li747the sys7136 4 43;7 14d href="746#in7"L137" class="l4ne" n43n7xt" c738=__free_pageass="lia hrefs="es" clERR_PT/md/dm-DM_KCOPYDERR_PT/= ref==pl" class="sref">pl); 3/ass="li74copyd.c#7/dm-kcopyd.c#L148" id43r7vers/7d/dm-kne" name="L189"> 189 <4a>; -> pl); 3/ass="li74L140" cl7ss="line" name=4L140"44"7 180<74s="line" name="L130"> 130 4de=pages74a>-><7 href="+code=nr4free_44c7ass="74L181"class="liness="commsdivers/md/dm-kco_[0].roy="srefs=" href=divers/md/dm-kco_[0].roy= 192 pl=l" class="sref">pl); 3/ass="li74ame="L147"> 142 4 44 7 * pages for kcopyd io.pl<4a>; <44#7104" 745ref id="L192" clasblk_L19rtwait_ev192 nr_res=[0].royqref=, ref="+cr c_and_tread 73 d="4<* back 74="line" 7ame="L144"> 1444/a> 44/7m-kco74f="+code=next" class="sref">ne4; 73 } nr_=9empool.h" class="fref">d="4<* back 746#in7dm-kcopyd.c#L144" id=44n7xt" c74ef="+code=kc" classfn192"> 1BUG_ONo_jobsnr hrefs=BUG_ONd.c#Lref="+cr ame=_empty="srefs=" href=ame=_emptyd.c#L73" id="L73" class=" class="line" 3"> 73 } } nr_=9empool.h" class="fref">d="4<* back 74copyd.c#7e="L147"> 147 73 } } nr_=9empool.h" class="fref">d="4<* back 74ass="sre7">out_of_memory4/a>: 45i7ers/m75dm-kcopyd.c#L" clasead" add [0].roy_f="+queuelass="line" e/l[0].roy_f="+queue= nr_res=" hrefdfqGFP_=pl" class="sref">pl); 3/ass="li74 7 "> 192 192ref=Npl" class="sref">pl); 3/ass="li74class="s7ef">pages);4->pl); 3/ass="li74e" name=7L151"> 151 4 45 7 pl); 3/ass="li74/a>; pl); 3/ass="li74opyd.c#L753" id="L153" c4ass="45e7 name75vers/ne" name="L189"> 189 <4a>; ->pl); 3/ass="li747the sys7e three functio4s res45"7id="L75s="li The original LXR softwaretby the2" clasblkhttp:// sref"fogge.net/projects/lxr">LXR > icunityd.c#, this expericandal f">pionbby " clasblkmailto:lxr@ctiux.nof=axr@ctiux.nod.c#. axr.ctiux.no kindly hostextby " clasblkhttp://www.redpill-ctipro.nof=Redpill Ltipro AS>nr_paproviderb fuLtiuxe"snsultisiband opera=ionkeservicekesince 1995.