From 2b6e28f6f1847eb580bd7da5f03d9428a4027361 Mon Sep 17 00:00:00 2001 From: openeuler-robot Date: Fri, 2 Feb 2024 00:16:43 +0800 Subject: [PATCH] update libgmem-v0.1.tar.gz to 4dc188c Skip building when the kernel does not support GMEM --- ...acros-use-the-default-definition-of-.patch | 67 ---- add-install_npu_driver.sh.patch | 67 ---- fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch | 96 ------ libgmem-v0.1.tar.gz | Bin 9388 -> 163840 bytes libgmem.spec | 31 +- optimize-headers-file.patch | 42 --- use-ioctl-instead-of-syscall.patch | 318 ------------------ 7 files changed, 25 insertions(+), 596 deletions(-) delete mode 100644 Structures-and-macros-use-the-default-definition-of-.patch delete mode 100644 add-install_npu_driver.sh.patch delete mode 100644 fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch delete mode 100644 optimize-headers-file.patch delete mode 100644 use-ioctl-instead-of-syscall.patch diff --git a/Structures-and-macros-use-the-default-definition-of-.patch b/Structures-and-macros-use-the-default-definition-of-.patch deleted file mode 100644 index 962dc9d..0000000 --- a/Structures-and-macros-use-the-default-definition-of-.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 512d8df361f3afa3831fff90cdf3c3f43bbc9142 Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Tue, 12 Sep 2023 10:54:05 +0800 -Subject: [PATCH] Structures and macros use the default definition of the - kernel - -Signed-off-by: Yang Yanchao ---- - include/libgmem.h | 29 ----------------------------- - src/libgmem.c | 1 + - 2 files changed, 1 insertion(+), 29 deletions(-) - -diff --git a/include/libgmem.h b/include/libgmem.h -index ece13a3..35cf463 100644 ---- a/include/libgmem.h -+++ b/include/libgmem.h -@@ -17,35 +17,6 @@ - #include - - __BEGIN_DECLS --/* -- * TODO: Remove these "ifndef" after kernel upgrade -- */ --#include --struct hmadvise_arg { -- int hnid; -- unsigned long start; -- size_t len_in; -- int behavior; --}; --struct gmem_hnid_arg { -- int *hnuma_id; --}; --#ifndef GMEM_GET_HNUMA_ID -- #define GMEM_GET_HNUMA_ID _IOW(0x55, 1, struct gmem_hnid_arg) --#endif -- --#ifndef GMEM_MADVISE -- #define GMEM_MADVISE _IOW(0x55, 2, struct hmadvise_arg) --#endif -- --#ifndef MADV_PREFETCH --# define MADV_PREFETCH 32 --#endif -- --#ifndef MADV_DONTNEED --# define MADV_DONTNEED 4 --#endif -- - /* - * gmemFreeEager - unmap memory data - * @args -diff --git a/src/libgmem.c b/src/libgmem.c -index 59682af..870da87 100644 ---- a/src/libgmem.c -+++ b/src/libgmem.c -@@ -14,6 +14,7 @@ - #include - #include - #include -+#include - - #include - #include --- -2.41.0.windows.3 - diff --git a/add-install_npu_driver.sh.patch b/add-install_npu_driver.sh.patch deleted file mode 100644 index 6139dfc..0000000 --- a/add-install_npu_driver.sh.patch +++ /dev/null @@ -1,67 +0,0 @@ -From 7ec0cd6ce9c75de770426bde8747d329397ad4c8 Mon Sep 17 00:00:00 2001 -From: Lemmy Huang -Date: Wed, 20 Sep 2023 14:15:48 +0800 -Subject: [PATCH] add install_npu_driver.sh - -Signed-off-by: Lemmy Huang ---- - scripts/install_npu_driver.sh | 47 +++++++++++++++++++++++++++++++++++ - 1 file changed, 47 insertions(+) - create mode 100644 scripts/install_npu_driver.sh - -diff --git a/scripts/install_npu_driver.sh b/scripts/install_npu_driver.sh -new file mode 100644 -index 0000000..37b35ea ---- /dev/null -+++ b/scripts/install_npu_driver.sh -@@ -0,0 +1,47 @@ -+#!/bin/bash -+ -+# install npu-driver to kernel-6.4 -+ -+RPM_NAME=$1 -+RUN_DIR="/usr/local/Ascend" -+RUN_NAME="$RUN_DIR/Ascend-hdk-910-npu-driver_6.0.0.1_linux-aarch64.run" -+ -+function sed_run() -+{ -+ echo "sed $RUN_NAME ..." -+ -+ sed -n '1,/^eval $finish; exit $res/!p' $RUN_NAME > tmp.tar.gz -+ sed -n '1,/^eval $finish; exit $res/p' $RUN_NAME > install.sh -+ sed -i 's/MS_Check "$0".*/echo "skip MS_Check"/g' install.sh -+ -+ mkdir sz_tmp -+ mv tmp.tar.gz sz_tmp/ -+ cd sz_tmp -+ -+ tar -axf tmp.tar.gz -+ rm -rf tmp.tar.gz -+ -+ sed -i "s/^check_euleros$/#check_euleros/g" driver/script/run_driver_map_kernel.sh -+ sed -i "s/^check_and_match$/#check_and_match/g" driver/script/run_driver_map_kernel.sh -+ sed -i "s/^drv_dkms_env_check$/#/g" driver/script/run_driver_install.sh -+ sed -i "s/^.*driver_ko_install_manually$/echo \"skip\"/g" driver/script/run_driver_install.sh -+ -+ tar -acf tmp.tar.gz * -+ mv tmp.tar.gz ../tmp.tar.gz -+ cd .. -+ -+ cat install.sh tmp.tar.gz > $RUN_NAME -+ rm -rf sz_tmp -+ rm -f install.sh tmp.tar.gz -+} -+ -+ -+rpm -ivh $RPM_NAME --noscripts -+ -+cd $RUN_DIR -+sed_run -+groupadd HwHiAiUser -+useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash -+$RUN_NAME --full --force -+cd - -+ --- -2.33.0 - diff --git a/fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch b/fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch deleted file mode 100644 index 68022df..0000000 --- a/fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch +++ /dev/null @@ -1,96 +0,0 @@ -From 25335f5ab5c0f3dd448613bc0cf75ec6e58f6a5a Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Wed, 6 Sep 2023 16:01:53 +0800 -Subject: [PATCH] fix three issue - -Check the return ptr of the malloc[#I7YV2X] -add hnid in gmemPrefetch [#I7XQMW] -free userData in stream to avoid async operations accessing illeagal address[#I7Z2RF] - -Signed-off-by: Yang Yanchao ---- - include/libgmem.h | 10 ++++++---- - src/libgmem.c | 15 +++++++++++---- - 2 files changed, 17 insertions(+), 8 deletions(-) - -diff --git a/include/libgmem.h b/include/libgmem.h -index 4cd918b..ece13a3 100644 ---- a/include/libgmem.h -+++ b/include/libgmem.h -@@ -62,17 +62,19 @@ int gmemFreeEager(unsigned long addr, size_t size, void *stream); - * @args - * addr: start address of the memory to be migrated - * length: length of the memory to be migrated -+ * hnid: the numa id of the target device - * stream: the stream where work queue used by operation - * - * The physical data mapped by [addr, addr + length) will migrate to -- * the device corresponding to streamid. The hnuma node of the device -- * in the current context needs to be automatically obtained -- * and the prefetch instruction of hmadvise is invoked. -+ * the target device corresponding to streamid. -+ * -+ * If stream is NULL, perform synchronous operation; otherwise, -+ * perform asynchronous operation. - * - * The asynchronous operation is non-blocking, but is executed in - * sequence with the tasks in the stream. - */ --int gmemPrefetch(unsigned long addr, size_t length, void *stream); -+int gmemPrefetch(unsigned long addr, size_t length, int hnid, void *stream); - - /* - * gmemGetNumaId - get the numaid of the current device -diff --git a/src/libgmem.c b/src/libgmem.c -index 9a34de0..59682af 100644 ---- a/src/libgmem.c -+++ b/src/libgmem.c -@@ -37,6 +37,7 @@ int gmemAdvise(void *userData) - if(ret) { - printf("hmadvise failed: addr:%lx, size:%lx, behavior:%d, hnid:%d\n", msg.start, msg.len_in, msg.behavior, msg.hnid); - } -+ free(userData); - return ret; - } - -@@ -44,27 +45,33 @@ int gmemFreeEager(unsigned long addr, size_t length, void *stream) - { - int ret = -1; - gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg)); -+ if (userData == NULL) { -+ fprintf(stderr, "Failed to allocate memory for userData\n"); -+ return -ENOMEM; -+ } - mix_userData(userData, addr, length, -1, MADV_DONTNEED); - if (!stream) { - ret = gmemAdvise(userData); - } else if(gmemSemantics.FreeEager != NULL) { - ret = gmemSemantics.FreeEager(userData, stream); - } -- free(userData); - return ret; - } - --int gmemPrefetch(unsigned long addr, size_t length, void *stream) -+int gmemPrefetch(unsigned long addr, size_t length, int hnid, void *stream) - { - int ret = -1; - gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg)); -- mix_userData(userData, addr, length, gmemGetNumaId(), MADV_PREFETCH); -+ if (userData == NULL) { -+ fprintf(stderr, "Failed to allocate memory for userData\n"); -+ return -ENOMEM; -+ } -+ mix_userData(userData, addr, length, hnid, MADV_PREFETCH); - if (!stream) { - ret = gmemAdvise(userData); - } else if(gmemSemantics.Prefetch != NULL) { - ret = gmemSemantics.Prefetch(userData, stream); - } -- free(userData); - return ret; - } - --- -2.41.0.windows.3 - diff --git a/libgmem-v0.1.tar.gz b/libgmem-v0.1.tar.gz index 3d2b40f153324eeff4768ec90ed7208e867924ad..7c608c7f9466248c3570b91d3014c90b6b6a3f4b 100644 GIT binary patch literal 163840 zcmeEv1zc2H*Z0_f-L1zFC1mIl1SJ&}@d9?>00WG|3{D7$b?xr%R_yNX?(WuWcgOc% z`IS)o=Mz}6`^sam6qRjQ=uj9wFur*S%6qSnLC4n#?zu#HkD z*rmu-u@U$$Do(Dp6EK%(7J8`AMa7{`4Rk_l7pIU%YwfH(*bg4O){X~nXKmIhQbQm( zX@XpPzZ;Z2(f;G;OzZFF;spE8Z~gBlC;V?zt6Ie_QmL}j#+g+$tIGMP zI7KpBYL3VN$7=#4^F_reqB=044~kd<JHA<+OB2-Qp!x03zN~fjnYIW*Fqu$zboS{XfmO#YEtCJx1qNpJ4DmYX*Hr#Jr3_CBHFclN)7tG#`u{qO4P{M-KXH+J#Q7yT9cAG?I} z!;Zp!icI08gw{OzNckX;ZArWtlM&?7Y~D3B~#2Y)q@Nk*rXDpX=bmIlB@%A+}Dv_j6|eyl>J z(8%L$xJW(UR3h|$nDk`n9Re(|ZUQWJ9O$o(CzwhdPZq;Me7$%g)(IYzxN^VTIOW(FIP{QOil& zngg^HRLw!kb?L$>qT)bW`Fq~p>^99+I2kBJZWTq63Jj0Y`owr8ekih-EiI;)kx{7> zmOY}s)S^Y(OdYZi8a6ZKv}%nG!<6wm2eYm}K%swrZ~sWm?C5`tHbJc-d$25trZz#Y`guO^ZTb)EpKB)h z&(Yr5(ebzZ_ap1~Ps@P*>$Mst112go@n&Xvh$32@Mj55^WZ#qI8Wl*2mj4yh*w4cw zBvGMq^rStQy}YPY=@hXV+K9~r{6TR`(WD4KqIBp9;HVTykOZSS_#~7uN<1eXg6&NrtdX3@CCar#gXEm(&9IEp zYaqDk;!`+BD+VGSJ^+9xw*{Jm7z+@*2ZX2{*pZyg1`|D_IkjGws23&7X#B!s>Wnb} z0t+DE7<{)tj2UO^q~IbI5R(m^)+$v|BvL9eRJY|CLj=@v32;mSOe9%Z!qz}5IOaemwxPAlSlIR-c#%R)9(6N0mNc22I2+3$Y^>wrH2L1qZ>OG!UpjYZNIb z4GJh7C0EgwvbCjRo?rqrHRhPr2wKhv9j&Docr^bTB_pDh8cQn-gvx0YI!y|mI|#qq zYt^cV#165ZW{OVoc0{^NDWWaS z)mCg3O!;jWp;2h{@jBd=d8bCjtD`z}wc+ZdvY(6qbnQyuy3&MFFEZ2;`e13!Dk`H< zlht8J7lE;u8cSapP|nb20U{Mug9LJxG^m(38&2vi#eWR>#qr7b)@|`2rCwntD^<*g z%GdDF>tft7jd;N0Gj0Q!h2FJR@x5dCfg-pKvWz0sQ4tV!KuD8tG;Dw+KoWoeIDbRh z+MZg%i~&E)Z3qSUJN#q5DTaqMZQ=+b7#MNwF!zaS74zD5Og0c}>KKq(nh|-Wc4&=l zoj@r5*fl_UV6#wI2{HKY~rL@I9!J4QC57e{#dOB@5 zdmGNdic@stq)}3yXnkFZZ9M7M_gk|DOfx(Xn(o-K6_AIYV_=eT=NQklX@jnH<$KPf zj2Bm{mee$$kw10Xw3U?ICGwPU!{JV925{6MDwv9k;K8+$5^_n~*s$A1Q_3ExbpX*y z3eLnz3G`3e2GJCzUGX1!@J*shGjG^Ttdq1t->0jrs4cNGfv%>LPjmJR!_Gu7`4VhD z2Q}ghrFfz$+(s>)xf;kEaYTV++Ie!dL~`Iwj1MhjBcCvgV&fvbVk9$tT-h=Uv1m5q z5+8p(G)8cm2@jZRze+7IEm0!*4h>@DRcwx-GojJ-n?Wl0$WN2_tRxD7&_jY?9Tj;$TX}^>1LEZcDTO_Qh{5h) zwb|Ae#4c~no{=hZzBtXb@D*K7u+s}>Vl^$kIvz4R6V`35!5KgaDZGkE;;)AEDrT1bVZ);l=8;p3Ik<@# z@yG~2x(3b2l&To@Z!+@jwf&K&+3tTh1Jk1!{uv4Q-u`z*(pBd8AB2Sdj{o_Q1^kC) zesuq1&naV4xFqsrkUKdNA{WVr@K5kQV_3(@U6Jy?H3I1GQlSj^pG71O2qHi5ABf~Z zS;4cOA(F=c!Z?!0=;q&xT@2bF(33NV|P9>9R4kZly;PtX8<577RHvPEKualoEH z6e(kZ^R|mtbh1%mB+%$tkro@5i?Sv$QT%ezzQXFXdbo)6#JMM zPACbLo>L?w>QW#yfC!7=R>}`YU%>aMv=-toSY8~Q>`@e$N){OO zQp+1wbV~S7Yzb9b!Qh@@LZsxglG3zFxi*O0Bt&RLd5>b#ya*k`Av+NQHnpfx>j7Pk zwcz-!V2xmnfd@lj1DC1JLQ6ns{1_i|`NFM9!Z^v@@YN0>Y>A5PYpGZ!(x3;D|%`bGFOZ0O}jgO){e z7Ogm0w>GWqVcFo4q7Z~-#aw^F?n0m!ydA9rLITYK$b9R;`RH`Cdl=HNpt+1l!(2z$ z%Pe*bE-1L6$X5k~Lv(L~mh79xdxlIR{K6(G)QEp4$E6y>#|#U&N-<^OObX)X9A$u3 zBp^k1QfkG`WQY|evme>b%!JL^L4^Q6CR0(fH2Kjievf`p_o77@v^_DI@U=46n}?Yh z$EcC88Cl3h#tq1Juo+E_7;I)B3p4_X$b|VX4nci9N;6Xw9DKa9gw_~=hQMsvN=9Bc z!gq3P3Okr6B3n`3zlSwvoiwbyVR2=$-`d*WV$A=c!rzkrSQ4}#xc(C<@H_G!&Ib5O z|8x6o|M|}#z`rd2F%%NQ!2fOW4?cd10Vnx_2stRz*McCQ*DokGKOqhpZ;33FLdFAG zmIj4G`v-;E@xgHE3LvR^pxykRki3y?*&oW__-A<*T(&meJ}RxJNw_!<*WQJ zSEt|mU!1*v_cML}WApfAoBs6;^ABN(A{zQ!#uN~er11oSqkIAvpWMO30}{(2UkHb8 z@L3ytDng_J;wuHR3SLjj2ce)@0T^orq7&0rgxoaJ83pMZvACI%$KYdU-c#m~g{eyD zE5GqcrsAVPAzMMVMYmW68ubl(R#3I<_-{Ixkk7r#^4I$fP@Tj z3SLsGPYsb6$g3jJ$bi8R%pIv}lhB4Fo_@P5N@JV^h5A6?7f7NdVmUB^qQ}oH;@#4FPr@v9$v7jCSK825wxZHzL5-!HB@^eNz(Cwb>W5Zq z1wou|A2vJ(sTq!)!52rVnHeP@3hHhKU0VkB0syrP$~M#zC@L1M>}56OvY0j&oP|9? z0nIR_&;&F%h6cR?ZoxAhBYY!GmT#2Z6u#oFSu~;mz_%C=L6jJ)hx>f83iU_|C5u@V zps&@#^rMMrMAPZW`R@TSpP3hoK%~RY07C>q3MgXN`O|Q0SSk(W6p@xEOfKM>GW8DA zlHMQO6`BHsCSvG38E>={pZ^s=3XsnNV0!OtZ8JhAMTO!w{Fp953N6-80D%WQEMa-b z9E0#g|FX=?xNU3*Eya+OV)4 zVP6seQMoe3AxUO*vAquS2E-5h{{ofgTl`<6h{QQf|6Bt2Hvh+Af6k6y*?%2>=YRjZ zj9-AB&i{!~_^A_9a0*wPj?NUoFwTOLiM z241Sst2h>VBye+<5GocDtZB^50U*S?+p8mOm>rEQ9wM11f=(Nq*&8U498f7~f;>#L zxkR=I7@3&9;BQ9#pJndUwmuP&z6v=ahw%eGXC;_l64)T95qZBUY?{p7JWHoC!l7b3 z!{RARe)27Z?84|(m%D4`DVWAeul>z3pA zHF-2;;4>A4nN2NJie#OI*fSRCjj$p%bwURrb>S>FGJ!E$C3Ov_sex;_+ac0PFl^a#p6D=H&KPZ`#50XX4;!GN(?}iTEs@L$ zPuzu_KPNS3El4pyhyjKU)UIu34UXaIX+|GBAr#F+(RsnT|V#1gyITbCT z4}2Rj@NA?QAs64v+GY^3Bb2HL{-+mPt#qC&WJh>G{$&B}ZTVt`F0~_5Ij=N##?1_{ zaOMFMcGCOHcaQ|rtUKe0Nrn9v)^bS3h`mLkGFUWQK?h+4qZnc{WXEG(=|D4BD?o*T zA`#|Sq&E|e7>%9cFpY*z2woe@6GK6iWU3XC($ReqybX9qiPB{Cj-Uz=4w)v$Fc)pb z^)XKswoq3}HHHnpol$kiY^sa41dhw1x;VR1bEAIn!eIIhY&d?Vh3RMOovAhCWV72+ z0Xy5Ji>ff;8&-}lV-QobS~`(}Af^;(%`!mP_TVvtM5>=zFi|4qw<{CGcp@TnE zB-2L7#Fkv7=pKB+7lE;?X4G|xR8Np6vItC5ySA31zEQ)9V{zZ6mQYK*ype)Jo#+ZL z6?{LIcCA%*NVH_#b7;dJkuXhthuV;U{526|CYThWZq5TXZN)=2cVy$s61HO-Ay1E_ zY|AQ)3?Z7|sQ;;~L76vZsVg6l$|Q12b2{9FAC;+)tS01j(i0jB{@?@y)la{HbQk>b zehM)QlphfqaA+e;A!WtTMQVV6x&|~QY@qW6gdQ4DkH;-{?{I2L0T#$#pt4U;SocfK~Cphx(Ff8gQNqKHK{{Irskn1H205h;(cd;tM* zc>5PgaBR>9)13`mwwh?ld?fLZOi@f!6S+Luj?4fOjEaZKGeLg6FdLmHG6Bz7?g;Mk z9!9-}`7-g)%v>~A3%DYG*`l z3|XHnCl-{1pIJdxghi7UlZXe~E__3lVD^Z75Dd%I0nmRw^AzVs#6UBO<0&v6vHAk3 z5j%l}XsAGd2A@B}Vn?tkgwtw(`=)d>fLbP#efJV}DXU>eJ;k5+`PFwSMGxhGOjji5 zLuE2nKp`q)3?z#(bPIoC$tXZGT%0feke>609HbY_2)6ZC1x0}L8Ogfn$I6H$1%SrI zvI1$xW*zmvJAq;u0}C)SGxM>*5Qu;IF+I(gsn9th!~uQSVN`TWWO8x*||x8W;Tpx-gBN2qs90$Vpi{eykm$ z076&NSp=B_;$ikTLzGiSs>>@q2&`f71e!$W*u{|kj~Ss>k*kgUgfsoje7|ZqoEUTh zto;fOq??dfjE7?eSW%y8%g-iptZYgMIKfKrdIXMc!cl&dK8N$cm`Y15z-WN5K~Qmu z!s3T#+!@EOJHt<`tt|tFo`N1QwnUqdqU%H=kUc3h6UD#(h#BsGtdVcqf1?yQcjg}( zfWK}3#k*j>ivMtRbNhY%-+u%rGTMK$cK|bSkO&0~RLr@lW^V|f>>g$b77t=$(lAU> zFftL7hA+vuG%rdq8!&Gav!H@>Fpd{a2x1gSqu^sd#j1e9Y^TJ7VJD=AQe&7zDA6yd zQ_Oz)<7r0Ba?KE2i0P~;yX3Ab^RuzC?8jl+XN8b$bpG-(trT1k{%cq0by;1gVR zN+~CUoiy8ersUZ(WtpW?B+Ba*Uah}s!dywF55X?U3NgDRs)-Xs)=2&*5`)QxXE?fp zH^Q@_$Vfj$0)8q3QPtY3tCVbgR1+pjN?@f4zyK**nG1K*+lj&5-FWyt?>w0Cm&eg5Bn1Sfu!{)5I4J}?!D zH)a~gTM!q>82%$zJcZCdBHmbv~(n8W3#^SM)QE2j+OIL{U zr*%bK3_Gk_rjerG%w$Ea8P?L+9ZU~ceZG!V0E;Dqw!{wSrU|7k;|xQ=I|)t|4S9mj zs))i7LA>k$6&J-|MHEi8&?4Z8^e*&(UlI~d*fbK_DiNzB3Mohp!D3}`L@en%89L5z z6owFhL2!!@ScTW)ut+qvK3F0RHU`W*axPY_#+1S9hvoAN2@ZxB5gb-GA~2|7fS0+0 zcq=TVNvI!gIGTmk^KtMpcQP}}FGWc6204jT)R64tL9{^BhDNw1(qz*cZ{^`t>=) z{HVhNe)=e4;2V%wp#jy?$>^l8c*Or9x=5*#VOn6EL-rGY7ZWKQR{YgeVw=fKAQdG7z+{7)Ar zC*$}3;QbE>IkEqp|NS54|G=H>)j$651&}x)fR~Q9MC2o7DAFn8WC$WXPb9boz6I}z zsuS}Tfs3OQViI^gg-($m2LRLUP#d-`mhs2VH9}XI)<_m9zGX6o#lSHJ!?>ju$7iWv z#HD-UOUrocl|fOY+5iG~201}+AfXVY2-d^f=&|`=NrE< zR;W_^_=p`}L=_@x!r&NTVYPHvhgAOICuE<4^ItPqkSKX~T1VU|5s8nK|@lr&;8?JE=0 zha&j4jD;Sybg+H0S-~pO`63#yR|ZL#MF5CYz&E3W+~)~lDT(=wSjXT2!!vTNY81>z zM?wV?j>IKMuL>|QIMP|qNcN;zXMrH(6`*xShNTj9g`=C1b%;P}5!D4jQNR-(ydV*> zxQ6sNZzFG{Flp3z9+`kOvHZ#X%sMN~ormzg5E33xHi#XYNnt*)LzAcNE0L6NT`=g< z6fn%P6t@^jP=KOUGvgBDtyv)_11X2o+~Kj6ndB(Iot)vq3h~kHhBX$3VT?m)6Tn~!qlisGz9N#&kBd4)@}fYq;G9dM z!_w)t*r=criJKZ*Mvff`Gag=2z|N1vGEpiwc9a$~Ovw(IZcrMC?E<~@!)}fyvQ8VD zHObTBbV9(MU=Entm{A1cR~~c+;umQ~07D>Xli>jKh-d|J%2TjKVsI!nYaNq7?oiMZ zJ7czI8^vQ*qYT;KOwTjqZs4sx@U!r7rmU58Rwv*DVlGJmrKvO+0*$BJ*bOTBiQ&}b zu>@b(1R@L0XBn>XdlQm1?Ri8iLda&X2$tcnU7VM#$I9X!h#L7^ zg+MiSbYPQ2l22Ix8N*lMyk#j1-!XtEoT7Ad1_e3tIO`zm7K}kR6G$Jw`{>Y4a!2XG z$Ke@^7LlB9Nl?=nHX>m^7R=KK0o5^LIt;y&I09fIgn(HfN^MR`5vfwng9`|59Nr=# zJTxF6f)ufcdI8O8ir8k9>(~G&^o)w*cnL%LiO^|+ZG6N8`57B)H6Nnju%)^e15Up{H*9n0`>C$Yb zJPt8&)bQp%<1>HIgkW4GbqTE)QoW56NLaI^FES3v2g;EQ#Pi?qANCb~y%}JjrNJ0$ zbJPjqnCzSro+B}dhsg*uXO;@|gak*ZG<38cB~}`u{sGKb9xJoZek72Q(uq6> zs4);Opsp}0Eut0~6(r%)mh+)}TYwXmjKm-uTpvZ@jfi$2mJH%)B}zo>{WtuQLPjEp zq%-r9E{OyL6Tn2l#1MueE@gV6EUyn64iTc9S~gT(8y1*mhCvG2D=-Ny7*tu(Y$?ox zR7g^XN%)|bk+Q0pqQ6AuYFHp!5m7_=AlNnBIIQ8Q}*|oBgIh-^@RtK-Y6s;9I(S87;Q+(B?6|^rJy9gq7Za- zQMSgt0TrURNFc=Q*ZeWLScod1AcQc)p9ci{1T|zn1U?QSAe0g~!~@3oZIk(EE&=NW zq(}eg^()z7y%jr+3KDj9P?*&DZ5Y@&JQ$H?09HZ=@*<#dT|y!xX*$ly(1moVqB;M^ z*Cw12A+Wa|%3?^aWYbUhCuIjo6HP++K6tT05MbPhaRWhMlp&@Kc~kq(87N zE2F3qLnjQxg5-Usxf{V3lF-E7WS*O>CsYJP@-&^rEm}*YhBgfY_u$xxOCEySLNr43 zv5IX9p&LS00=6+U5UisRf6YFdg@iU>YJ(XxE~DPlk}?GX11GIY+E#GJ&HS^3DAOvoG_67JJb460#@4tN`0DJGM#VSaC^=ma%r zT6lqD2BaZ0K=y?UC+ZnZhXohVJSd#uxnWeo?*IQ>NytwA=as9Um-&sQ*YC*xZVvWe z<$v3|{PzDCPvO7zJzf4MK_`0!AQI<4;P5#WUR|dq+biTUd909y1c@3_BVK3+2$`Zl zjO|`REQsNx5)U#}v#1bloZLYMX$r6&$h$onc9dARw+R*bwp$>{gkFDvH2hA?(%RVw3}elWv})6b^%rheRoo%_(pp z5;;N{`ohc7n8xq)gq0&%gw6QZ-JnK(x)bbelquiu1Tu8++7U|Kfc9c|g(ZKs56i(K zmx$5GS%(-m|HjyP<>p6+FWP|(%1HW3{OlBvSC7vi`=PGzG6qx;e#BUkulfXt(Chfo zi>7?hNtqcnfO=#$l^Va(=?O2ju6c%yil#yh4CI0?z=xBWD-eg#YfuqB^Kz z81fQvPZs?OB#zGmHIQhB(DR)W8k)o(kNl$HCU6$i$#7% z>IQ7NER2+|h{H$I56a}zfcV5}c3@D7K|-O%=-`Hol{vh!6NdoNu|WKI@P!|YH(sR7 zH^axKf;SrtLzoE!+p76-@wL-`^FY2Drd|uHEn;G`ZT0I$#dRQogg*q=h#X`V1+zQ{ z*QmS|4}stAJi`1C2;&M?W|>j-dmu8G&(I6()(#yhz(qh^7`%Dx1eL*YK0*YOQAHNHgg3R)Rxy4z1+uWa z;Qf6FXy!53+S;0H%pWgo+y@r=M@D|0SOIIn3o@dG@evPfld|E^+LKci`@x(?KibkH z@E`||KFHS!UlIZ*u$w>+A?EXwid#Tv+kbl06x-#5Is zbovz|Z04!Lx2jdsVNmk6Ff@jUM%yXFLCPXQ69eOEeZyg;$=oW^;4`#}W#RLSGVl=G zOK0T5@*6{L0*@?HH;5O4xXOWCGA)N=znC3^1R~}*6Y^YvpNU9Qgy}pTmKbyo(#D76 zr;pj%hF>0j-UKW`OPQvEe}Mbnod|zQ-Xy_+XWoBf#NX^Cn&!Khd0mYc%&_+}^b#5v z^J&ouAqaWJbdtW#WI*rq6U_Mo)H5BXb{UsIm{4*>q! z{=@wKzjS0I2e~>sOL`F0K6k1(+au@G-hsUr29KPO`(u>0BnsH?08kI-+yp>8xOburdN?83t zIg5y&S;MLJW~$@iC#9-gcvS7EYwNxdIr5k!9ep9m*HDQ!kZTpF#OhCMUQ7JU8cyy> zC3S1^_6ZnWux!q$MsBKeL9Ht906Q#lx0y z4GR^wjJ|H)JGO=W>JuX+xf=yE3*&2u_1WjTMGdotV>X~=THp8W`h3{fw%78%6yALT zZSr_WOH4!IrVI|SO^D{lhx*@!V{-pM*uie+mN?cJrNH3 zJX@~6ct0aP6wq5;S>STiwCdBePgf4c?r0v~JD28&qyX>Bfs@i!9>v#WaPBl~EPiGU zFZZB|JN>(Uo)VFi<7y2_>HgXp<;UJmmXs7yo9to}6bW#{CM3Xs#dnp#do@=ler63f z-;JA6O~;Xb(vNw!Hn(!ib#G-}>6j&wq9R;@vH~W-DU*9E!xQ?<8eZ;uZY$d^I`^sT zu|0nczt?&2k)BT6zBiJJyyC01qxT3wCX2v%%MsByr$?a?rq}h=5T5Io;)$AmNw3;ZpjC+^Csp`bmy$nA87QB)K5AO>?07xdV{5&`+ z`!o3X%o?sqf!#YsjxB%ws(aBpzDqoEC65^|ow`&~#t1H3GQJI4;DQKG{LC6|o>H%_ z9DKfJ?1`;6ZtQ>9VQa}L9j!*(m6#D+h%`Ea#Q!lkJ~O6^pW^+DcxpP=;>D=0oBADn z5P$TNWpdX~Hg|_ySS~3@@Wi#}K{7av&xebjS;NaMn=(D@=CVKcURa)dK-)d$X29^l zU2jSX5WEBu#-qd@QkWoMjFC9Fb53TDu9kO;AAQea*MJ!hA8N-{wYWWf7V1b`;Um7W zC0FIO&bK~IDsZIjm)s97xBXBEal^DW5=R_Qe6ZrCw0RYp>|MOA>&p<^8aDMprxy{> zmpz{tY2I`3f?6kU-55POvD6How|Q|T=zMbiiT``iDr8OTchi&5MC(q5AM=jP&)o%~0SjpRS% ze>pfgxWWJD@=JS>4KSoZ$Tb`%NwJ5|(ZwCFBK`mBFPrsOB(sF$Uo#c7z~7Mn?VVgR zufMa4%WwJr*G&F*pj2h{xOlB0MxH;?7=9=L1!Uw8@*)8NToRN)xDA_kL->WrFhMCI zls3gDa#&P_T@I!SlBnPqMzC8|E)YS72pkpc?g@CcIDBY`oATr14AWx>`4g)sK9bL+ zrf?T^3?K-tQkWQg%_=Qti6jfY1#)TOn8b946xrAjImqtgWT>i~wQVc4ybXQn_B$Xv z6Fz*s|M40P?f)eGXZpXRgTrt7pJ}Q7m7m$HKZX4Lvi819|1-q@v-Nj%`c40T+5CSC z5UtIR{Bh3FQ4a3zQ4WsIZjMoMxszP(?&=!jW*;5pEO&H>mfJhH#JI;e$8b2GL#064 zmPUrRY9dXiRtnNSaUuOv?OG>JFHce^Z9%(nTD6Le;j|sniT>hv1 z@9Y3M{I~r7!!!Kz1;4faysPu)VT(2Y{`$K(I^q34zx6+H2LHX!@2@|9lWx z^}nz9KT7|O|NSRZ{=;=?ZGPnMH~;_PDgCc1_^tgf#!~##0TF)vJ^t_F>WK4yf7Abe zI`iMJ|0C;L!ozZ<<0`gi=tKVRPO zLZG$zk-y*k|GQK9Us>Sm{jZK>2eAJ=o4`fdODC3F8hAla`!ozVGfh``@le`f!4b@*-n`QFm~lIP!9e?kJ8b2Rp& zt80{-vs`ZP9OV$@o11?8gPMI!e{3f%7yKvRSCtV)G<%Q4M z-?)76j4of{A}1`x`Wat=_)S;6Y_1^OH@+I+cjk*?jDv-%5kBb(F}gzWUA!ntIUH9L zqpKOdH#fRk;CoA4t#P$6y4vEq@zoB$BXJSV(G`tLAzU%|j5E5F_%2=@@SU!NOqUA3 z)!AGfabLVN_-=e@@tZC^u1>f*XLF_EzIb)P_pZ3Q;p(2n)dTnF`ct@i;RvvH+lYAVODN^ zzHx$E?o^m#t@$&#$%@5@Xt zuyXc&vsU?ASaYVcR?0h_w%AzKZlzuB4|zJat!&Xa=O7D1GiikwX+T!-?pftT*xJk< z-*Q!nLB+;R+UT*XoZpIp`{WLHp5-q;p?_|-b*-x&4GLa*am>Z{PSbYSH@vx|hFhL` z<&Pa6D7~_7Y!R2Ef%cI-e0w~xolv#)ct8I!s;hRcExUG|`Im3m6s|{(uo8XGNZQ8B zvx-4?&zo?y%i@K19{bd}(&6Opnnx{4t*%++TJOt~-!?0m8oqt9+Gdsh&#sSZYIh8( z8sW8l>5Mgw@lA(!`|LDmoJVRA)$FQQ^ZD8}?b0da?t@%C=AZKn+ql{8R@&`nQ?FOt zQC!jP{=PEjyeH>t`ytY&R=a@cS#2LzX;tvCZ)EMRWddVw%?llMVCI3Iy#_sN=9pBv zPQ^!e>$lrF;N&iong@GtxfRiQKsn#rca*0q&R$q;ki)ZAiIq#HC3T(YXF0S%@s9yD zO4%+69=l2A9yGxJfM0C&zKZrIt~8u}Icj6bmf=TgHJs`rH%(pUd|o2&|ep%(>7c)wceRlGfJNeD_$ThcV|gx z(6A=quRE!)uN}obU%mg*t@cAq+t%Oks&J0t7K6e}9*j9ZynvtFVeFp`5_)dvbnbld zJ&mgs8}+#9tlAZWFEl(~X4S$`d3XFF_jRc~IL+6$-c9G=?fti#YYxm>&{v&!seY9U zIUNT@Z2loc;`sTb+sdsJv8(HPd$V(ezrskL4wYjIQ zugG0<>XMlL%e6jlW)$06LEG9c?{bCTgX99E@BcMnxlKY0H-2Hc3(cO#eA+cY-}%$r zz&s&uw#n-c-Q0TI#B6H@Vc_vu9wu#c0z}(^CUG{n@nkTsyy6 zw;gPF8uE zy^D8o-4Q!@!K6dYgV*b9mv^#>FVL`WnU7-@R8vL;+*HO@%&kc6=&hVM?M0>8)B7HI zR`Ie)SlwL}yL>6Vrbi+3*dZ-zo;+H|dYX5!LfyM((r zodhwqR}UFgJef;IP)$gl5xHKgB zqDk!uS>=snl?yk0&FU-tJH?GJ)oRF`-KiIP z?nX0KbxrnvcY9k(y|VY6^`^a3Vp6?kOIGTqKJ8HUVRz1}UboN3wpoo_J+G)dZAa?9 zFYeD=1EzU*+^u-AWc9r27mChVq4SwocKXciF_QwXKHKp*O*bMzlXPU@mDYB%u2pHW zr&_Ce%B*tY7Uz#QE7#@l)J=n26=UQ(TIVx=-)D)-%hd9v%65!Cx}k5eD@oSpCx)zA zrLTSJX#dDcXGVOKBlui61)#^+jIewEW&kMrX`chdNV z-0UCgroUEwargW!Hd>q8FV7KB<1f#n@B8?Vw4Z%8^~B~Xp`NZATi#wc#OG<(fOntQ zZE9L-b7IAcy+ZU){>ry@Z>Pm?O{GB=+qQ)N>2!Yn<((@QIfcso)}>bevx?8w`u7}* z9B`BG>+Jd@Q{AhINb%%FV zoEQ=3)8SrLd3{->_#9g>y7x`}>!l94=S;3uZChKL1M^#+sJHe})X{;n?au8nKW08B zeoE-tkEd!Eb}9b2W!T~Nii&M|pExAT_qhG(LLdK`)j!lZF?*I@RTV?UiQ+K1$lYC}qR)6_d^FOIVH=q4_IcR_Q_)t>YF|Jvi`w zuDqJL%~SK*?!TbWUTtzZ%zs|^+|=fEYF@r~sm8Q5b^Wg{S*^~s?p<=lyw(p6+87|l~wNE&1v?FmFNDvUabDn&COq~ zeAZx>>79E;Qk!!DLuREFTJ@|}wa^~DM<#T>*SN`<+t=5bM6I_g*)D$P#pBnnTHkl@ zaLHLJ^6>4qh2*herCmGqyAtuh*QxFJnI(d&nU9mEES^?#TH1=a53hST25idTf7Z<& zH>>ngZkc_fZ@a8AxL$T26#DqpJ@5OCteXtEIl1(fuyuR0%3ph(*5FR(j=fIoGi%ga z-?77~m)6m-Z|3(eTPm!>gaLE6IFG0_I`H`JT07r&C^NUmsC(^m$F4b3bVS1TVt)qr z_)ug*-4U_wo|Qd|SF->3M=u-M$vYpCy>qC`j43PG;#{cSf`eDuyxXGx*edtiWid8Y zi}+YJod2@qNZ&s?O#8CoO?ZbDV>b7x_q^y_XMc+x%g@+-xxUx!%u|PkuPd7OdAiAR zbLWlK%ZxI$iXCxUsalvi)xN@nxxLC4ZTBY7re)5y?d;NS73|na7xobR9T ztV7;=vDF`*XdwMO=uj1f=8;eM$i@xcapOZbcdoZ$e!07O6(Luwi@0qak~(BhTwu?Z zW!^6goMB5<<*@hCT{&`_UYB2gV+57 zeD9yhW4HcA!}bHF-{>dVJUl35n5@{4Nz-SK`YZYBt-%!@51IeOb>PuNmv-yMIRu6D zYQE_Br2&4y{YN()yD%+$+hxzULp>&i9<=P~KdwzgW2;YTO}tAK-n+d}`=ckGjfj8h zIb(!php0*+vvMv=$g|G9#=hE5N{${ddy&WbE+dCe73`Lc8=RC4;`&|WP9Psy*m}0FynyLRCn2(-7C!cDKe<@q# z9qiVxB?V8ms-r%{i!pK)Er%8rtlH2V_ zKKbx^hixE=eRa|H8dhC+f9)kdJp|Z+u>+)9{QU20%khc9$J)@NTx?fB;LEA z|HB?<2YW_XA!C&^KO zc~T;&p9r&EO^o3f<`H&>*{C-a^@DR_u3+Dr4tqr#*uGkz4^uv&FJ({;?arNv>zPDi zin-FXM0+7~58uq2geAvXDrs2f+M+y3&4V`v&F-a}|cR$JE7rtkX~r z)SHeqLErwEfD16}G1rYTXQ3OhUYNh&aFheAnX9lKSbL2L<`S@ihvWHFtlJcmx`Csw(OYQ&UEy!Y2-?ab3 z{O{`OYLx%U?Efym-~X4zME(o68vFP)09fo($<*<6k|!sO3R*g;eu>_1J`TJxt93>YrdW>|8h*m7`bEsBUpVYR+ml2~YJ5<`9H2Qia#n#VxulBuR z(JpsU-@t3`MTfr}*FX1Jea)dQ3cu8ReE(td_O55Ptckey=G~(jpX-{gj0z#k`qIgDFOT*9wDA4b5J^s(Ua!Yi3-adDM%c}3Z$0_Z)8UU*p4FzToi?pQ_`VG% z%Upi6BgCgu`8UHxO&;#Db@dtl4Y}W1ul%b|&xr@$+83~mJz@D^Uc(j(_dh#zdD`{a zR~D>ndOM_ao|W~+P0PFT@uB@U=D*96FK3D4am&nB!rD;ZYTj_O$jh&8O-zzXk6p~O^J$-1HH%G{ zv~kZ{*|ck)-xf;SHv3$_$PZR6-^?hz(YHqF$(z~~w$5?Q;Z*8C=QiC##txJ`xZc8K z_m--8T6R>Q3)|i5khk+r**w|2oxL1C?73r8<7Rz*WnH-(jdsSokLLO=Oo)lCJ?_TC zxikNAYMkf8vC7tqXH*Cs^wG( z^$qRkuBXC0*2KM2H7M3a8c;Es#ob_;~pMf zcqZIDPcPpW7dzDYz-dz}?H>EG%-pc&UH0~x+SY7O+V121yF}!-uq$JFZTQmDZZ%@2 zE}c?j>XggF9~9Ic=TasgUfn&?=Squmd+k(j?y2PS%o;Dxv(>D*-L(d-yU5Zm&3o*) zVtK!leakh^Ww9?l$?xg0PD64X^cmLSLTH&cr>qJ#IvOwi#BCcExuDvO!cGeoe;ici z#<|f^WjAlDZ22V@S0V7i%38^jhlK7|m3Jtx`Dn8u`>N$~cim8_bB#;8?rpDgtW=*t zvrXK~bq-v-CN#9z-3JGcC)c{ev78 ztGvp6Zr85)#mZbN(ko(TWXk$l5yPtn&YCvAPqh|D%Qv67bEwVwaKE9uN}pMq`$DxF zF4hyb`7Lcy_*RL&;|o?FSY&gxWmVh0ayOTraZr}b(I)>0n+?w|R=-l}ohEt8KF;-+%S^Sw z^2u|DGIkf<)@d}BTPZbp*nL2B;>ui)9h}PTEIj$k`umR4)s9gQqI#w}mo5LIVb9%f z9)yKo?mB;Al4m(x+29r%Puv`^ptIxk5=YxDUHE42tK5~NZ>BVV)z^K8)rRLAh9AD= z?%CqXh^|=S+0+V4xMZ9s&+n(%jfa+cQ4=uKh3r4aLVJcMXLL_ZXansy~Rn#;cqUFUK zw%I-X^@jk{S9#@ruCf-+Ig~;6%LlIF%<}bX`DtPGj@_3H`?$p9O|Gpe+v{KSHJLSJ zQA8_6YQDB!7AA#fN?v?4DV%Ru-ClL?Z96?=ZL7+SKbCHk|KRM+k0L6hz6-4EJ)^w3 zN0TkZlKOdg`c%EB{^RVQrh^xiy<(<|8uG|BmvvLiVs}Tcb9oXMl-#A?ltY$go3^Q) z&aKKjDfxVZHOe>hUMe)X>o0hF`p~IU;o-qK7f$UMIW|K2NY?UDs^al(x2>u#_iydj z5AD`+OTxBtdxu@_JE&OUT#GxN-!Xnt)5s6wbPF4nx3KqGcrPt(L9_k?H@xp0zGBg; zcQ&OyI8`<+C2dxB)wVA;3e3&7td)O(qw`8$-j-D0%V_Dfs}+X7F5Oaje8J&2RgO&T z-ZsBt#Ovx;2k7cwSs(1_svUUwW`ifoin_a1>|V3x;F_;&E9ThH^39P}i%u1o(0q5y z7@LmWLpN%t4e;FUGxg$(-37O<_bsp3@VLOVcem`;c8*BtdTwXl?mJi1+%UHCou0kN zytJROxr={t=eieL-ftSx|7P;}qpeFQFFss%CThvl<4;nrq&X$d37cEF{^bjulDbYA z7F#!ut@_-xYc8sm`|P9qrfg_7%w%hh=t?&WEY6)g*$I&pP7Z&VX!N>g`qK>#pF9{W zPn=q1kLQE22PRewJAeCCo`vI{Uy^T7^q*O1{=E?AgTo3cJr3j?TF$%1mi~=2W{0L0 zmJDuF)_#3e!sOr%z3LS4itV<$LWvdCHh7IM(c8DdiLpIK`|e-8Y-stY7A_C1A02%% z|Bp#+J6}wx{GyU)?80HY-LA}vpE71{b;Y(4%BIctY`VREUZ3c=;@g83HoUmC^&caY zP6dxyPI}O{X4AWKZ2g+$DtfeLQTGN*)^;sfy{f{gK((mn)y;G0-`5--dwQL#zTo>+ zzFXTmoGRO=$EOFbH6KpB(xTMEoetsB_-Ui|j;qwkLZR=w{aM1+JdOA4imzPXbbQ;2 z=Wd%ePi`RHesh`c;M{p#Iv1{0ZR3D4H}mwUe8%B@l_8&dbX)rN?cU(Ph1Pxh$kyMx zq(0DhrY87o#Zu!+=dE_-%Hp%hb1DrrU(#ffrSIh0v72@dcy;no?p3EJJDgd!Xw-{- z!KWThE}iqEWQW)6(&I}cPaZR5W20U6MFLX0_eotf;%edEMRt$Xg^wQfEc#}X$hre& zHTgW1dn<`sqEmHj)M|kH9Or#)Q~Mon+_+M3f6ml&^U$`++xvS;4wq`4=3MCbB+E9> z52VhP46s>{!`Zaj;(&RJ9t9_k*nVZthUX!cYoBZ{YTdnNBad#|HV^TvWtr6cZZq4> z_AOh@$kn}=k4dL3TGf!x35n0nZkx~9T=e!iIPZERr-os>hx*k2=v8&hkhf!8TfaD= zkyVVU{I02GoBQ^y-`{*UOz}F;+Y50ArUgTC3){b9mV1#+FG@~ydRA`vPX9N%a;bX^ zacFn*_K7NW;$yDHzkPrGaHk1Ndd;*BOEYN__*%B7N6BRKzLEXQ*k}vL207-cW}=)r zr)H2z9+MQC+&P0!&EKsk99?~Q?y?6a+xfZPh%SIbt_JTi9p2_?krykFL5sU50f$ zz31(V+BaH_`t z)?b?A@b;~>e&xww*H(GvXm+*Ym>0Xxf9zAdhh(YBbK$_5OCsllCsd92<6`2g#;SRp zP0BT^u+pvmsVPm`A3l92U*U+B22S!UamzNhhdvl0xkjwgEOH00N(Bo{EBKIZ1U zGvz+HKdirIhDFS@Mn_|Y%uku_xb}>qRY>5FSIrg6W-NX@O&VDG==6c_X2>QDp7+uD zP@CmrT}x`7#@#vFxl37xch4Vo9CmU|E%T-oZ!ABZ=cp|8;>8cD1lP}fmWDK17O$B- zVMJPMj{#5KSDU}~P3+2pyIb1Tt=ai`SuLFTDO1~Y>8GFfbauCzr}|ZRQ&fBR>AGZx z+x>P+OJ14%fonc*Lc=*H4|@&iT&hiQ>COX!oLoFpZg#4nldn3uD`&#&8I?VoJP&Vc zzOD7vyJdHes9rg&oB8P%b7nqlSEJ^HnPpR2Ht2J@!}_%Y?e;Zply+;;=;scvMs%4r z@$B(nlO9VR$6XjTqjsm%J|o)(FJ5`*_P%#hcbw>OD5BC6|G6J+XY5=3=e|4p?kqgM z zUEAd8&RLrWy!CXNbn|_)0ad!q3h1$;$i3Ue_L<~)yRgH;M3eWctbJPMjGeXU@Zq)6 zkMlmP_pr_76Mu2R+lpNp%^%#|w(juhW<>_=x9WEN>CS1T9q0dy%|%Kh|lKsxg3i0PW9^ZzDJ8si&qtCIQZs{fY8}E_2h&{((a(^$K)Sh zA1}JK&P4eZt1Zg>E1mDnJnCKdaP(?vNV%LnG=b-Pl+95g%C}m#8$0F%ov`9^od0v% zB^w9xGJ^}1+WyjOWz}gNpGub`EE=?F*YnK*<)X$c9oA@A?QLs24oRBYDeXvV+VII| zuKDaA_bB3}ern5`U&=1ZRdH(GqS~={Pn29cKDk4K!yVd($u!o_ALx?5xIen{G5+k$ z*nH3OuQ?l*e{4fi7B4QD*}O>KCn*D6&PKb%meOsoC?8%Ypr+|Sw~B@G`^!6)*fp>6 z1`DTV8*Q!A-Y@t(JM>+@LRE&x^c-%MbMK3yCEnKSy_|dIY%$Mji| z7L~EPF}$DE-UE{h%o-hHF6~@s?S@?XUiO{G&i_zv;IMU-whgOry3J7UFZr&%zj(Dr zQN^Dlu8+(SWane9Z&Gq+50B}kcWTZSZk;sW>h95xN$(Q2N7&pBzEZm8+qV_(2VSl8 z=i-aoF5a(u`_{%uwY%ml((eB1wF@loTQ^&F|KWiqgVIhnS%2=ZlhVumO2qNt)3W$g zv2~O4-mA6kL8IV(^~aZg5p*GU;}U&5)(s48+In!aizfB5NXk0uVXn)1NZJ~8M-=*CBjHeEkBC4Y_ig$F!qboS|^$LAUx zSXOSgf49ZW#!ns}J89F3meE#;Jgl_O*}T)*ez+A>^2nrT zrRMKloO4jC-FePesj+%b{)NkAz z9{tk8G5e2Pve$+x-8$vBdf{HV&9tr;?znPRh3fYWl+4>6I<~S!($Jgznl7&HQLE3S zg!U$}?n_Ii z;loYJdVMKr@^Z+=C3E*Zf94B8%>op!7macQd?hrF!a33ro_vYDs?N}CwIG& zw_J!pT

