aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/async_pf.c
blob: d6a3d0993d8812c8527274d01e8c08ce942746a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*
 * kvm asynchronous fault support
 *
 * Copyright 2010 Red Hat, Inc.
 *
 * Author:
 *      Gleb Natapov <gleb@redhat.com>
 *
 * This file is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include <linux/kvm_host.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/mmu_context.h>

#include "async_pf.h"
#include <trace/events/kvm.h>

static inline void kvm_async_page_present_sync(struct kvm_vcpu *vcpu,
					       struct kvm_async_pf *work)
{
#ifdef CONFIG_KVM_ASYNC_PF_SYNC
	kvm_arch_async_page_present(vcpu, work);
#endif
}
static inline void kvm_async_page_present_async(struct kvm_vcpu *vcpu,
						struct kvm_async_pf *work)
{
#ifndef CONFIG_KVM_ASYNC_PF_SYNC
	kvm_arch_async_page_present(vcpu, work);
#endif
}

static struct kmem_cache *async_pf_cache;

int kvm_async_pf_init(void)
{
	async_pf_cache = KMEM_CACHE(kvm_async_pf, 0);

	if (!async_pf_cache)
		return -ENOMEM;

	return 0;
}

void kvm_async_pf_deinit(void)
{
	if (async_pf_cache)
		kmem_cache_destroy(async_pf_cache);
	async_pf_cache = NULL;
}

void kvm_async_pf_vcpu_init(struct kvm_vcpu *vcpu)
{
	INIT_LIST_HEAD(&vcpu->async_pf.done);
	INIT_LIST_HEAD(&vcpu->async_pf.queue);
	spin_lock_init(&vcpu->async_pf.lock);
}

static void async_pf_execute(struct work_struct *work)
{
	struct kvm_async_pf *apf =
		container_of(work, struct kvm_async_pf, work);
	struct mm_struct *mm = apf->mm;
	struct kvm_vcpu *vcpu = apf->vcpu;
	unsigned long addr = apf->addr;
	gva_t gva = apf->gva;

	might_sleep();

	down_read(&mm->mmap_sem);
	get_user_pages(NULL, mm, addr, 1, 1, 0, NULL, NULL);
	up_read(&mm->mmap_sem);
	kvm_async_page_present_sync(vcpu, apf);

	spin_lock(&vcpu->async_pf.lock);
	list_add_tail(&apf->link, &vcpu->async_pf.done);
	spin_unlock(&vcpu->async_pf.lock);

	/*
	 * apf may be freed by kvm_check_async_pf_completion() after
	 * this point
	 */

	trace_kvm_async_pf_completed(addr, gva);

	if (waitqueue_active(&vcpu->wq))
		wake_up_interruptible(&vcpu->wq);

	mmput(mm);
	kvm_put_kvm(vcpu->kvm);
}

void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
{
	/* cancel outstanding work queue item */
	while (!list_empty(&vcpu->async_pf.queue)) {
		struct kvm_async_pf *work =
			list_entry(vcpu->async_pf.queue.next,
				   typeof(*work), queue);
		list_del(&work->queue);

#ifdef CONFIG_KVM_ASYNC_PF_SYNC
		flush_work(&work->work);
#else
		if (cancel_work_sync(&work->work)) {
			mmput(work->mm);
			kvm_put_kvm(vcpu->kvm); /* == work->vcpu->kvm */
			kmem_cache_free(async_pf_cache, work);
		}
#endif
	}

	spin_lock(&vcpu->async_pf.lock);
	while (!list_empty(&vcpu->async_pf.done)) {
		struct kvm_async_pf *work =
			list_entry(vcpu->async_pf.done.next,
				   typeof(*work), link);
		list_del(&work->link);
		kmem_cache_free(async_pf_cache, work);
	}
	spin_unlock(&vcpu->async_pf.lock);

	vcpu->async_pf.queued = 0;
}

void kvm_check_async_pf_completion(struct kvm_vcpu *vcpu)
{
	struct kvm_async_pf *work;

	while (!list_empty_careful(&vcpu->async_pf.done) &&
	      kvm_arch_can_inject_async_page_present(vcpu)) {
		spin_lock(&vcpu->async_pf.lock);
		work = list_first_entry(&vcpu->async_pf.done, typeof(*work),
					      link);
		list_del(&work->link);
		spin_unlock(&vcpu->async_pf.lock);

		kvm_arch_async_page_ready(vcpu, work);
		kvm_async_page_present_async(vcpu, work);

		list_del(&work->queue);
		vcpu->async_pf.queued--;
		kmem_cache_free(async_pf_cache, work);
	}
}

int kvm_setup_async_pf(struct kvm_vcpu *vcpu, gva_t gva, unsigned long hva,
		       struct kvm_arch_async_pf *arch)
{
	struct kvm_async_pf *work;

	if (vcpu->async_pf.queued >= ASYNC_PF_PER_VCPU)
		return 0;

	/* setup delayed work */

	/*
	 * do alloc nowait since if we are going to sleep anyway we
	 * may as well sleep faulting in page
	 */
	work = kmem_cache_zalloc(async_pf_cache, GFP_NOWAIT);
	if (!work)
		return 0;

