summaryrefslogtreecommitdiff
path: root/kernel/stop_machine.c
blob: dcfb5d731466257f7f003ba5eb84083f0185d22c (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
#include <linux/stop_machine.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/cpu.h>
#include <linux/err.h>
#include <linux/syscalls.h>
#include <asm/atomic.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>

/* Since we effect priority and affinity (both of which are visible
 * to, and settable by outside processes) we do indirection via a
 * kthread. */

/* Thread to stop each CPU in user context. */
enum stopmachine_state {
	STOPMACHINE_WAIT,
	STOPMACHINE_PREPARE,
	STOPMACHINE_DISABLE_IRQ,
	STOPMACHINE_EXIT,
};

static enum stopmachine_state stopmachine_state;
static unsigned int stopmachine_num_threads;
static atomic_t stopmachine_thread_ack;
static DECLARE_MUTEX(stopmachine_mutex);

static int stopmachine(void *cpu)
{
	int irqs_disabled = 0;
	int prepared = 0;

	set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));

	/* Ack: we are alive */
	smp_mb(); /* Theoretically the ack = 0 might not be on this CPU yet. */
	atomic_inc(&stopmachine_thread_ack);

	/* Simple state machine */
	while (stopmachine_state != STOPMACHINE_EXIT) {
		if (stopmachine_state == STOPMACHINE_DISABLE_IRQ 
		    && !irqs_disabled) {
			local_irq_disable();
			irqs_disabled = 1;
			/* Ack: irqs disabled. */
			smp_mb(); /* Must read state first. */
			atomic_inc(&stopmachine_thread_ack);
		} else if (stopmachine_state == STOPMACHINE_PREPARE
			   && !prepared) {
			/* Everyone is in place, hold CPU. */
			preempt_disable();
			prepared = 1;
			smp_mb(); /* Must read state first. */
			atomic_inc(&stopmachine_thread_ack);
		}
		/* Yield in first stage: migration threads need to
		 * help our sisters onto their CPUs. */
		if (!prepared && !irqs_disabled)
			yield();
		else
			cpu_relax();
	}

	/* Ack: we are exiting. */
	smp_mb(); /* Must read state first. */
	atomic_inc(&stopmachine_thread_ack);

	if (irqs_disabled)
		local_irq_enable();
	if (prepared)
		preempt_enable();

	return 0;
}

/* Change the thread state */
static void stopmachine_set_state(enum stopmachine_state state)
{
	atomic_set(&stopmachine_thread_ack, 0);
	smp_wmb();
	stopmachine_state = state;
	while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
		cpu_relax();
}

static int stop_machine(void)
{
	int i, ret = 0;
	struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };

	/* One high-prio thread per cpu.  We'll do this one. */
	sched_setscheduler(current, SCHED_FIFO, &param);

	atomic_set(&stopmachine_thread_ack, 0);
	stopmachine_num_threads = 0;
	stopmachine_state = STOPMACHINE_WAIT;

	for_each_online_cpu(i) {
		if (i == raw_smp_processor_id())
			continue;
		ret = kernel_thread(stopmachine, (void *)(long)i,CLONE_KERNEL);
		if (ret < 0)
			break;
		stopmachine_num_threads++;
	}

	/* Wait for them all to come to life. */
	while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
		yield();

	/* If some failed, kill them all. */
	if (ret < 0) {
		stopmachine_set_state(STOPMACHINE_EXIT);
		up(&stopmachine_mutex);
		return ret;
	}

	/* Now they are all started, make them hold the CPUs, ready. */
	preempt_disable();
	stopmachine_set_state(STOPMACHINE_PREPARE);

	/* Make them disable irqs. */
	local_irq_disable();
	stopmachine_set_state(STOPMACHINE_DISABLE_IRQ);

	return 0;
}

static void restart_machine(void)
{
	stopmachine_set_state(STOPMACHINE_EXIT);
	local_irq_enable();
	preempt_enable_no_resched();
}

struct stop_machine_data
{
	int (*fn)(void *);
	void *data;
	struct completion done;
};

static int do_stop(void *_smdata)
{
	struct stop_machine_data *smdata = _smdata;
	int ret;

	ret = stop_machine();
	if (ret == 0) {
		ret = smdata->fn(smdata->data);
		restart_machine();
	}

	/* We're done: you can kthread_stop us now */
	complete(&smdata->done);

	/* Wait for kthread_stop */
	set_current_state(TASK_INTERRUPTIBLE);
	while (!kthread_should_stop()) {
		schedule();
		set_current_state(TASK_INTERRUPTIBLE);
	}
	__set_current_state(TASK_RUNNING);
	return ret;
}

struct task_struct *__stop_machine_run(int (*fn)(void *), void *data,
				       unsigned int cpu)
{
	struct stop_machine_data smdata;
	struct task_struct *p;

	smdata.fn = fn;
	smdata.data = data;
	init_completion(&smdata.done);

	down(&stopmachine_mutex);

	/* If they don't care which CPU fn runs on, bind to any online one. */
	if (cpu == NR_CPUS)
		cpu = raw_smp_processor_id();

	p = kthread_create(do_stop, &smdata, "kstopmachine");
	if (!IS_ERR(p)) {
		kthread_bind(p, cpu);
		wake_up_process(p);
		wait_for_completion(&smdata.done);
	}
	up(&stopmachine_mutex);
	return p;
}