-&&@qKi+ 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 AH~;_u literal 9388 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 diff --git a/libgmem.spec b/libgmem.spec index de6d188..15830c9 100644 --- a/libgmem.spec +++ b/libgmem.spec @@ -1,18 +1,14 @@ %define gmem_path /usr/local/gmem +%define with_gmem 0 Name: libgmem Version: 0.1 -Release: 5 +Release: 6 Summary: Library of Generalized Memory Management License: MulanPSL-2.0 URL: https://gitee.com/openeuler/libgmem Source0: https://gitee.com/openeuler/libgmem/repository/archive/%{name}-v%{version}.tar.gz -PATCH0001: use-ioctl-instead-of-syscall.patch -PATCH0002: fix-three-issue-I7YV2X-I7XQMW-I7Z2RF.patch -Patch0003: Structures-and-macros-use-the-default-definition-of-.patch -Patch0004: optimize-headers-file.patch -Patch0005: add-install_npu_driver.sh.patch BuildRequires: autoconf automake libtool BuildRequires: gcc glibc-devel make kernel-headers @@ -28,6 +24,7 @@ Requires: %{name} = %{version}-%{release} %description devel The libgmem-devel package provides header files used for GMEM. +%if %{with_gmem} %prep %autosetup -p1 -n %{name}-v%{version} @@ -53,8 +50,30 @@ install -Dp %{_builddir}/%{name}-v%{version}/scripts/install_npu_driver.sh %{bu %{_includedir}/libgmem.h %dir %{gmem_path} %{gmem_path}/install_npu_driver.sh +%else +%prep +%autosetup -p1 -n %{name}-v%{version} + +%install +install -dp %{buildroot}/%{gmem_path} +install -dp %{buildroot}/%{_includedir} +install -Dp %{_builddir}/%{name}-v%{version}/License %{buildroot}/%{gmem_path}/ +install -Dp %{_builddir}/%{name}-v%{version}/include/libgmem.h %{buildroot}/%{_includedir} + +%files +%{gmem_path}/License + +%files devel +%{_includedir}/libgmem.h + + +%endif %changelog +* Fri Feb 2 2024 Yang Yanchao - 0.1-6 +-update libgmem-v0.1.tar.gz to 4dc188c + Skip building when the kernel does not support GMEM[I8Z5F4] + * Wed Sep 20 2023 Lemmy Huang - 0.1-5 - add install_npu_driver.sh diff --git a/optimize-headers-file.patch b/optimize-headers-file.patch deleted file mode 100644 index 819e4c0..0000000 --- a/optimize-headers-file.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 074fe4486f48838690e674a7e0f394705777cc93 Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Tue, 12 Sep 2023 12:02:03 +0800 -Subject: [PATCH] optimize headers file - -add linux/gmem_dev.h in gmem_common.h -change syscall.h position - -Signed-off-by: Yang Yanchao ---- - include/gmem_common.h | 2 ++ - include/libgmem.h | 1 - - 2 files changed, 2 insertions(+), 1 deletion(-) - -diff --git a/include/gmem_common.h b/include/gmem_common.h -index a400b37..dfaeb56 100644 ---- a/include/gmem_common.h -+++ b/include/gmem_common.h -@@ -15,6 +15,8 @@ - - #include - #include -+#include -+#include - - typedef struct { - int (*FreeEager)(void *userData, void *stream); -diff --git a/include/libgmem.h b/include/libgmem.h -index 35cf463..d68aed7 100644 ---- a/include/libgmem.h -+++ b/include/libgmem.h -@@ -14,7 +14,6 @@ - #define _LIBGMEM_H - - #include --#include - - __BEGIN_DECLS - /* --- -2.41.0.windows.3 - diff --git a/use-ioctl-instead-of-syscall.patch b/use-ioctl-instead-of-syscall.patch deleted file mode 100644 index 5ee43f5..0000000 --- a/use-ioctl-instead-of-syscall.patch +++ /dev/null @@ -1,318 +0,0 @@ -From 762c6c0c4c8618fc95aa25696345e369681d0465 Mon Sep 17 00:00:00 2001 -From: Yang Yanchao -Date: Fri, 25 Aug 2023 18:39:54 +0800 -Subject: [PATCH] use ioctl instead of syscall - ---- - Makefile.am | 3 ++- - include/gmem_common.h | 16 ++++++------ - include/libgmem.h | 24 +++++++++++------ - src/ascend/gmem_ascend.c | 22 ++++------------ - src/ascend/gmem_ascend.h | 35 ------------------------- - src/init.c | 56 ++++++++++++++++++++++++++++++++++++++++ - src/libgmem.c | 18 +++++++------ - 7 files changed, 97 insertions(+), 77 deletions(-) - delete mode 100644 src/ascend/gmem_ascend.h - create mode 100644 src/init.c - -diff --git a/Makefile.am b/Makefile.am -index e18c2fc..06b1435 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -23,7 +23,8 @@ include_HEADERS = include/libgmem.h - lib_LTLIBRARIES = libgmem.la - - libgmem_la_SOURCES = \ -- src/libgmem.c -+ src/libgmem.c \ -+ src/init.c - - libgmem_la_CFLAGS = $(AM_CFLAGS) \ - -I$(top_srcdir)/include -diff --git a/include/gmem_common.h b/include/gmem_common.h -index 994f953..a400b37 100644 ---- a/include/gmem_common.h -+++ b/include/gmem_common.h -@@ -13,22 +13,22 @@ - #ifndef _GMEM_WAPPER_H_ - #define _GMEM_WAPPER_H_ - -+#include - #include - --struct gm_msg { -- int behavior; -- unsigned long addr; -- size_t size; -- int hnid; --}; --typedef struct gm_msg *gm_msg_t; -- - typedef struct { - int (*FreeEager)(void *userData, void *stream); - int (*Prefetch)(void *userData, void *stream); - int (*GetNumaId)(void); - } gmem_semantics; - extern gmem_semantics gmemSemantics; -+extern int gmem_fd; -+ -+typedef struct hmadvise_arg gm_msg; -+typedef gm_msg *gm_msg_t; -+ -+void init_device(void); -+void destory_device(void); - - int gmemAdvise(void *userData); - #endif -diff --git a/include/libgmem.h b/include/libgmem.h -index ea313a3..4cd918b 100644 ---- a/include/libgmem.h -+++ b/include/libgmem.h -@@ -20,14 +20,22 @@ __BEGIN_DECLS - /* - * TODO: Remove these "ifndef" after kernel upgrade - */ --/* -- * __NR_madvise 441 -- */ --#ifndef SYS_hmdvise --# ifndef __NR_hmadvise --# define __NR_hmadvise 441 --# endif --# define SYS_hmadvise __NR_hmadvise -+#include -+struct hmadvise_arg { -+ int hnid; -+ unsigned long start; -+ size_t len_in; -+ int behavior; -+}; -+struct gmem_hnid_arg { -+ int *hnuma_id; -+}; -+#ifndef GMEM_GET_HNUMA_ID -+ #define GMEM_GET_HNUMA_ID _IOW(0x55, 1, struct gmem_hnid_arg) -+#endif -+ -+#ifndef GMEM_MADVISE -+ #define GMEM_MADVISE _IOW(0x55, 2, struct hmadvise_arg) - #endif - - #ifndef MADV_PREFETCH -diff --git a/src/ascend/gmem_ascend.c b/src/ascend/gmem_ascend.c -index be54813..6181c07 100644 ---- a/src/ascend/gmem_ascend.c -+++ b/src/ascend/gmem_ascend.c -@@ -19,13 +19,8 @@ - - #include - --#include "gmem_ascend.h" -- - #define LIB_ASCENDCL_PATH "/usr/local/Ascend/ascend-toolkit/latest/aarch64-linux/lib64/libascendcl.so" - --void init_gmemSemantics(void) __attribute__ ((constructor)); --void exit_gmemSemantics(void) __attribute__ ((destructor)); -- - typedef void (*Callback_fn)(void *userData); - typedef int (*ACLRT_LAUNCH_CB_FUNC)(Callback_fn fn, void *userData, int vlockType, void *stream); - ACLRT_LAUNCH_CB_FUNC aclrtLaunchCallback_fn; -@@ -43,26 +38,19 @@ int ascend_prefech(void *userData, void *stream) - - int ascend_numaid(void) - { -- int ret, id, fd; -- struct rpg_hnid_arg arg; -- -- fd = open("/dev/remote_pager", O_RDWR); -- if (fd == -1) { -- perror("Get davinci_manager fd failed"); -- return -ENXIO; -- } -+ int ret, id; -+ struct gmem_hnid_arg arg; - - arg.hnuma_id = &id; -- ret = ioctl(fd, RPG_GET_HNUMA_ID, &arg); -+ ret = ioctl(gmem_fd, GMEM_GET_HNUMA_ID, &arg); - if (ret < 0) { - perror("Get hnuma id ioctl failed."); - return ret; - } -- close(fd); - return id; - } - --void init_gmemSemantics() -+void init_device() - { - handle = dlopen(LIB_ASCENDCL_PATH, RTLD_LAZY); - if (!handle) { -@@ -76,7 +64,7 @@ void init_gmemSemantics() - gmemSemantics.GetNumaId = ascend_numaid; - } - --void exit_gmemSemantics() -+void destory_device() - { - dlclose(handle); - } -diff --git a/src/ascend/gmem_ascend.h b/src/ascend/gmem_ascend.h -deleted file mode 100644 -index 5348c2e..0000000 ---- a/src/ascend/gmem_ascend.h -+++ /dev/null -@@ -1,35 +0,0 @@ --/* -- * Copyright (c) 2023 yangyanchao6@huawei.com  -- * libgmem is licensed under Mulan PSL v2. -- * You can use this software according to the terms and conditions of the Mulan PSL v2. -- * You may obtain a copy of Mulan PSL v2 at: -- *          http://license.coscl.org.cn/MulanPSL2 -- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -- * See the Mulan PSL v2 for more details. -- */ -- --#ifndef _GMEM_ASCEND_H_ --#define _GMEM_ASCEND_H_ -- --/* -- * These definitions should be placed in the kernel, -- * which is a temporary implementation here. -- */ -- --#define RPG_MAGIC 0x55 -- --enum _RPG_IOCTL_CMD { -- _RPG_GET_HNUMA_ID = 1, -- _RPG_IOC_MAX_NR --}; -- --struct rpg_hnid_arg { -- int *hnuma_id; --}; -- --#define RPG_GET_HNUMA_ID \ -- _IOW(RPG_MAGIC, _RPG_GET_HNUMA_ID, struct rpg_hnid_arg) -- --#endif -diff --git a/src/init.c b/src/init.c -new file mode 100644 -index 0000000..08b2800 ---- /dev/null -+++ b/src/init.c -@@ -0,0 +1,56 @@ -+/* -+ * Copyright (c) 2023 yangyanchao6@huawei.com  -+ * libgmem is licensed under Mulan PSL v2. -+ * You can use this software according to the terms and conditions of the Mulan PSL v2. -+ * You may obtain a copy of Mulan PSL v2 at: -+ *          http://license.coscl.org.cn/MulanPSL2 -+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, -+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, -+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. -+ * See the Mulan PSL v2 for more details. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+ -+int gmem_fd; -+ -+int init_libgmem(void) __attribute__ ((constructor)); -+void exit_libgmem(void) __attribute__ ((destructor)); -+ -+int get_gmem_fd() -+{ -+ gmem_fd = open("/dev/gmem", O_RDWR); -+ if (gmem_fd == -1) { -+ perror("Get gmem fd failed"); -+ return -ENXIO; -+ } -+ return 0; -+} -+ -+void release_gmem_fd() -+{ -+ close(gmem_fd); -+} -+ -+int init_libgmem(void) -+{ -+ if (get_gmem_fd()) { -+ return -ENXIO; -+ } -+ init_device(); -+ return 0; -+} -+ -+void exit_libgmem(void) -+{ -+ release_gmem_fd(); -+ destory_device(); -+} -+ -diff --git a/src/libgmem.c b/src/libgmem.c -index a1a1640..9a34de0 100644 ---- a/src/libgmem.c -+++ b/src/libgmem.c -@@ -23,17 +23,19 @@ gmem_semantics gmemSemantics; - static void mix_userData(gm_msg_t userData, unsigned long addr, size_t length, int hnid, int behavior) - { - userData->behavior = behavior; -- userData->addr = addr; -- userData->size = length; -+ userData->start = addr; -+ userData->len_in = length; - userData->hnid = hnid; - } - - int gmemAdvise(void *userData) - { -- gm_msg_t msg = (gm_msg_t)userData; -- int ret = syscall(SYS_hmadvise, msg->hnid, msg->addr, msg->size, msg->behavior); -+ int ret; -+ gm_msg msg = *(gm_msg_t)userData; -+ -+ ret = ioctl(gmem_fd, GMEM_MADVISE, msg); - if(ret) { -- printf("hmadvise failed: addr:%lx, size:%lx, behavior:%d, hnid:%d\n", msg->addr, msg->size, msg->behavior, msg->hnid); -+ printf("hmadvise failed: addr:%lx, size:%lx, behavior:%d, hnid:%d\n", msg.start, msg.len_in, msg.behavior, msg.hnid); - } - return ret; - } -@@ -41,7 +43,7 @@ int gmemAdvise(void *userData) - int gmemFreeEager(unsigned long addr, size_t length, void *stream) - { - int ret = -1; -- gm_msg_t userData = (gm_msg_t)malloc(sizeof(struct gm_msg)); -+ gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg)); - mix_userData(userData, addr, length, -1, MADV_DONTNEED); - if (!stream) { - ret = gmemAdvise(userData); -@@ -55,12 +57,12 @@ int gmemFreeEager(unsigned long addr, size_t length, void *stream) - int gmemPrefetch(unsigned long addr, size_t length, void *stream) - { - int ret = -1; -- gm_msg_t userData = (gm_msg_t)malloc(sizeof(struct gm_msg)); -+ gm_msg_t userData = (gm_msg_t)malloc(sizeof(gm_msg)); - mix_userData(userData, addr, length, gmemGetNumaId(), MADV_PREFETCH); - if (!stream) { - ret = gmemAdvise(userData); - } else if(gmemSemantics.Prefetch != NULL) { -- ret = gmemSemantics.FreeEager(userData,stream); -+ ret = gmemSemantics.Prefetch(userData, stream); - } - free(userData); - return ret; --- -2.41.0.windows.3 -