	work->wakeup_all = false;
	work->vcpu = vcpu;
	work->gva = gva;
	work->addr = hva;
	work->arch = *arch;
	work->mm = current->mm;
	atomic_inc(&work->mm->mm_users);
	kvm_get_kvm(work->vcpu->kvm);

	/* this can't really happen otherwise gfn_to_pfn_async
	   would succeed */
	if (unlikely(kvm_is_error_hva(work->addr)))
		goto retry_sync;

	INIT_WORK(&work->work, async_pf_execute);
	if (!schedule_work(&work->work))
		goto retry_sync;

	list_add_tail(&work->queue, &vcpu->async_pf.queue);
	vcpu->async_pf.queued++;
	kvm_arch_async_page_not_present(vcpu, work);
	return 1;
retry_sync:
	kvm_put_kvm(work->vcpu->kvm);
	mmput(work->mm);
	kmem_cache_free(async_pf_cache, work);
	return 0;
}

int kvm_async_pf_wakeup_all(struct kvm_vcpu *vcpu)
{
	struct kvm_async_pf *work;

	if (!list_empty_careful(&vcpu->async_pf.done))
		return 0;

	work = kmem_cache_zalloc(async_pf_cache, GFP_ATOMIC);
	if (!work)
		return -ENOMEM;

	work->wakeup_all = true;
	INIT_LIST_HEAD(&work->queue); /* for list_del to work */

	spin_lock(&vcpu->async_pf.lock);
	list_add_tail(&work->link, &vcpu->async_pf.done);
	spin_unlock(&vcpu->async_pf.lock);

	vcpu->async_pf.queued++;
	return 0;
}
FE9h:Z3SwL Cʭ,}ɳ0H,ή_Rx]1yi-8,)6 &ZK]s@m#'RN숼 p!O}=܍n(O g LTSXC'"qh[,eM٦L'Ԝ?qaB+=} KqWIWlmj"u㼻gڵܭ #BtI=w-.҅^8iwQhy.9CAd71!XӆZMGZ,0" ܆ R dDtv&Jo{y^L^Dزњ& m-x8Xr$$srOC>=kB~0AaYj2-lD=K'IFè|<#׷pO9ysJX6~at%șd}f`{E_x}7i6_U)&wxAB 讑PGmczʹB*m]hpV";$V Dqtq^Ylv}w{_:c(t9G-RvseKΧ1gs*m)5LijUI>ٞ;N@.]zg=\AE ; F;V>$>96[o6id2fnh r>ŇDhw= D/t28>b?^p3hv?~rg$Wg=ñCCj@#6@m=Ԇۻ-jAܨTC z\dž.?;gԡo(f{.VQ*s37 qhVzjګ@x)al$+ AzJ(\xz;PʠR+xЛw*/<ҷ;hqؙ!]MPsSa]Cyޙ;Z^ɬkQ3['>E!a߬[կ5UyTnrlJBɰlJvW#{Df'P8w{ك\4nͣoqVnHn\'\ȖWC^ߺ{B[K=A÷KEj ;"Ƿ:+@,Red9igJ؛9 }Ro:Uig%#p3+p']}ϟs7@8/Nj b6ē=>uw^VPJLރ0$g*ܶt#,ܩ;-mLu9t(Aدt*F==U1VX\:h_a]^C{KT=@W v1&]zj,H$s~.FZn(i5yfsCUZOA#{(!^pjnE~yYӫސ"|x#Kbs|hxvWW}"INRwj|5U#]pD M̕O'l MEXS;9Bjni}0<`i~џ/斨[ Xr3\{fc?|űzo ԝpK J+02{ZgW1'`/"ufnِ:eGPX9Q?}CA_nbLXL@FtMUf.v\-k2(,ivrCF>GBf9ѕ|X80%>0&Nt!̤L+}?фa1>[-4 s2{f? ~pӐs`i26Xכֿj$|kcttZunl@K]NJ wO,,R 3Y $ Lj_܇ P^hߪVH&=T ̦>/vLo FT$=plԳZրm9TVhv|7,>a]8^ s4^q>uK=KI7G H췷JGӻLs8Y\AB]YdooJ)7>q0صfmCM[|6S^$NJ Zsr툜,C(S"Bl 9&o8MnȾ/d +_'s;0D37Qkƞ4Rܥn 9=@"cL J-}Eׇ7-7Vfѫv{DFIZfZAnscX/GjO S8XZhO?dØRd OfϞu Yɡ $n\dK:-+=k)w;#m.W 94l-j; vKRHq |} a0#?%ʫv93Sz?"2½_O#>zkWs'tb H-@;?$ʣ.I` L-I!lb_OqKfR ڒ aR?cF76䀅ń dO7Iol:=^Uӟi8H {e u ` prbr=-|K x_%B#BGmZ~#5scdHgY ')WDrEiv 뽋wVrU-x;.DQ:y[?R?PřL uOO. jiȥ\dq~)F>%(ԿOXSm!:ʙЎTߌ0xWzрyhK`o#הme ͋큹[pm|0 P֥pdK 1n B~M/yu9&p`I\]&Θ=CW > oSz/J_' sjކPcQrݧH!iS  as>uÕkA6G 92O9 JJroPP,R \<ٚ'7Or0eE5/z ԟ@ Ѡ-N ބ.o'= @~O:Th*|Bމm^6kd}c\בL쑁?wI{;r%w_kp5Fԥ|2}0ϑ_K 1].71|^G xjIODg-lݎ"c7"LRb|[4~oE,U+"ºͺt7e4WrvL<5Hר:ٵXjwΖDӘɈ^aWpxpKejCr 1Eҝֆ|D&=ftrV!vQ*>y^3tS_Qȱ[H3 lr+Ͳ@xʎw9 re- !RqX)3MD]WR]E'ϣ4 75|EZۙBœc%x-P5ɖŹ(srf:fțtLP5tnj ]n1 !1≓-G\]#"xi< |zE}nw w(U/EsLw=xMku1orT͐Q" Y=>0dJDR\z܌e{TFy1"̟x Ax+ N8 !܁3S[2uzo1>dwݕK3C9K ϤY]XڎE6Բե{[ HE K`w`U-ۥAcEIO&JOTmUrrT) <~{ V*4gB A3`8t&٭%Ӭl ^;'.YԦ/L_%Ŕ'{4)7ndW'H<{扪BJsC)ACT* ^<,ZuUr]$yn"J?jGVl[Fޜ\OF=gp" 9Y.+Pz^oɬ2к:+ƵƜ՟*JyG[{q lQbj|"s<2 }CbGt$c=dP#tҠz23^ E?PߔTH|*m\ߙru @omi # 0~}+j)h9XS7^8xlOS}پvI־|3nǐBgwwTd:k*|yn]~)j<0?L|(g㵛ss\?N ЯZ}r")FD U\pcUl$v)A/N x㭻WLa82PV`MX97)<#K;&U[ܩo ,ƞ;Gi'1tiB'qNՅ6\Ng-!hBs_SYe{:OX~ߙI8& L)O%V` ;~NUQ-1B2:9UE5B>+fـl7 7R2?yaA<\9Ll2x4; T Q*]EA8ɴFj@:S@b*T5aEvP{AzCկ XFCpCjX՞jxR7tY]k )g'p2gaq[:Oo&wG9ҙx*r,'t8hٛECzK aU=1',sqz" ID:TNms[QX}TyR4B&_t[re'Nt%$G\mcɦB@5VٚN t~^+KكGޓd~}nI7#?$Jry4`Ï=;h0}ۻ>ׄgYzs_!E_' \aqS|vb1C䗢gg[.e5wiR l1H~oHl}zistֻ)XҔ8{FubiJ¸8[')`J KI~Op-X1w&%l?*uջ ͝4j:^]_'k0[%U3d p1`hk]QPJB=t_`78*fN/`i>?3DŽ0KQ"|)V*P-y>9-Z )dAPw.Dv62LcEIB 7m%]ҳHYJW[z$+i#0~T>mGVTypL47ۀ8ʼnXVG {AeNFkFjB#dQf8gV^ijT]֫ߣVWFC5f w2VɐNjkQQa@<6XG-Unxjc, L Ka3ǚy I[ SnLtsz&0+~uFdr}p9V >j3H֬p5<*Vj-ŵngK凌"S_eu:Im#9k0ggX]9N<)qܐ/0Nz. Jv+hpgWN8vjvqٱ٫ I]0 Ř{OO>xxY椆x_t On8w+{FJ\fh=)-/gOd?vs;mit4lڶ{z׹s[QhSF%j jA?}&_"1r\E9JT<܂x.;ݪicG\Mxk_&l.%&?Tz4#uªݨ/84O*O*L} c[J ual4 aArw!0d0 zG'-p:"\'+]Ow%d< <*PXa`ǬErSy{w6n>nxID=sJl7ilݬ6[^S 5+UOVCўFM5G#•>t)+#9q8Ήrsx/ݧ5#ӘDZ-K)IX!$AxY*ZZӕU6A=)R=ݙ;\wbbwgbְ:.7kjl"kjZAR`_6)p֔]$D8&C&SSl~zdӑζYdnܥ/tltp ˅.z )6ڒA%gҦ4=wx20OD[N>ntŲS ^~9K$)at+~4~)yzvfs8?+U̖*#FÿAѨ_!F7= m棶eнvd"?~e .z$"pl aQ{8Zwcm3gBQWZN*XO7x#d3 !FSxFɗNP]u5%|.utcP~7ZÚ"{g_$uvG?s9T !m.";3ֱw>Tv}sv^`܇ҏ^!YkRH)ɩ/.!ICәBcJVo:6kM]ԥe~;Jc5a3Ah74׹Ni[Miܕ%&Jg,XA$_&Duj]~:{aA=.}i)h{ Y2y0ށB}l8af0p"sŦl u0U^W~bug I!3Xi)u3N[s,eYXv*NZEuz;[&&& dfj{n#ٖbl2z"C !`uI ^O7 j4+!?>ޤ3H !YIHJ瓓w+e6`h![nY[9nf_Wsr$Ȧ-Bnݖ/0nYnb_r3b&vW`oTҮ h@g zO6]\'ow',5>!c6gQ4k9jVhK-ϓ4DrLQ:zg!/2HZѮ,\ZDZߌa|I„&NIAP:rPewsBz#G[=uAWW } *$˪6cZ}@pAZzqR͗f' ( gl nږa'Gሉ5ME+ހgemJrD^}1޲3)fH[歛r˰'O ƛ#fl"4[0rQ˷Uk6ʌWs Ou'0ƆnHnBDɵE1q9'e >LI{nZ;Q*XdZnq؏4͛ $K$DXHܩ+_.]!SR_I3I5ZToR>I_;>-3l*]RY1l)T5@RMHi/u%fH1;\~ ͳ6WK$_ٌQB^]nYy s,Er٣O9S2䙨Ϲ3΍-1}6  !v!sI͐ZYB^z9fuUH4G`ЯP?T&C-d*m(̉%wP\# =PSp=>^Z76ٔ_:oL245e1Tcl|:Y3΄vUPOTc1#(k6YbXD;=zۑdY#V(' O1V+娪zEy\TL+QWЪ$[I2Jc &ӾdK3ׇ%ua/MXUU_fZ,[:1L"yG_ڇfbM?zΕ{sԴ* cϣpd.sG4# XipuL4uVȑʜbVapPmp"7(, F҇oYw/+yH &cw`]޷6㍝0Z(>MJ<_h$wgQ[ROG|X,gzTH8L]pKAgAjhm_ ׃>@ T+a[UrPfbR<%F}P@VtIHF~3߽49:p4& yO(C[xe:%K g1薬:5l*D($o5·3Nyl^ $QKb-]O#|K+G;1L$SAE?s-Eg*tt4؛Ae5Ki,a9ZV.v|N}r5]΅(A.C/y}t=>T,l=n jsKWkWt''CQmEag6L{ t37"nBX+ժ}4#ҧ(#JVWcfWOٜswMux^M b#-x^p0,^Hc~&W2AZ/Z$U0Ĩ_Y*I4}qg)@6ZrImL'~ ^U'ZL9D72.A[VFGN8;K62uIA8dc Ã0=5cRUQPĴo^F\7C%a%<37ۃ3e0Ș L*F4n&ݪb>)=z ս˄fveڟp1/ZRYquosnM^Qr_t>+gw?9 pVo/Y7NawZʲewj)iO/wڵZ ˟+Z Wnv^M]gq/E>G_70f_7_5ix8lE.d4IXAibXw>XL{`#[^l-vG_wG~͍."WCZVT 󎮲AT`\lYY< _m[9{xNchRT츃=DI XQkCU, %{b 3{`:dcV_|ŅRdI=+1LQ+0Np `wA"\@`>Kf9^TKXOWc,SʬXeR=_4̍GGzDXi҉bvrgFi|t"c1ΐ>yӈ\b?|MJ`µӢom؛\[Kk=}eo:lA蝿:#O]έ rD:N q 405 W%\iPshFRdzb]2օT҅SLrb>"&oou&º?~L}=Sin⾏Y!'׹Jkn8dPf%.N-%G kdO;%}6e^k,"ɦ@N5]{z鵔rw6? 4y"d}ǽZOfC :c{QD'-|G+eP/eE-JrMDY\L{_!C,Gtx ":'M6o <s,6F \ ̅'դ\^҇$$!I"-$S4!h#9[ºǁ6L4W̨,nB֨Y_8&t{s3?jҚ l Qbf0e4oV )$C_=ۺP]Nur.KwEߐ? l@gG..%Lľo#fH,R?:ӣ)-ߒ>(E)Ε|h`&6CZr3Uip-h@֡z&44%[MlDiwBn VK+7:x[Kɠ@Z`"EdeLI2!aq2t*.C q4+xgZ4b4c]8JS:{{fIW|Z <]t#$-ZOD270Tv6xyEً7lѶ(iT9+W0H|3%|i1-=VpVIhw'X-?̔${R\bxgFwD-ΐIfa~.#Ći4z1cM鋘|.% =*23DUzQHx\fkg($prEpP{Ρʞv]$bJ4B|C-:E:aW)_PoHs?ZX|TʷV\z$E8T]ݽӧ۸ַ1'KGW(<r?s5SQBVOR[΋x;?d&r `1 ̌#[%s!ew <ډKΑ3g!TUrj-%Oy-QoyfeQ]:RiN5A!:"?f$BN<hͶdoޔ#}8sDoiWQZZЅ#Ǔ֋įƷn\.Z$(5yKECcE>0 F2D@|Z2nNO [=&g&._"A^3&m.2H5Ɓ#<!f33Ee inS)7ӗ ,=;: hG0ٛƲqBrIr\o7"0L#'t}9e=wɍNbYܿUS:NBfyÁtΖ 6+ /+ң̥i$R[6;?UE}s b_.@}މSw|.uQYk  _8*]2~ϿK啞xEM$K'ms2j@ҦM]'7|+sk cA檍q:y[Ob̿C(`F:x#5ŷ4Lt}Dڴ9]I  ✲;)SׇQGa .r1TA'QS/4p|5sv|,;@Nޥ UZr%*Em#vb,=$icp *7_E)vC^au:>:ި'SG}]Lm!JKX{7_] F6godge3#{ilk?Y?{>$ %cnކb O._<]?yAuǜY>)+e4#>)ttc=?,mɤ3 c^RW|wn~`ٴڮyf]]J w /4CÕNnIjLl"Owd]ZDjn,i"h%\ÙnlPş&oY[rҬt?7?MIsځRUU)VK&GUtnt3׶^ ]TMoo$AE$smpAm?&҉:Q)Td|# Cu l]\DG'dAKH٩tp+E#>{>Yss^а 0\Xm") E%WQGGH#A)w ͹p$tʙuɹ(hdfZ <|aF^ /G. K״+um9VԡUm (C~% '6;<:t <4/$F{ucp2% DžeF 5u=./I6 =WZ3'zFS VA93y8̐Edm^GEd,ܝ܆\/2V$?qݣ:\$nЖ٦Ufh_L|:s_˥*tb'S sr"\&c5th,@h-`v~Rrۃ?M#gY9J_ͣfW+rݏco2Q/ xxkyP\w1er;mV7<.r g>ά?}N7WeY'BގhHiyҷ!iK@\&ː1t_XϣO 燸7jF7 Mc^TnH-@Ehg v[^,)y~/Zov:"40nmIh Xg.-NY5bh0TS>~pilY u+O`#6*Baqw~0HRϡg6±GArn&"GK[<J*NxTTeLr?' 4>|Nwr1178ې S ggkksbmW2u3"ڰ#4d\?̙Ȓ8ޓBqLbb8/.\28sAqDU"Rt7t!ojz֬Ͽk8?:1s07xz'YV/ߝLN b||j`J:c/rkiڰdI)‰ an\&-sšJ=ޯv7x (VI\` Avu,,AEܘ3vJ̅]>aF(ޖ w\ר6+u00[ZC| uܽ[gfل+(<]x uW.V;K$@^̾JfXh*-ԭMp{!M')][4&3E"qDQ\yjb)k,c9)N>Bg7=M 3NQߊLXC?cZE 緟%³4[˘A)h"G(`{~_Kvo 0mf3-Ók)́8{G$מ=mb?~_[O/ZgN GCә˭38EB)IsJ`pQ,BT2Z"(2 ri"(F b& (5Z.q:c#Hqkw+ﳈ [upAh$[kʉ<۶3' ]Rїx){iM'őA๯R#+Nv񾚤h҉[8$|s> j ,jXL4}tq="""0XC`ʬT=iG r,&`^˝_<6[2 OҦy\ג륕b`,'*$H|,rvHV]Ͷ&\iQ?@@ YcvcښW,#USĭ q$X;oBGgU?/T r+3r Rd#0ښxyOyftN$k}i?A..3~|W GkһZ0ˬ  ,ψC c̻<*[ }^r:PrziGkP[f؁( Nt\'DY;3>Ժ)|஋)͝L>lzt>PS;tTEs oqjB `*y/oooz%M#E*HwCb >T'峿 !w&-.^T.3AS ]d+xȳ 44,o" ܳ+ fنoVhm}uhCdЊg-b)6H0y]2L#/[|VM&HzcxPəuE?> gV (B Ӎ,P7#6$Jx .I5!P@nRy{Ӧwe8t/SL ,ے(kITlp@$~ygP=n,z}jp->"z;VbJW`QAa"UVjbw7َIqv t a4EҭuhfH s7hhV^%my$`Y|CN  $ k;С:F7<\C}T`UQ*H \U"|HR߬@>H.M{&ҍ^6aF)`pRnMkFɋrl.,KWI+V*!vOi> w(N8 PL;izm*$}+VO !F7i#jFV+t#csM6Qs0,1xyu2J~ܷ*x2]$qM WT PhC"]{nd0i,5nWIVgK {N%bˁ/q pS$R~rpC orwT\{@%slBZ53B30\f6IV`U=zLS}؎JI(( Ӷ$+SN[G{ۢvSaC)aH ݎLq^@`FoI$f]1#9#yn ê<ј`IVX#w޽/y]f_0VSθ:USqpi/rYhq 9,p^óJ]AXb<)Ժv;G% ys1 Ƞ9uǙ_=r£qGkKJU3L,ZE%Y5E@9^؎mwX7pL`e}5r;/S~K{_s)XCVM 8u|.HIBK8/-J r Ya ҡ xCP(aDx9JY"Q1 yN@*AĴ|G祻fֵ׼;Tu%_wHw4Owܥ ˹n R(Y`ˋm4pGhT0:F ^MBA:Y_h1NntϠ0gG|Ptfp#|$+2ՠUKAA ) :F5%CR|==]ui.ps\2N0룣\ǬQLAfcٔWt\Ȍ2]%E&UruI '!^lQux}r" Ϲv`4:ŋkP4Sd_3KɎy!r¾DimՄ#jn*S<,;ep59`AH r#U-K t\ \I"$M,)b/| H6#f%UUFY,fAfWm~t9RW}L)PȶvFPА)WtYg*1Qr=UX`:Հ:&31 ( I(֠P#%_Iҟ[FxW,;w$2eb/ ^f.M8UHh~[I% `R[V6Ʋ4$w0?4}6Y|;w*>;ؓ]4vYKb s|; nћt o~f۝ {h>3w2Nˊ59.QDdʣR'ՏwNޞ7-uH+'j;Qyϑ7ߺ" $j$h7Dah{բҞ"B4ڹr<Ŗ< f9! 1z6x'u6|Oc $xQS ְ{gXUaɛռtr:Ts 48E1ٹ%!MYϲzqMor*֭yPZb2~ :rHӆԸ̏Ir۱,m)l0|s~`:亃XB$]ȪbGk vRBkF'f`mBY@ Jo3y Q <ݪDLHЂ{Ո3 ŚyX]?./TrO}+O_͜G1KqDψAԲgt?\'̶rћ !IKfC(ɁmD uPGyG/-bhxS7;rT {џ3oa'ɒhRVyTwއeD0᩠ ͩOg ^1EGDKvNVɩVw`$=3R44;7Wk2o貢JIwu0_P|bDUHZ08<].;0DK>{b;`%?f%`VV<6s|L=TȊP2E *Vybt (bSdb;^qˎx5 f8+&UBWཪm!*hE\.2es31Ђ(lNulF$Hk̵Y!wDҲi0&#XZ+XH]6*$vU]ALVѕ&e)®`ZҤbhq(S͝ 4i xB'砗Mm"̴;},%唩FIPPrr.mw u:+}ԉoEEޑ4BXyJX pFdR=KM͘qqF_|*&$hJ"P‹\wbCfm9Rᐸ8' &̧@oGIҼ`˞+G\F8:p0&!Z.)X^7@\w_Cdj$vmP<,>z,׵7P=XN?ڵj\6#Մ:003 -JٱZ+\ 3@{雒;*Amv:N}έDz`2,3gN<#PxhAwߥ?Q{AڑgeZu~a^ٓ_?O;Π%aGiz>Am TBqT&%NQU E@!PtLi\r5sLSmNtyAC)! =v&Uh"?p *\Bj8Z*g <*.t|"m?&YݒIk A?ggVAPV_ 0eNl]"!N.h$玃k$:Z2Аį:|c.+G!lg_PU3XXo:Jy]L)*W EAgEk51p>\{pI+k1)χܗY\YG"ǕH=‰`,@`F)atnJ(")rB u}זI % #bIf(S:VƒNR t[|ct7\n#׎`w@]w-9u6=e1sѸЈ 21PH){imyER5q#:U3/8&/\fX9UXI-m`$Z"=ԫgja*';NZ.ՃG2wlMB0O~ q!Z1@r_aYDl^YBԜVq c0H!Tm'bI7 q&e Mk#boTB5~/xU ԃڔR]dB%ttwϋCrtn %U FOpq=]˳!WH7ѓǩ1m4 ^ ^}MN^B{3V- j"q*j @8}Ȋ BL9-4qr:i.z!Qxh Uz|z4k_tc0%Kdw9/ysQufyb1̊\b9别.B_ | 1]ZF%9tFgsVp]KqBR@`>p ':k}$Ca6f*ţqwbP<dUe.1xk鵮R%pvPAL^N^/0_*mt!ȻuPBR1=] 'V]m%N+z:z(gBֆ7cZJ{dhƕh?sffL!+_Yi*~v"g6N}B;,a'NH5{f_B4=0hE!92őA{N5B"&) &4٢?_GpACcl~{ |G^wOj-b~"Ӡфi˧PI: cya b/E43z\- d뮫V>?(p0KR[qY2ΗzWeヾiCdct^ft1㣡evM/EI!5K]1uf3ܻt/ J8 VVO7 I~pC"cB)Ȟh+n~ozC~aڻGFVYX˂ 't=ޝ:%Ck$T3%*z*E&7~y5%cqrQDNx}!$1uj~Z\6XFzFB>HX.JK*p{*װOW10Hc D0k]jB[R #p Az;9~P#Xa)!nba݈*('骸'~Iz|@wP=L4uą6t%:JCPUc8 JGC- yhE]0X5o9 AwŒpcT 5Zo5b@v`KZ_|g6?ue1t~>뾫dݠ{n9:WF&] Hx۽SbJ`k93qS_ڽ۵;| @V2Ժ0  e`iS fá+Η6œB aJﴶw|$NwwwjSdhf4%H$^FVNԹ^ -Oj7$/UZ1ZKi 0P%BF::)t-$m,"4t;k"'4qG&X/Zf 1L%Lj"Yᶅ%7 A#àh⢜➂ecsJ4Ə8pv "@.k=JmDq|^&(K'FijO*p;qElm7+DcYAvh[dTFUa:Md%jRpsdtMxRx%xR ~V*6}% '~5˃$QWOsn4djLJXOC9pN"L %:ވeSH(C_a|~ว U;}l9IUϾ}qx6ҋ#&[KoJ' 8+BY`w?q| (mz<ǵ}^>jL`Cy^ElIȅS|f&'WK.umkeD RQm.jR̪ &-$yAp,nnaS #'Aގ,nJ] HjּؘO]5#ܑk@Rop]\*~,tE5M0(3'J(  @ ,uK X_;y6?DXKYIXpR5/B.sxVDY6(>Fۗ8ڈIIR=ffiz5=+ʛy%cZDljwU 0'4pi0Hp|:ZzCmI [ Pnr?Su4yX\V`3Oҷ`^w;9 Nl7o%6+D>@hQy6+blwz=9}w޻/շ7= PQd]Zk1 @?DBK9LJr5n,VN?/8G5c4f5)tqqMpA[RiѹśUkwʍ#8߰e;YM5WXDf*wZTr xWyņihzq~'-HVt%)W29=LQ#^ jXx+£vʼNQDx#Ǒ?8yl7_zTMN}2nI5fzW"ugݻWIi?Ӈm f38&HgՅ,j qRy@Hq[ p`h0eKڇ!t̓'幩|m*G  1"RE\>|`*G/}YZI'FhgĶMxytӜCyTM=IMmuz~[  QEIDI[5ad$$EYI,%jR$Un>tJvQxʤrX2lׁh4IYLpu~.iLΉhQ8)ÔTYј!gG/ݙx׃sdc Ƙ1j+.-ԍb Z#b`ˁJ[QsTnC0LμͿRBa}jUޫP?Y*I:"@8|fr Qd*K4ѓ+ǚ縊/}ボOrx}q'L5=^ө۞e~ܑ֯3XLNz믾%'/ޥv߿Wik ՗_-dW1>I csbeavDKh7L|7ۀ&~˷]Ḿ}ӨR`iSxܷ4޽*@{dr('}ilZӣlp#.fbEPsu+^5=0K]3U!U>sPpFc㵌{]/BF(1-;mQC_LHl.r~I\!~venZJxH+Fndm{T~@U 12[bgX;]CQ:Ti-1|]YZ$'Y?AX՞Vhhֶ7}&M%}KO)eAMYSPjT(M0"J}kuv(N5GM;w;M18;o['X+vߺw~;l)|ZLgx5F8rO &&1DN,_PG뮑9.zt]&Dzɜϰ] ^R:/bgaqr9P"&%rj!.#$Fc ΖiClvqP=4'gZoMsx@ r?tChK~Qwhmnck)0+duw5!kIԶ1Pϣ5)EW ŹϨUhH&Ӡr\@ӽJ2^b@S:\WR-^03$y4fCӮW0Xy''mD/JI} U^| Q'  ⶕb0;zUcKZ2նx ٬餴7_==|{0 so +D9hw%2]܊}`guyt"r-k}p2b&-i2 ]LdJd$]6iL#ol%ٵ43/JmM'qY-Z DsjM N(4!}tsh3BOWKz^_HO¡ͭ FW ψ#cu.'dSDF,%)H_)Lۛgn(`&BJnB:M[H}lI+H]J跬`c^}nM؁7z7ٲXK4]:.#Z;4 `W/S O$Jˡ ;`XLqC?9Sځ$JAcVqLۘ^ $$s7i}m?EZ9y0p/{op<>a)emS z >M⽝ ]1j IT3* 3/D1}zF4L?J- uR4` QLBr؎=y{H̬K U778*usBuyYښkuc VNeLӐ'!&m !h'&ܢ5Rl'![^6|,$d,+o}j+g2-\<,! QVJ(Lf5pr:Ydt} j>f8wm,0x3fHSQH&=҄8SqxYcq2nʤ.%N[A[ %WVB$@H:kGN>kfNAqĭ㦙y3~jf܌S0ηZxPaac϶"NZė^ʉpkŇ$ht|ײd* cJjhKS˘'yNn=.rCY2oI} {2<+Rpc`VpZA/>T^L."䲠.Nh!M(HO̧ I' tGOs$ Wr"gk֗$nY1" T-dؿ֎{ -zfŃud3(Jg#,g`HIOHHw*o)fesVHmC֔64r"L' awIo1 W!MY ܍N/tWkP?3uLLזt-A+^u|vMXht ,Ϳ8xypwzpnM~sR /])݈zBEwJHUǿ)l=)`glQ/K[yJ#W = iH3ӓKc T os.6A6߁?ۓZ0}3Vԝn?{v.^/E\b]rN|-Yo{ BH>NĶauZ瀩poMwkd⭘B-;nkXcT|0?bV[61Ƙq=}θ,mn6QpMqWњVݶ$~3)U/b4M!T]{t~8;ʎz'u귫Nv)+C/W_=#d(W9q2<%xYNE 6j+H+ ln,jۅ&/EdgL4u|@ݔa䲋,sbm7vL$Ӄr@Ժa.kǎΗbݸnk׮-u))命UȴfG1r2%_0^H\8!!ldXqLVReT߶RRX ,Ȍan+E@TN-<:9#Kx4Ĺ/,)!"n#Q)@EL@DVN!.޼6a+Bv"ķhAHWJ$p%JԿ$GˍB ".j$w)5Ű )5u#F)c GR4މwZ N2by҆m Ǡ.i& /?/FWۜb_!%kreU^NZ0mbt_8XN?S7b+ַ}ź}NO͉Tߣa.!Fr ҡ-@I$!S LSHHٯڶs*P[k->|Ew]0V5~!%Ps~Ř ˰fϩ^t fkۍdgFl|i'_t.PJzP>-%z|0kR,##\g  Ÿ 5h~L=tX" ~n( !j%^Ž iXY/!_;Z/y@C|Jm>n(!X,hcudt׮e([T"ofgui{S|}&m{Py]Dne vjˉ0W"A"=G,'tڜa+f>i>&Ӽ]~u~+ScVrf,(3ukTPljNBLZ6-ou)薃 ޟ5\)Gͮ]> 3yt u@I>pZYnyڃ+%X.2!5vZ3A99/"~/X KA)0?β9T%٤nlSuHWpÝ j #z/-@FqęgbMwӱ4*Nq92B8U,Y5KR@<^? ˙o'`~A%8n_ #{e*p7ĺuGa1`Y3zAݺ'v㖕A0ךɪ@@t=}; U3Dthzܤk0dB\&c`IWlfO&FX`p#Zpu񼖨!m](,?̔E!:* $Vh82sCv$=|–E7M/ѪtST@cͮ y:k z'oCk\?wuxWlPeWh_7j8.VB,|olp X U7;ֽuFuK] )1-ᘌr5'd|z;/G%wa^۱Wrg+:9U>DW/PGQ82ƛ K] c ;T+ g@E+ޚ\:'m~:mꒃX.<-D hJ\cVf}hƊUWxy|rDRezsB-ELoZG\R'gM-ADskoU,bwB'O pϠ0"ߐca I\L[_ͽF %+FuY㫦\e}IVIy-K#h-B|ki@\Ԫ9pP6>1tSW !QQ͓%ظϲ1poZlQ _cye!43ކ,ȅn'>lōmHz9K(?BB1x,{cN6(>Hw=C󙙄{/jgrW IɩhM$S@#4a] !4D<Μ{zglgH^zQVr-U[f`n4v!>%ћ$$su\hr #H$壴tQ"ɓΜtj{L0U[a<+fCЀ0rwCm_)>[VuF7Y q뚼DA?˽K;k215)U$1m&kzYg}f$n\Ƃմ3:\-W|X׶0rlUȸq0gQa"h͵lr(F&EkrQ2FbPTfvﳦXr~G݆|(sq^{xSST֌ܞ!k3ZQ9Qk}.☼fvZ̮(|1p`_YRm5>w{o޿?>xx7-.*E(ByZ|jrwRmQlr0XΊ9LWe lr#H8_0IQM%۝@3q8sW>ی׷uD*[ P"[ࣕ,183,(yzE,$5kFH[*]7'7G{7a@ތxVxtT5s؄& ouN 嶞 ͗շOopu#<wU+ԴѪcDK5F={CvH (0u'aHIȵzex/N<-Yǀ~yc-%}ԋ/|tn"Y6[p]CDT8'PV(j UYނ[-Tk{<0GkYlU6ìJC&x-*r97(dhzu ЈqḒJ߾%7{ǮdL~c,>ǃǏuW %!)yD%-8k:jx[jĤ*Qw{ʭ{Η{HK!SĠlL XhJY,_5@8={ԓ,~Ɵ:~yT ;86z/Բ|);^ڌ8+&z! $ CGQ߹!EC11,t!zO6DC{r,ԅ .×N})5iN{Ԥ|)P&߿)XrCeF]dž%."d#}!>,M􌢑 (hs -ӰygۜfR\ѿ@M@+ i1-}qd 2x+ΈoT)>Jtt-sq8ATM@S|>-wq4tRm>Y3uSiМ{ͅ :ў` t9@g;§`wFNN/0Sg8ٓz'\N@>ڤ=o{dklZԄ96>eP(_ԉwv/C=,|ݟ~{n\cPNr9i#Ccv-7..0GzpXl(A& Opwn e}&@P\p8PI˵w. 4[]=@h.t%q3וXW7_~|p k+}}tJI/}[>9]YHY&qdylvp}>]V߳˳s}H֚d'S aa [!A+;QǏ E1yTPUG8m*:"+xHZR?]G6~'AbGԼw87/.יW9g7dĪB戅 PX牤ukzU4ٶ:;}DF,߽l+m S/_@ǻo7*1*9)2'Mr%ΩI9јQ!D4*|]14adYB0d%؈OtȲ4Vg @/,@(jBkK5dQ<*FŞ./DX!3H!"waML\ʈzLJlTCYΑX,it@EyI t/v!pudդ[<p8p~ɢ_%d#xj8kPa4-ضcHf@8uePAReHƈ%$D ۀqtZY17s%B)R M]֘"kֶ?>1C&ش qڷL`ArV:*{CJm4u,smi!" `3H5r.jA 6'3Vn;N1w]NC2\6P-cGn,%#bѝ*l9^t"uV4Qa2jL0l<җB}8'p%!pfPZq'FKށi~XTILtdv)c$뫅L&Meu ~P4%O+DrkԶzJEc5f'Ƀ>uArA;KZZA*)DƓNۋ!Mc(E# pͬ< EJAԂvNRNİ// 8#z=E<:З֍x&h/ F/NowOwߜxuڽ$}YR(wRd~&1M,g0؏R$6.be;Q{vܺlk\޺IZovS:"x5VV2P ˓rigIF<&DB5Rm H$ٗ$g R׵2S'@8 P+1N