int stop_machine_run(int (*fn)(void *), void *data, unsigned int cpu)
{
	struct task_struct *p;
	int ret;

	/* No CPUs can come up or down during this. */
	lock_cpu_hotplug();
	p = __stop_machine_run(fn, data, cpu);
	if (!IS_ERR(p))
		ret = kthread_stop(p);
	else
		ret = PTR_ERR(p);
	unlock_cpu_hotplug();

	return ret;
}
r䮔۹^cH 5K{)Vo/xrqgF|X4e~lF]삺]|*v{oɼX{-|xbeCU V>YµbN~xhzGfT$wI]˶( Irv d8* NMct!O+/-eMoQQfsԪ6֠ќZ h!CϛkAJp9S#%AbC-; 5Ɛ3F g@ZAdi w.@Crix>%8=}Yݛ=zQ#2HdžZBxS| =*f0,i?T'=qUUV:Ֆj-rdf{rS5z ۳dgV9ʠLZ+WaڞxjjzgQ .=. MW|2 D2N|t'@ v r里SMHgY[H#s6QW0)} YɒN l> rN&$&qkA0 E|m5pmX5Q}dߓ-y/N?.n`)Di 2[%g*dl^{cQp0TJR*5`ծ钃yvCUWcg$yM'V 婳j8`YG xk;r#bBMҪ\v`Q S[jA}d D &'L^yR_l4BiA4Ckxw\4u24rzAMV;C5lǪU9(봪j\G*pJE"fyfD V:7Hk(rւOֿOb|InJ~Ό: n-_X;F3p[Q m~`/IrA7޹ox 3G>d|; Wthy{=9B"7;y fbξ_dx7o Qf7ȗ),QA9/6z.cȀ/}!q4霙7~ dRM|UlU;r2N'"/z߬jC&d-d`_]k. %:)bRЏ2uILrc/O[|l.w.o3eycA]\}ҕ?Z9~{M֩loAG.J>K5Sy c[` MdARR:C̀+6`!2tn@3+D\;|oؕ=2t" D58;2+*G*\(6igr#È5v7>8'aXVRżz0BͮID0Bc/3!y{Kׇw3ȃ6XɆt3v>$t2+r/HM=ćGek <4!QK}v-:*_'xw,KS@U ˨j:ijRMRfu5q[ :M5 % $֌}+  њ$)2'FŃ+?C5mAvhẍ́7$)?2D'\U:97,iy5=l(lk:JTi qS[5vhT5e|+JV AR"kɶJ}mZMkvp{#~ReORsqmq).̯QԂDzx6F|EFk+_`&\lk=m"겷#/,$F!37fZ.!{6V-2dvRzVm|wc>4CNZfYwOEls;23e3l&ER)FhXLԌ̭ݎwͰ }ov<Y?:$lq(`mquJ;Β̆'7ʚtJ0tN&'7 a,9mrRDsXT>U_/_ՂEА yG 4E~SqE3g7;73 )KACSCpHV7l=s밴Q&D[7`@køzr_Z5_ܭ%Iү~CuWTz]Ci5 _-z_YJ{# uAv/_d!?-I[$ʒJ3/*3mox(K[;{^DH">V!Cu{{5E _kK3ٹ2|+6<2V*A3hI',46*ߋb#>`ߔj߯]AlqY8 ysqCbxuW-,Elɱ9,Zy"* J)L$ Q [\(ٛxYNG`3u}{\<\Bȝp{vrR-9ݙ;bEj+IArC: x w=?nq8,2a ]DR}Dd>rg 5/6ϟw[Р뾻Xals%O$N'DfU*˱hXUsgt96ʳE[ Vתem{4ACFGE%ITdj*KqYʳx?>T^n?0^W?Ɵ?>{?)10f¿Ls%;?cvXu־lurZZ)ԟ*,lNaZJ] \rђ?v"o9ތz8l5#7pRYl2ipkZ3} s!B^n抃aq`/(v.'t&WK: 8DKj0)i*^=`Bp ̎uAdns~f_ݗZxd.iɘú+BI* FN`"XBgz\u0A?H=Ѧɶ6FQjE5}ț11YB:+Uvxv7,1_\[[/tMHoa/|i9=Dξ6N( s(Xrl;c5f,H`jdćȀ~JܦH^qX[Wㄉ:2]m!\>:qͤ^šo5}\x ԷO"r9i}$IVP=ؑTjr] ;qWF U?Ia1$"F gSUir(ǁ-#̦UK,1ӊTb!k'\X6R D-aȭ:dqh@'|rv6{W.͞YBԈK[=EM ߸Q\uh,R3By֛//e/ 'c.Ѫd$oZō8|‡lf^BfP4_r{dplfPyx2LW0S%#fKJQES1L]WT$ڨ a]0k3Fg -v|bт sJ:9U|L*jZcwĝ3ܘ)h$xot7T®#P7UXiT_N7gMa8"Hf[o$,vys2n6~8-!whpmU#>]~[wM^CM^z%_ʼc~Vuwec_o9 FFzk(_j6+"dY^ =#,O6[Fl;su}^ςR8vi!zK+XP8 3.P8muee̳,w@^uhĭ0d-ucյ1|SN6%Е*?G_{KG7h)B#Bg6#9\h+1|hAæ~9~eqjf 1|t6avL*4nd>cXܦS0%eCǂnMnqd- 'EBi\%2kJ-NUONOh[.'m4 `$0Kj}o3Sq~ܽIamuOpzNp~{\ _ d/~GsyS4ih0,9ϻM5t@Z.Ws|d<`Rѫҵ|nK<؏Cp.K)HYgT|J1w`K!3'8U 1y7YJY<>ٮh0= }vٍR ?4V 2y  Dcގ x˕B*02Cm`1-)&c1D )Fm6 ( mH(=ܱ#GYzET?0يj-}fQi F$[OOGĄڕj@*(Cd)("v!/7@Uopk xLRy]'M RZ9o>H$)U׷ap:_7 wb>nWd tg9z:?n|k ֧+.Ûj?۸"d P7RtV)Vj~ P3"u^ 9gܾ[=CԳwI31Zؚ>3y"81;[p*v Wnx(^FҔ/wO[պF[w·%_NjX>1Hx5}txKMJwQvNC6@O*=f4>ןo9l-J=S"/*Om򽠾raAj~0o=@oA_&"o:djܮnx D;Q}.Xc O.֞ޝ Slq1q]UWbg7bMCO&;atK34K=)( $Fr8?Vpyџ'3{,v1ЪXE ETh4F :0A8apCF- 6 7p,8BXr1aϜw5knAh$*p#*.PyC20сLRWһ:#]ٮlSwgW*mC!wƳB{zk|R2)L 4luLRSdeGOT컋w ro<$eMva 8sCIdXGt0QWmԚe$t l%==Fv!9Vr\:R0m][j=Q)v!k, {#=R"Y55N&ȹSp(V$kgKGgud+Q*ZBi~Rf,M\J'Q7ͯ| mpai@`|ݛ|B%Ɩ|{ȕ*ޱ]kꮝ r qiW`7Cna[ &D~C|9o3 }:с2o+s<@ 5âIhYr?_uCTm#}ބqM'ے8wȑ1i: @Zj⬵&;O9kc~>zZ؏!pw:*Pps8Vҳy[O] EF5lg@[o#wکR%9MEnqJEX|HvIqJ+TMHRYsfRO:! G? jvv(ђd) Z 3׽X$kWuq Qa3}}U!9F! d;[x;hʠZV!HѠjrKFW'sn{p)4kC+5;7Z'}e@;|h:E;ax9Xnۈ1JA4+L)!0z.b\ҨH.ôKN!h' R4*RC4n#vvwV4)!]vSZpT]2V&$A&L7oO_9]8CKMyXU6)쐆"1i6YZ- U%Sr1 )ȨH(z 9s[@WN*<:1[7Tg~єkz[cpj9AEpOJm I+i+LK)`;,***%.],Ӱ[xn)LWKtRrnrϊQbPW(a)<~+LF%ntnAL\=T7REE =$\=/vopυ}̙%Br˒/7l靉mH'\.fH/?e# ]_,4}3=.qkc#LbfEN݈(ZNO$jGPx{xW{2$Pad< 1 ,{8ruCu,JW&>BZ d -aS~>P>qV8CIǰLƿ#|BIX1!ȘdNO32˼mqfk3[Ȅ&jEJ|)Ln",$НN[Հ帰 U5ިvYn<#ڌ@ӯ@Iy46`ٕ5lhR?몺bsnI<1t꺹XeWu\ar!yt)ˢ x׿ÇjCN=E".B*զJ]5/6(\'tMx$`z6o]h6)ui1*2+ɸwZGI"}=dJMkfڰ[rF5FIZ24r+ie5xNCh|½fV~9~.C4;:f&6ņڻXU:BB`ShPf[r2,*h,OfA:[΁'e0(9&CV$}Եr/ ܼ*m0q`a`&VgTz*Hv&C\+V#-xHxXkS;5L잔,gvR|JOZIA|} t$.Li'S6,!u(\fc`ݑC 'k4\KLoFY\X x-p[ܝK|x{KAoz.Λж[zS=1͠_ g!qlη\k}8=wOy#^#EYlu~%Gz習IG}L:if]e6բ#{n-7twi~R/ _UՂV,m-8&%CK}~ 5v6?!eu\f2F^.p*/lp;X > !47)BxjI`O =~v^tv1_5U1FMmGmǬOrɂ {sD@˲H?DҸ(آZUltR@xܸ[htue&?y9XK={t]0EDS*mne/"3VIb@C/>Rcwgc~!/g5f qݔC)nvXŢ>TF ?~lw=m<'[tyCw2xZ:TcxqjVkjT2@UCNK2[uDÖrc3-]AY^}<';ݖDNZ"qRsFߺd ̷~$A'٫vXkDY*զFd퍬 d1NG;?%;hi`QkáU1mֹb[JMUPi0™@c6'{](~!\tR"(|)V*iTX- ң*~ULäaV؁F^+_dO. D[xˤ!z,q(ر?(s?2_XXxY`&^̠<Kb\)ݏ~2(TVg/^[8ATa~sXWTI^k0{{U"͡i SpIbZ@Y}O94qp cۻx+4ot]I< -?4 ԏh]Z}~)@`A4C}67ywR-nXzM7K`4R u/.?齳!TU)=ꨑ"o YΞ;J5t$C)-Aɏۮ7m*uhJ \NLG2[5I@[4Wp)'/a0U@R{m29,i?H/Nu&dJx;dZLvغ|p@;Pyl#h`ltO,Fw,yE2zސgP xdrkEi'[ucy-ݵz=Uߓk;wGw$۹8֖jеVc}=*4p~|:km+d~{ Ehf[/Wb ?^< i8A1ZYJ]9%R UϳT\v9FBLߺLK)*H:x${&iq*Wȹ W+9*;nǕ]hjKznmm2$7T 0DF:olNmF/&L'H,.# VBL(ϙh߉aYDFPީ΃|^cKigR:HCti>du-DBRߧt(B4ڥj&6_,ˁܞ\'BؔOoy]E_ Q/?}azooɔG0 J'Z8.nA bl&xc*i6g8TA*-n*CV:t iq]'*y~qw4쐼<bl^۝‘xoZeį;Np'++|[zMa~G]bނ`?!_JtGdɘ+HʬmKZEvXh6AShK&QtM>TAQ ԕf}ʹ?HY7Eh)xujJձeIىg3v$Qq E h. z5yO ,不ctГ9+s$NNIgCxtFT==72ץE`+?:xZ-kz8w;gnLxy=+h)ΤҁICek->u#}?U26i|)گDy]l"$"db9HԬc#9 "R)Z!BA,QkXN}Iaj.]U#76H fG,'iU)r1<1|%E?68vw:Ҷ^Jo(6[<*4  \)UFzr!+)xN&r>cBOd]ᖤG$z\k\?|)xeIv]oxj3&4-v؁!uIRkf!V@dHgO݅{#37XnZT˲|ػX(`=/(k8~9a st*vY}&;b8ڎPIth{[pC3ۚ.f47>wuТ$娀))5n+#H'ZC^hݒrHGdy_ '6Kd0#Y\6>2v7?t1ï~J󝃼RfBB5NSe`2Ovt$&#Ke3h_xWSZʨS7LwĔEjzj @n:+{]##\Qj[ΣYNĶOڶ)E뾄u^)F>!+YKݑkDpq{]lT18U߇+:Cqڟ Iٻvfkmo+$dEjj#܈؆cz&v~Z8AT Uoz14tP&!|r ] !KN ZsAr~4HA Ե4}W)ƍx''w Mk[S}oGkW#0q8E>ŵ9y];?hw;-ch!]BME"3d̕RU,@;c郝r<\ϳaųf|=F$}0hgE{_Oz K73UMX"cݪ28/F5LMOiF.-╯s!xŅ4hzۭk7k?`MgzxO]N=j[U˙vC}ߢlYXd`AwE8=dZw;orPBGCZrjl;3$n2Lm'iđi O]t$ jg|7j٠D)s&idŵfF7QԀաOiq:'Шիu;̘*.3;k(LhS+J8"'E쬳17mB yg+HU~VnsM O6tHARe=h>LLMďNhv?!{S5da,Gr3hu]= M<"s#0P0pt),#;GD=:đڐUPľ8esu8/P1R馋`KwZhu L>6长1QlX84= oQyEiN]\œZnO,YI(5q6KS|z }/;Jx-17* uau&Mtm}T F gQQ0ljTh9BBՒ 3~::8wd@9fr] ory U?wy4goy *]?Z1a?` X yϙ`pu{B߻ܳ9>)anO;&`h\r.3iC@ OAso SΰKr8Qu<nq'I곟 EO |;Gd?$l }" `㰨0FqDЂƛ\uY2}04^jՃh& ?UTsVtX|Ȑ!Uݡ G~yb͌zK̒w]?@}&}k嚂5ʹ=:D\ӫ 6 %Yvdɬ s]n=3ܱ@VIjfYc`7shyҧl&K F.Ĵxf[4^X}u{2,`U"2SVwi\#X^<[Gy&F+gwgdv  _]7aHnz]znP3#I'Iqy4}љDwc<͍N!wBLaB"p\(i6&N4/:s7-3տa碮J;mCیķMCZ13{(;@K&en7c!~q܂X4z둒C#Z\; @qu(;M{JKK?tvqB:w|QtP[FSo$ u5f}|p߻ƾ+ďTteYxڏ6h'{7[7Ըd`EL{Ꞛ-Su#+6nmlɫU6zIi\i\1H2c̊'F䢽7{]^۴JdrL "3n$)K`lFd3$Y^[<0")ޮ)؀zFv8߫J[+DvFl(t)zm$jo=5(BAOk*51("2u &Ǚ+3gV"iQRJw@A߳h$ ?d$>Ӓzpz5fo2p͊DGED4C\5봛ZedFMUTѡ?:5TmD86p w)]ݭ. X@dtC3Ɔd}NXp+80DbAmjt_B'Z澶omrڳb| IbR gӃm_9gz/2uWL'ę JIpD::&21"HI(Q=k)ڸ.Ԍx;-16Ė݆ n Jw0׽ۓ̎lg]McAђ.QfʻHtr; c_N`Y >M2χ9Ϟ?d}!IOq5!U{jǯEeX U]jz/#4+=ML0?5\&VD5dOhXiI|96 3a8o֫HdKed* Nn1Hn]|?2cW!qܟ)Nw'LSѪ[hүuT/^TjԯoUV+p ;%Z0)< IQ%7GfN{GҵreSFӡB\{WYsÃc SZɰ&̎:j:idM/nQwp?'cYVI~V!I@j$~?R4tui3NѸzS7>f2$_uo6:_ˊ!)`c|kqs4LrprfX29A"tϼYut-X@QqYH' 7k{Mb#H*{Mwܐ>`R9DG {,H& ؕE ù ~dQm}{&G˭wXGCAV5lh?ʠzrPV>Hj`WUjr $KHj4O)V$NwQ,&)of%@;wkl;czgn&Fl00>-u5kvh,LNvmLu@=L8Kjtzᆭ,4B[Nvth^Ig}Zo/CRXʈN5l jTxV}ivSfvE S-Eg(W~A>m tW{B`QěOYv7G1(\=!4ds\H^iSZLZ\sb]ɦ`ڍ9uCac8 %N&̶z]Qt' {{d l[ƙ^XjT&=k2*-|T0,LA[G{c}XI5@G$d'=|#ܤ1Y0)f@>}4"]iۮK$Go5h FXŽ\^9۬ CRDyESDjfm{VT| 8&ƦeE3 wA1_\Tj-Җq T23;ZkM4;8πP}.~VIVf=*EA[@ПCŬLi,/v/ Ƽ\"^~1@_Ѽ_w( '?9Luԟ/EIE F#ԟ*lʵRRe٘L?Xsyqs*Q]4CΚOuKKŐ,},s7V_+* ZB /&&ʽBJVO:S %"-? [fj AHR`:ok{µ rh4ъEZ1σyߎtE:'./GOotCkx!ZڴHZYmBcyU kA];)8IZvIGK2a%YN8~0 [JF ,w d{2ϓm\>px'zk L鐂W$M '0$kX~濥V-.E` #ow42L:r+@US)?- ZE>N(EIF-Ĥ_u_j'(,%pFE/f0i4+#A.+m{kusq J3oZؐΈBg@"4A{rq dYK0yml4stVV'/DpcC|'kҬrVgFnz]+zՂTU^DL)[.S??42O>sVƕ=m7~~a?$^wsbYB/9(m]ε,F<eoc?8C%W8?#;n=:_wi̦Z[{6 o3D,a.y*bˀ܅Эف { 4#ՙ)pn\ͿCE/ `@iS a԰H 0X8&lch¥6f8D J~ׁæ dMm-l^ Vvٻ>m="oU{RG^ehǁ.LCXLS^|ݛšlNF6c  G1Uqg"KF=dDm>^.kNjPN \FUUJuFeͱP8%w;rvZ*(.OPSF՜^0%O]sp3QMM ajYT=#CԸnVVE`qޛ_Kp¶ :X5G"9?)ۓ?ȔIzA=55d9MN(\|?nEu4.@ F, ԝ8R}j1WwҏӧI}vfs_.nV [ԠFV{9z]>1/L$k1|7=du^1aӃ+n16̱;sCHE5oa BA.7͏E' ;Gqd-lvY4";߅AI_+@k6 t~Fe'ArDRBĴ$U~>U|o_@ЁN)0S,6vClj*AA"Ðڟ?B pɬ%),N{_ ։D-Hf,;XslwBdY {n{ tu>)rsc+thxexh4yIM&uu#|#Cv]2e"ⰐJIRʷ,5HVN6y&x_M8it;Vaԟ -KWT:UЅ>$"g16R6u4O]7nOp,mP2Faq6m.Gʁ$KʞF2~N5,or.^Wf}.՘W{q΃#FGA$_pw*ulJQhdDYyh[rGVA]Ct݋%'ra5; G%i/KP@N?M߲h)3Q_t\q^XR4M5$ v "HqA}1$zoq:2 dO,X/O"?2z x$_tju]Ev4t}ϡnm!bn᳓M]s;ER__ ̶qEU۪N[]U(djJ>WyҠf7XN'OضdKG,PgIZϽ,_`d uԲ,A,ǃjH(۠S\[8訵#]?^ܝkR(F;$æ,Wvc2^ C>̝qXm5 X+1|v8HKi)Ώ J E ?>U>Tnc~5CvvKC֧';:Ha;8{zAH3@󓽥y db3,AwoJL$O{P*51=5r#RmooZ_m3!kq=Mú{7Нqo V@Df%ks%>'9!|vf!P`zhRc/VPW_{0i Qm<!sdOF4]þ ϕa[ׇi6ȷn2ZR& @pAZLFQ}4:CDH_{~I3)>Ю@_z#+-S ɮAnyڥzwK[{.?wܥm(-5tCvgp\N}vk 0+ m [~@7/iBk\[-l3!ҋZ;vMl 5s;K7InrߴS)xq5B7$ܷ1 ]L LcB18he4p-_Y+Cw Tsgv 줡R~ cs%nt4,uY-P*i¢9"MBVEHrOt92{2FR܁i~P6iؑ*AܫPG mt{*C 1nɩ_I֏g[iG6攁}ߒ gdG6 ײ;=+hi8vTCxkFJ}6u 9.V^ndh4HDYA2ϕxlxbnsV+B s T#Y ٍ$ *ʋ_CA`ݻQ^ &2ٿ Ldb= T TT^¨;nѩhߠűk̑O ػB:nloqLFA/,ԨU> 鰩ϔ}||Ta>N=JZZSG*' ydiwLΈp T4 2&YNN-BT9-odj{7RQ`e,F b=GS F<,.m`hg`7w'2//&M:C+!b|87!SqswlZ;d؅#O]|{ D~cNwo$$4@C\rt!0Gwj}UtjNK+8S]8 >$8+FQ0;dJQOɰOnIs'5W79N[Xdgwg/NbC{PKNApW 1FCz͉OY?LY 1IM_hBNZ.eP1E6L}0 M{kj߰JzyJʽ}d3 0Fcy ꩥ/3l(JSְG hn-y4Q-fiOJ%RCߡS_\l~<tCuIF+SZFG ` )ed::IvHޘ+]fK e+l. 3>c  @Ņx[0WvCgN(>FZ蚱6H T~X̦>t2d*sL5t?5q)@B {Ag{er,Sݰx{wHiE]9 d{7#Ɩx2+p}hHƿ+Ҡ͍BBj # *|ݎvI.:6~gX<[ŗE:4S6MLcI$ڎO uf;S%+m'삜:ۭMn#n/d͇$'A#kr;02%d[O`rlpj>;wkG1'eeF?^-ZROq7pvKžM'leC jU.Whѩſr/0JIs[|G}ƃQU="yR#ӪUUMU 1UtKap)_gdtv? #G 2 ȼL\\͞= *ݓCȳ'oj\MdɅr&+'#9!URb[.D = ~q: 4.w<&.({Yl{.lH]Adk7sI{BZ'+e"[ɿ4rtx=Mc\obzk7s#NF!4^4k"*Ts͚"+tf D6)0]B2S)RmFְ%*)9˃I71丆ńz dO7 yB:nv M4g?;pʖ0K2"Ӊݑ5ڭvqkw/A:RjP;=n3py}"7Q 79]S>GvEK^[.rERzGhސ:od@+N eKn=0cT (>1,)Մ|USvɤdnCn#jGI6'XĮ^d%W gji* %Km ܶ+@E oͥa' ᨨ<˼#oU&/fl9)!95Ya/dev>ΠDP&!OI庣OggY5I9\+YI'}BxxAvx{XNǚ^.i|o#u(Xu 3 t82G/&ݠn4>84Y)8*,swӌ_q>KVurQ Tȼd# =n<1ڀ?uӓ-O,; 8x;]~wXO &/ d;c ;$XݠW {z $XtwS$7|,sXzG͂cǙ}Z1/sW% ywSgcy}H19A6pƿjNLzxuZ6Mr{V䔆5H>#bnR>]C?.5$nv>~N~MZ^ViT ^@ݝBI. (Ut Dj$OTkr<̌5 uif]1i+؋b+3˛]O|?A$]֎dxM>N!br 0*+j-e}7DfdP.޵ȝxqU.\gu\޾}\'H ].71z& xrdg1!6$TR;>h#( ĸys7ByRlɼw5rЩa]]rFÝB%B{;@DYg dV\YCRőjey86zg4 vX3xדki~Crr7-ɷ:,k-6 ")ྻq[ |kw-&K輍$C]vCf fhiNJW>pqTEڒȵ\20޹`l9ف e˺@ЍO=iĶWuԪ oM\C{*?\ e9bJi"JD$_D]͘f&prs*g}P@o2Lm2zon|@}`A*Z\ԍM:%[HV1=t7RY|u/tw/r357. ͔/j2]fQ&.*;D#G=;f!<?8̀g񁧨051Ϊ;!ORWA ֆO+;* 3St8v*bWAz:+(3ufNG遡6nzL.&f; '̑f`~DHJIr  VͨJKjkz,H%yT:r,'t8sy2e tXpY-cO`QŰ1λ$p '.)$Y\ek0;.l0LQ* nM8Bp?gMB`h:o@D4;  Iڥ @7V\?y*!G _c{)XVV{ݸ(E𕌟Wi؜v-a-Pc  >2(mx;6`!H*y2JK%g'[G#\?s#S#,\GvaH2E(r:8:^ʬX4LC$ Q 9S>"99!ئXhҍ ޡ5_xkW<!zN.pKo4,G޸zO5 [-E6dg'T8CFdt{mud/\q9& 2 ^ZX? 8nz)'4cBH|H,S1@E`Um^e:A8ATDFЅ )>;VE !rK3tШx̘!2}E=y{6[[?rOI| eEQB1pR,Fl˥DφqqFORȴ.V$^k7$:t![-ep LzOHVw[Ui6l45\ʽ*PEA3ڢj9Tt8 (}Ti5saK(p4ͥ ӢᓜJRT ]ZE)%~r|˳#pn4|Tg-&ssCۓ`qPx+}\:9F})NgV6$+i5<{6ƫDvL:۩4oZB#hI9)аV)i|$54{'#5Oj7r]MDt-ƣ$YzC5ŒS+ZTknQdH.E'ZjjXECg ˣ*q{1)18/Y`M0M$CdU)o:N4i؆Y ]V3yQn(UJ#7jtUՃOry2x],+Vj6ōzSw^eA]!O'md?羍0+ RH^$ M(~=g2{gTi02]Úz xb5٫IQ:Iĵ#bC89!"{k} H 9شk{NЂ{ CNeR(ǘ?vcDIGG:;ӎ]Ih(7 sJ_NТ2^~M 'Ͷ[ I*F}f7tiFJt8=|mb[{VKX:ٕ rbIȁHiШ/u5qԺ=@Nr=P:D-[Dgz]o!wc9?uCa6b`NɞYJOl!] >]EWV̆%0dRAMPXaܕͬErSy}GwIn?1% )ql7VTFej@$NVLFMJp)Q,vZL:bL{)nml2[Эf͟ ˥M0A82'3.GQc[d_壍v}'t.pW_ gN&1ެF0UFj//}ZOt [aN&#.4I}2[,$Y˙ :_VR{ox9ӫEAArD赲;c[49bVs iS*oO|lȳVfM-zMZ 4 5H~rPQaO SDlZ!M0Jl0E4AAn_30ChQ;T] jVVj߾}S~Z֨nqM\Rm"/cr֥aJw;Jc,}:4|AyKԍä/`;Htt0}qgVFYZa|#hNV. icwQz⯙4: d{c.ڪUQk5h<FdeQܔdNP{[ɋ2Cwhqn8dY8] =V;׳=,8n>GIN癑 [Azv {%?+UE֏4$JNѨ_!Kg: }Fi?Ǯ4iH(9T ϯIy^psi'H6?Qɓ?Ҕ6=KMiHJ 8X<Pf{Ù$0zaK(F*g٧i-@cHw0.W䲂$^#@ok D3==[tml,I  * ϓN\3e3Gc LQJv/pKZ\S *qG}\詰шba;&Lzk#Ty/ӧV];WNHa>YS SNDzok%(Ib1ގJb;%􊙜s}|HxPFJBk-p@0)w= O3KvY7R~.M_9z!?)z8WI}h_go̜( |VW|@oL{7Edg9+˛c2bIqaoV&c> Q_~0e60qP+r 6gyr 4/l~g +"۪h'Fi:El|{6tJ|RVX 5;jknu"Ɛ,AP8C̬\cHvHO{1=@~mM=N/3~XPmA 6ר1vDpMclm,)~uKORswM윥cron|nd͚}9$ S xq󦀢Yndv_qQәi!cvפi&תYiWs")pI*jU^mOoP2sYP|BƗn%oi r+/:YӖ_ZnH +^`NeboW՝4Us?[\I+ڕmC!ф&Eе!;g9=zyb0ᣅisNZ*gvoB_k59 yK%f`D3x@ Ns|l[ꖯ?$62l+ՓB%D :t?M0Sp*yDL7>8}J՘y0%M Yӳdzl9E9( V(3 $!+W>ֽ\? 6tCp $O] 6.RIIDe)=prۆadRd "ui EA i IZVUWZ.uNCD7\/IyYL86?+⹦?8>3̒4qP̳!٦G0.TNFbnAp)kr;$&<`Jۧ< #GC%+ǝ`.~ |?r邷ܔ`uϹ3΍g> ){FQB.`,ѝek,j,::`u$D#tPhv[RL(6^>R\jtkwgX*n{=BŀdKz"rE$F1e޿S iqly RF{s{Kv+ȢثLH{O2s];-e{ZX3 #Ue`cf9&3zC+Cу0gf.xid=~euypcxIwLS{W G2j n/C7grÛptCuKslL7,0n/Τ5FsŠkB WBew7^DW{@6a+y/!קDVc~-3*VkJ_(Eo/,+e$ ﭑ_}7i "/J[;f-]3+oӄ\li:Ni$V{ \# 2Cz&3A_&y\=)R86v D:V}1lY ~GnL{?RںbѼ(Ixn,3,mMU94"%FDBGߟ4a1ֆFdv7c >,6$ {&zֳlk݌<(֎5vbDHB1'Ž<.^m)],<4_&TtUx7wmݫ0kYil>phIȼ:Nbcjevts|e%wH)A]ːp sڜG:"Y"TΦVI[$Uv Kn}ۮ蕝)~߇ p_\ѓ/mW֏sw,FV;t`RVer)v]]WnhH>== (% Q_jվkfd#(3?BW -nfv5qnlq5 lwApO3i2yQY-c)Ӏ5# JöI۝ Ep&Mf<8ĂҘR!? 'ĘvSl?Ur" 6 ҮbC Nyh(0zMЮ:JI~"IFWЖ.= g2'm{[a7;dtZ_kw}Jkr6v^-EqiRV㷮;wOqdKw=3דiHUHG{4m;`wӠBn#`z;"#U)0]]ZǴnW8c.t L#9 pW|vOycӦqYyLTBIKeX,SA;iz6R1HI>LrsX UTnb[;H/rF#~FQҳR^}%k y1dJyV.WS!-󄞈i ފ@]JSAW>% .m8+S .6w\bүrI܆ $d:LSVDERꞛRٯi+Jw[{[L;8n`DS ZVU##7z3Z_ʟNa&-s aAF!v9jn0{[KϷO4Y/:i֏CROfn$h :$@vߛ {l5)n'+>v# ͤ]ei|Y4imt|p0BQx:xtGBAj}∫kٯ[-^;͈nB\]I܀wLh<` *sr63وwT؁WDut:GXۏC"&=O`-;P'9Gg{ԑ8{Z#ޥǠ_=Lh7y]; ]"e)u)'WLy}%ć?U٪ժ ֮FcU[:NJ{E^7;M[K˟+UhFr u^V˭odqkoi70fOWZe/3:d/\x!1vBX2!xڕ6A_ȹ flZrqr;}J_V`1 .#c  X;NsS/7vtAO澥&+`|Y_s#I(FCv$LTL71S,=]eز.ry2m#_VH=FEc]6~bQz|..({fsJKl?"җׯ_PG8`L\%8q|D5X$l=>JXq#Z}<..ڼbjZMܩ70OV : Z.s',bc#.9bBѤm|مDmAH0k\6߲.G3дV,U*bag}`g|q (T:`nuP5ǫO CM:ƏėV/v\4e` WM'VԕL X9SC>rA,eG4ntHE4*>"Wu*GNrM\1hƗ&:'5LI){ɄMgӓs%p } cLg+n#hq[\-7I _ta5◆7w/4҈2sXpM,9ɀ OuM =k~+Bш$QU@%(IUdA"""G.X)GHUJd=*z|ܜEݻŞqg\,nOP @~ОmLL l'Wٍv4`T&%~Y!I#0rhɫ\un ˕rnin}OY?(Da !H3ٚ+HNur.K~[: e'F <q,% }};./3 <!H#{|R̬N .xNb'"~c^Fl:D܀1,dҊ~#feg?ZZ,kjŜȖ Ȼ#C A{S4?Ø1)؂K/A Y5h,ƸM)OH2BFyMT&&Yfݩ4]_5AB~^#tqq8ftB8Oq˘-=pƏ 4/GyK\I&Nл. 8rC0}ŃQ,RRC~ Gv+a#0${kszCɀ1o1=]0XԪb1kl%ĺC3=qJdv"dD`D)X|ˮU17، hQ^8NQXspzx&y,KǜB U˩▖mhJ"FcgKSEx%v ޞ1{@יIBBLϲ?Vm ? MH8V/P fo*R|y2gD<?kI0lڗ4+ XRߘs2HpCrѐAe0TrvڹfcT{۠EcV9/\cgE^Vls%ZGS]U>66-U5SWd'nK+0N$RfB'k%L:Ɠ(]R򢤥/v0e&ŝ}+ާZl!*]hOZSY=v9 (/g3z2%潃O6et늖49">0WNvug=+S Y0G80y0[ *v>rrPh Sw:챘Q6 c`8Ut'Ѭ҈F1wX#ԠXՌKu b N\_j>O iYR9~ `<"`sGY 0E.NC̺W?,mfEgpsX=$iCF(.Ȧ$.A\5#do毪IӎOҰSvxl׳e,3hES%ϲP}]w;OC2e$Q&g)&KaZhwGlkf&*~|㔘RF5tt_bR! $1$r'Lqx');x{4gc~&0j 0KqR?D0bѷ{o4 Sƫfi4tņɹԏNZ$POFMp&]"1 d,+yÓT%xSq|N>32X\}, Ɓqt-79nrv *8*zT(:Z9 -\|5eܑt C/'Ʃb,T(g)Kk38eXx FQ?˼؊},9M`1eC>p1T G'} ˪FE !f QpvEP k;~6k(roEjs_XK~I *Ŭt)'P*JKN|}O?Hw F1LCt(XA4! {'mѾDGnBP|ۭ5I'Y5Y:k2e;8{MbpA;jnR[_늋I[;6;NB9~{Q>Z,ĉ:PoR]}*7h6|Km\Fk^Y|əg❯MzRvpTTK9p4FEducv&*pb08I\^3܄wWP3k`YUx>zꙊ`QǥA&׉k^ ECTb_g74$5B[gAJ^d;ϑ`W4 {yu*zuWn= I+1|rUWUrpt(xMX/y#RV9IZIg 9Z )ℳQG_ՖdJ 8ѐPYz`A>3  جr6IPЌU8 ]199 {p^.IE$/򤄃qaTq:;`_QW qmSL dхOAC2"nm,ػ8- վ(/ta?RiogP]쇽Q]2餲ݕl2q=0CXx5רFu!e*R0OAvn |h{u9SNqvL} qh U` ݿE%I4,w\1\ 1Dd .*  >/eK@nUV{\E5Aqdnۧ}a7e/ޓ6Vcb#GO8PE'A*k~c9uZ.65{tX*XO3ZqGt%T,$cء陶W4gysX4 S[ڎ}.Cmd7Q=lwGG/#6\5mnz]:gO} - A=0IPin+AG>C {pr]^ 6s4Wȶ[e}]stH Ҩ,,8d1J5/QW:$ 1yk e_ccL^ޟqMJ%E%6d&ΰqTP8QbnGNbG.Yѹ1%QW|f"?d H" AtoIMRW8ULʨ"9lMncQjzJ*ESpL-Qj$y7g_xLHrp!pczy+D1 ;"[@!+n-' Zw{>,N QeSbY>iq*cvI=+:¨pr6FSå@v>.*x0 p y>_#6naY_on> `N8mvآnڸX{Z^յ6Qi/:LӁ6h\_p~1F)6p|YQW]m'j2g ;{ Ȣt*p‚b?.FAjx<wVxE$kڸfN oVATwfm^{KӖ 3*xK\W9opzɼh*MI[)OHE&]ݻbt@]XQTոy)^yH[ T`F=&"LV(]$uaA\|xM ÙyX6Ɉ1vT6@L>)l#l*!BD'@WX.]q=ps =4$"Ì6'aղ?5񎄳&W9= /=2 4mA67q8bgj%O~p4ca"GPke4O1/<+ ~F`FfUnDFMcfZ ӕ72|j~0.Qb`Iۤ`qf.di0ԁ~S^[-Un]a0I+ 8c[0'$1qѓhxu)X3iHTXag7 xG 8?EWG< VA`f vow,|V~ԭIv!2PEל덲 ";wf0yY{A/_/rPzF7IkQI"_V $r/s&#:t!ms6|4&%6[ca|IV7|7X8,e-iy8MszH_|/tSECr+uRƧ|!=?p_'ȿ| :!=E-sI]=vj&,d.@c{ :ē:2IgH6V%n*;OG ۭh,Tƍy W(Wg~CV5R7 t3۞ 55a,P$.)G+M9vA8Lo6Ѣi-nM!1!.p۰#,NX:I5*{il圇 bK4EU ];N%OC&s#sygP7Cm?ÜD݃) m~,їi9'_؆i6&ɠkcT[ٿ ڵ'R|JٟIAR != `^O@nI¶}Ұ~%?r4x iٜ}G -ط|[%(rn'A kϜ`٭ ~lm7G?v"KlϱY;U>_mwWF9VsgO\w5ղouc}z9; BC4>Xp|o&A!/鷓10|beLc; Wzl ['$ fkB7 !"98F M}j HdT$YY&WEANXJ +n}#}e L4{G2 [zx|7?n6~\567GϫgI=Ńw{%}/{/ /s񊵧@j^c4WqKI)nM.X509!Pl+ G [ o뽧e ."J 58L11WD <02P^L/<,p "zmڜp/Ft9MvAN3^춣Cٚ>屄U+ng|Fwq=UN?c1j%H p3lLp)B2j(uTy@;ѨI8u]yYQ|ճ\ Vߨ{ƐC!l]LļV6` l{9eQ|/!l}Ah]p.HSQ6T,Pus#\,tLi"dt&Y4qr Ovڗq(n4%4;$5Pk>H:lUŷ$hA88 n<7yôKOˮX3[̈mHVגlǗ>CXPC`v%Ĥ׋:641nvs*, A o^{A[o!u%@|~ʜڸVi18cpfvww?h{l-P;NJIsi!$Q Hmq͞EQ'=iy#PsW 4K6O3 ztJLw2 #҇w\Cn"aȓOO٣Zѓx {g0VIPB-/\eZ&KvAzO\ٻ j<) * w9:17WQVd~tu-UNfOR3 O.,n# ^ /\En nealQ< IuajSEn&_30MDX9o $'HrNvDqICgX񭈚n\WzUyX]a;ڸot=] &rL$G yΣg`M1?ꪑ3MO+A4@S4)ŭ.לo#8Y؂Km]J#LHjID.4s=2>"ƚC"P^4Na5w#Հ2rf`' f$ (]]wQu6sZgn^(|QDu؋Lŷ8llxo_ n~o08!.Zj\%O3@8BATNymK= ..s4ߗO8qlL8, WY9fvit;H},&soR3!uWJisB6UueiwhI8{u (IeJ5Hvp1t^=lF0fB8##xsݯ ^Ga41Vvjsd)|\pyrqS6"!K촰lbe7\K.$=> cadƎ PQҟs@R'iWR±w/-sy5j:,'ΰ+W^Zz^ \Kf <|~5椷J[rn>+HG H-J(Ơǰ:$Q($. HS^et.0rj7< ##Q qs™ƑF//ؗD;3`c]/kE^\DӢ֨e^$j8rpe!7:1LLY\5_n]pk yua>.%\o9,wǷv8,h=9;؁*Dg쫥i0Sg/̕6{? zǮfXԭN(fՋ$7"_81͋7X50X`WA6^on>f6<:~F?]"OuC|t#t%s{r/N"?G O$k==<8{m13^Y>*-zs˳HY iZRBeۀeyF>y ݇iنTovׁ}cX*~GЦ,1U-|vElJ&WH0pZEPl&bn<oR+XǕѰX}HNkOSQQ5YwwLޘB>[W`& 1N~I!L,l]/h%?Zhod͎4NYX" tL]{I;"Ϫj?Ȗ #Mt;HMv%4 uMa#KnpuKWjfm{4 a}OHf-/eF4p+Fpl;0Gfk4DtM?<5ߓ{S2|>[ߞd5kj۸cFY{2]=dBV+`9t@11&?R~] >vʦ4=-mNH=mQt2N ٧J΢ 2C)$) @=Vgъq?py fW=mtՅaY/pM4