Annotation of /trunk/kernel-alx/patches-5.4/0313-5.4.214-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(hide annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (22 months, 4 weeks ago) by niro
File size: 13957 byte(s)
Mon Oct 24 12:40:44 2022 UTC (22 months, 4 weeks ago) by niro
File size: 13957 byte(s)
-add missing
1 | niro | 3637 | diff --git a/Documentation/input/joydev/joystick.rst b/Documentation/input/joydev/joystick.rst |
2 | index 9746fd76cc581..f38c330c028e5 100644 | ||
3 | --- a/Documentation/input/joydev/joystick.rst | ||
4 | +++ b/Documentation/input/joydev/joystick.rst | ||
5 | @@ -517,6 +517,7 @@ All I-Force devices are supported by the iforce module. This includes: | ||
6 | * AVB Mag Turbo Force | ||
7 | * AVB Top Shot Pegasus | ||
8 | * AVB Top Shot Force Feedback Racing Wheel | ||
9 | +* Boeder Force Feedback Wheel | ||
10 | * Logitech WingMan Force | ||
11 | * Logitech WingMan Force Wheel | ||
12 | * Guillemot Race Leader Force Feedback | ||
13 | diff --git a/Makefile b/Makefile | ||
14 | index 4a4c83d2b3f7c..59f34d7f6f3b2 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,7 +1,7 @@ | ||
18 | # SPDX-License-Identifier: GPL-2.0 | ||
19 | VERSION = 5 | ||
20 | PATCHLEVEL = 4 | ||
21 | -SUBLEVEL = 213 | ||
22 | +SUBLEVEL = 214 | ||
23 | EXTRAVERSION = | ||
24 | NAME = Kleptomaniac Octopus | ||
25 | |||
26 | diff --git a/drivers/gpu/drm/msm/msm_rd.c b/drivers/gpu/drm/msm/msm_rd.c | ||
27 | index c7832a951039f..a6b024b06b363 100644 | ||
28 | --- a/drivers/gpu/drm/msm/msm_rd.c | ||
29 | +++ b/drivers/gpu/drm/msm/msm_rd.c | ||
30 | @@ -191,6 +191,9 @@ static int rd_open(struct inode *inode, struct file *file) | ||
31 | file->private_data = rd; | ||
32 | rd->open = true; | ||
33 | |||
34 | + /* Reset fifo to clear any previously unread data: */ | ||
35 | + rd->fifo.head = rd->fifo.tail = 0; | ||
36 | + | ||
37 | /* the parsing tools need to know gpu-id to know which | ||
38 | * register database to load. | ||
39 | */ | ||
40 | diff --git a/drivers/hid/intel-ish-hid/ishtp-hid.h b/drivers/hid/intel-ish-hid/ishtp-hid.h | ||
41 | index 5ffd0da3cf1fa..65af0ebef79f6 100644 | ||
42 | --- a/drivers/hid/intel-ish-hid/ishtp-hid.h | ||
43 | +++ b/drivers/hid/intel-ish-hid/ishtp-hid.h | ||
44 | @@ -110,7 +110,7 @@ struct report_list { | ||
45 | * @multi_packet_cnt: Count of fragmented packet count | ||
46 | * | ||
47 | * This structure is used to store completion flags and per client data like | ||
48 | - * like report description, number of HID devices etc. | ||
49 | + * report description, number of HID devices etc. | ||
50 | */ | ||
51 | struct ishtp_cl_data { | ||
52 | /* completion flags */ | ||
53 | diff --git a/drivers/hid/intel-ish-hid/ishtp/client.c b/drivers/hid/intel-ish-hid/ishtp/client.c | ||
54 | index 1cc157126fce7..c0d69303e3b09 100644 | ||
55 | --- a/drivers/hid/intel-ish-hid/ishtp/client.c | ||
56 | +++ b/drivers/hid/intel-ish-hid/ishtp/client.c | ||
57 | @@ -626,13 +626,14 @@ static void ishtp_cl_read_complete(struct ishtp_cl_rb *rb) | ||
58 | } | ||
59 | |||
60 | /** | ||
61 | - * ipc_tx_callback() - IPC tx callback function | ||
62 | + * ipc_tx_send() - IPC tx send function | ||
63 | * @prm: Pointer to client device instance | ||
64 | * | ||
65 | - * Send message over IPC either first time or on callback on previous message | ||
66 | - * completion | ||
67 | + * Send message over IPC. Message will be split into fragments | ||
68 | + * if message size is bigger than IPC FIFO size, and all | ||
69 | + * fragments will be sent one by one. | ||
70 | */ | ||
71 | -static void ipc_tx_callback(void *prm) | ||
72 | +static void ipc_tx_send(void *prm) | ||
73 | { | ||
74 | struct ishtp_cl *cl = prm; | ||
75 | struct ishtp_cl_tx_ring *cl_msg; | ||
76 | @@ -677,32 +678,41 @@ static void ipc_tx_callback(void *prm) | ||
77 | list); | ||
78 | rem = cl_msg->send_buf.size - cl->tx_offs; | ||
79 | |||
80 | - ishtp_hdr.host_addr = cl->host_client_id; | ||
81 | - ishtp_hdr.fw_addr = cl->fw_client_id; | ||
82 | - ishtp_hdr.reserved = 0; | ||
83 | - pmsg = cl_msg->send_buf.data + cl->tx_offs; | ||
84 | + while (rem > 0) { | ||
85 | + ishtp_hdr.host_addr = cl->host_client_id; | ||
86 | + ishtp_hdr.fw_addr = cl->fw_client_id; | ||
87 | + ishtp_hdr.reserved = 0; | ||
88 | + pmsg = cl_msg->send_buf.data + cl->tx_offs; | ||
89 | + | ||
90 | + if (rem <= dev->mtu) { | ||
91 | + /* Last fragment or only one packet */ | ||
92 | + ishtp_hdr.length = rem; | ||
93 | + ishtp_hdr.msg_complete = 1; | ||
94 | + /* Submit to IPC queue with no callback */ | ||
95 | + ishtp_write_message(dev, &ishtp_hdr, pmsg); | ||
96 | + cl->tx_offs = 0; | ||
97 | + cl->sending = 0; | ||
98 | |||
99 | - if (rem <= dev->mtu) { | ||
100 | - ishtp_hdr.length = rem; | ||
101 | - ishtp_hdr.msg_complete = 1; | ||
102 | - cl->sending = 0; | ||
103 | - list_del_init(&cl_msg->list); /* Must be before write */ | ||
104 | - spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags); | ||
105 | - /* Submit to IPC queue with no callback */ | ||
106 | - ishtp_write_message(dev, &ishtp_hdr, pmsg); | ||
107 | - spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags); | ||
108 | - list_add_tail(&cl_msg->list, &cl->tx_free_list.list); | ||
109 | - ++cl->tx_ring_free_size; | ||
110 | - spin_unlock_irqrestore(&cl->tx_free_list_spinlock, | ||
111 | - tx_free_flags); | ||
112 | - } else { | ||
113 | - /* Send IPC fragment */ | ||
114 | - spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags); | ||
115 | - cl->tx_offs += dev->mtu; | ||
116 | - ishtp_hdr.length = dev->mtu; | ||
117 | - ishtp_hdr.msg_complete = 0; | ||
118 | - ishtp_send_msg(dev, &ishtp_hdr, pmsg, ipc_tx_callback, cl); | ||
119 | + break; | ||
120 | + } else { | ||
121 | + /* Send ipc fragment */ | ||
122 | + ishtp_hdr.length = dev->mtu; | ||
123 | + ishtp_hdr.msg_complete = 0; | ||
124 | + /* All fregments submitted to IPC queue with no callback */ | ||
125 | + ishtp_write_message(dev, &ishtp_hdr, pmsg); | ||
126 | + cl->tx_offs += dev->mtu; | ||
127 | + rem = cl_msg->send_buf.size - cl->tx_offs; | ||
128 | + } | ||
129 | } | ||
130 | + | ||
131 | + list_del_init(&cl_msg->list); | ||
132 | + spin_unlock_irqrestore(&cl->tx_list_spinlock, tx_flags); | ||
133 | + | ||
134 | + spin_lock_irqsave(&cl->tx_free_list_spinlock, tx_free_flags); | ||
135 | + list_add_tail(&cl_msg->list, &cl->tx_free_list.list); | ||
136 | + ++cl->tx_ring_free_size; | ||
137 | + spin_unlock_irqrestore(&cl->tx_free_list_spinlock, | ||
138 | + tx_free_flags); | ||
139 | } | ||
140 | |||
141 | /** | ||
142 | @@ -720,7 +730,7 @@ static void ishtp_cl_send_msg_ipc(struct ishtp_device *dev, | ||
143 | return; | ||
144 | |||
145 | cl->tx_offs = 0; | ||
146 | - ipc_tx_callback(cl); | ||
147 | + ipc_tx_send(cl); | ||
148 | ++cl->send_msg_cnt_ipc; | ||
149 | } | ||
150 | |||
151 | diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c | ||
152 | index b2a68bc9f0b4d..b86de1312512b 100644 | ||
153 | --- a/drivers/input/joystick/iforce/iforce-main.c | ||
154 | +++ b/drivers/input/joystick/iforce/iforce-main.c | ||
155 | @@ -50,6 +50,7 @@ static struct iforce_device iforce_device[] = { | ||
156 | { 0x046d, 0xc291, "Logitech WingMan Formula Force", btn_wheel, abs_wheel, ff_iforce }, | ||
157 | { 0x05ef, 0x020a, "AVB Top Shot Pegasus", btn_joystick_avb, abs_avb_pegasus, ff_iforce }, | ||
158 | { 0x05ef, 0x8884, "AVB Mag Turbo Force", btn_wheel, abs_wheel, ff_iforce }, | ||
159 | + { 0x05ef, 0x8886, "Boeder Force Feedback Wheel", btn_wheel, abs_wheel, ff_iforce }, | ||
160 | { 0x05ef, 0x8888, "AVB Top Shot Force Feedback Racing Wheel", btn_wheel, abs_wheel, ff_iforce }, //? | ||
161 | { 0x061c, 0xc0a4, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, //? | ||
162 | { 0x061c, 0xc084, "ACT LABS Force RS", btn_wheel, abs_wheel, ff_iforce }, | ||
163 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
164 | index 70bd79dc43f2e..a9962474d551d 100644 | ||
165 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
166 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
167 | @@ -18154,16 +18154,20 @@ static void tg3_shutdown(struct pci_dev *pdev) | ||
168 | struct net_device *dev = pci_get_drvdata(pdev); | ||
169 | struct tg3 *tp = netdev_priv(dev); | ||
170 | |||
171 | + tg3_reset_task_cancel(tp); | ||
172 | + | ||
173 | rtnl_lock(); | ||
174 | + | ||
175 | netif_device_detach(dev); | ||
176 | |||
177 | if (netif_running(dev)) | ||
178 | dev_close(dev); | ||
179 | |||
180 | - if (system_state == SYSTEM_POWER_OFF) | ||
181 | - tg3_power_down(tp); | ||
182 | + tg3_power_down(tp); | ||
183 | |||
184 | rtnl_unlock(); | ||
185 | + | ||
186 | + pci_disable_device(pdev); | ||
187 | } | ||
188 | |||
189 | /** | ||
190 | diff --git a/drivers/net/ieee802154/cc2520.c b/drivers/net/ieee802154/cc2520.c | ||
191 | index 43506948e444d..0432a4f829a98 100644 | ||
192 | --- a/drivers/net/ieee802154/cc2520.c | ||
193 | +++ b/drivers/net/ieee802154/cc2520.c | ||
194 | @@ -507,6 +507,7 @@ cc2520_tx(struct ieee802154_hw *hw, struct sk_buff *skb) | ||
195 | goto err_tx; | ||
196 | |||
197 | if (status & CC2520_STATUS_TX_UNDERFLOW) { | ||
198 | + rc = -EINVAL; | ||
199 | dev_err(&priv->spi->dev, "cc2520 tx underflow exception\n"); | ||
200 | goto err_tx; | ||
201 | } | ||
202 | diff --git a/drivers/net/phy/dp83822.c b/drivers/net/phy/dp83822.c | ||
203 | index cc1522550f2c4..da3983352dd44 100644 | ||
204 | --- a/drivers/net/phy/dp83822.c | ||
205 | +++ b/drivers/net/phy/dp83822.c | ||
206 | @@ -197,8 +197,7 @@ static int dp83822_config_intr(struct phy_device *phydev) | ||
207 | if (misr_status < 0) | ||
208 | return misr_status; | ||
209 | |||
210 | - misr_status |= (DP83822_RX_ERR_HF_INT_EN | | ||
211 | - DP83822_ANEG_COMPLETE_INT_EN | | ||
212 | + misr_status |= (DP83822_ANEG_COMPLETE_INT_EN | | ||
213 | DP83822_DUP_MODE_CHANGE_INT_EN | | ||
214 | DP83822_SPEED_CHANGED_INT_EN | | ||
215 | DP83822_LINK_STAT_INT_EN | | ||
216 | diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c | ||
217 | index e9512d077b8a8..eb5b39c2bba84 100644 | ||
218 | --- a/drivers/nvme/target/tcp.c | ||
219 | +++ b/drivers/nvme/target/tcp.c | ||
220 | @@ -1416,6 +1416,9 @@ static void nvmet_tcp_state_change(struct sock *sk) | ||
221 | goto done; | ||
222 | |||
223 | switch (sk->sk_state) { | ||
224 | + case TCP_FIN_WAIT2: | ||
225 | + case TCP_LAST_ACK: | ||
226 | + break; | ||
227 | case TCP_FIN_WAIT1: | ||
228 | case TCP_CLOSE_WAIT: | ||
229 | case TCP_CLOSE: | ||
230 | diff --git a/drivers/perf/arm_pmu_platform.c b/drivers/perf/arm_pmu_platform.c | ||
231 | index e35cb76c8d104..6eb077db7384d 100644 | ||
232 | --- a/drivers/perf/arm_pmu_platform.c | ||
233 | +++ b/drivers/perf/arm_pmu_platform.c | ||
234 | @@ -118,7 +118,7 @@ static int pmu_parse_irqs(struct arm_pmu *pmu) | ||
235 | |||
236 | if (num_irqs == 1) { | ||
237 | int irq = platform_get_irq(pdev, 0); | ||
238 | - if (irq && irq_is_percpu_devid(irq)) | ||
239 | + if ((irq > 0) && irq_is_percpu_devid(irq)) | ||
240 | return pmu_parse_percpu_irq(pmu, irq); | ||
241 | } | ||
242 | |||
243 | diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c | ||
244 | index d27a564389a47..e88bd54ff8bd6 100644 | ||
245 | --- a/drivers/platform/x86/acer-wmi.c | ||
246 | +++ b/drivers/platform/x86/acer-wmi.c | ||
247 | @@ -93,6 +93,7 @@ static const struct key_entry acer_wmi_keymap[] __initconst = { | ||
248 | {KE_KEY, 0x22, {KEY_PROG2} }, /* Arcade */ | ||
249 | {KE_KEY, 0x23, {KEY_PROG3} }, /* P_Key */ | ||
250 | {KE_KEY, 0x24, {KEY_PROG4} }, /* Social networking_Key */ | ||
251 | + {KE_KEY, 0x27, {KEY_HELP} }, | ||
252 | {KE_KEY, 0x29, {KEY_PROG3} }, /* P_Key for TM8372 */ | ||
253 | {KE_IGNORE, 0x41, {KEY_MUTE} }, | ||
254 | {KE_IGNORE, 0x42, {KEY_PREVIOUSSONG} }, | ||
255 | @@ -106,7 +107,13 @@ static const struct key_entry acer_wmi_keymap[] __initconst = { | ||
256 | {KE_IGNORE, 0x48, {KEY_VOLUMEUP} }, | ||
257 | {KE_IGNORE, 0x49, {KEY_VOLUMEDOWN} }, | ||
258 | {KE_IGNORE, 0x4a, {KEY_VOLUMEDOWN} }, | ||
259 | - {KE_IGNORE, 0x61, {KEY_SWITCHVIDEOMODE} }, | ||
260 | + /* | ||
261 | + * 0x61 is KEY_SWITCHVIDEOMODE. Usually this is a duplicate input event | ||
262 | + * with the "Video Bus" input device events. But sometimes it is not | ||
263 | + * a dup. Map it to KEY_UNKNOWN instead of using KE_IGNORE so that | ||
264 | + * udev/hwdb can override it on systems where it is not a dup. | ||
265 | + */ | ||
266 | + {KE_KEY, 0x61, {KEY_UNKNOWN} }, | ||
267 | {KE_IGNORE, 0x62, {KEY_BRIGHTNESSUP} }, | ||
268 | {KE_IGNORE, 0x63, {KEY_BRIGHTNESSDOWN} }, | ||
269 | {KE_KEY, 0x64, {KEY_SWITCHVIDEOMODE} }, /* Display Switch */ | ||
270 | diff --git a/drivers/soc/fsl/Kconfig b/drivers/soc/fsl/Kconfig | ||
271 | index f9ad8ad54a7d6..df062477dab05 100644 | ||
272 | --- a/drivers/soc/fsl/Kconfig | ||
273 | +++ b/drivers/soc/fsl/Kconfig | ||
274 | @@ -24,6 +24,7 @@ config FSL_MC_DPIO | ||
275 | tristate "QorIQ DPAA2 DPIO driver" | ||
276 | depends on FSL_MC_BUS | ||
277 | select SOC_BUS | ||
278 | + select FSL_GUTS | ||
279 | help | ||
280 | Driver for the DPAA2 DPIO object. A DPIO provides queue and | ||
281 | buffer management facilities for software to interact with | ||
282 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h | ||
283 | index 2f72753c3e225..0b37c8e550e7d 100644 | ||
284 | --- a/drivers/usb/storage/unusual_uas.h | ||
285 | +++ b/drivers/usb/storage/unusual_uas.h | ||
286 | @@ -62,6 +62,13 @@ UNUSUAL_DEV(0x0984, 0x0301, 0x0128, 0x0128, | ||
287 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
288 | US_FL_IGNORE_UAS), | ||
289 | |||
290 | +/* Reported-by: Tom Hu <huxiaoying@kylinos.cn> */ | ||
291 | +UNUSUAL_DEV(0x0b05, 0x1932, 0x0000, 0x9999, | ||
292 | + "ASUS", | ||
293 | + "External HDD", | ||
294 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
295 | + US_FL_IGNORE_UAS), | ||
296 | + | ||
297 | /* Reported-by: David Webb <djw@noc.ac.uk> */ | ||
298 | UNUSUAL_DEV(0x0bc2, 0x331a, 0x0000, 0x9999, | ||
299 | "Seagate", | ||
300 | diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c | ||
301 | index 7878f145bf1bf..8fbf8658644f0 100644 | ||
302 | --- a/fs/tracefs/inode.c | ||
303 | +++ b/fs/tracefs/inode.c | ||
304 | @@ -139,6 +139,8 @@ struct tracefs_mount_opts { | ||
305 | kuid_t uid; | ||
306 | kgid_t gid; | ||
307 | umode_t mode; | ||
308 | + /* Opt_* bitfield. */ | ||
309 | + unsigned int opts; | ||
310 | }; | ||
311 | |||
312 | enum { | ||
313 | @@ -239,6 +241,7 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) | ||
314 | kgid_t gid; | ||
315 | char *p; | ||
316 | |||
317 | + opts->opts = 0; | ||
318 | opts->mode = TRACEFS_DEFAULT_MODE; | ||
319 | |||
320 | while ((p = strsep(&data, ",")) != NULL) { | ||
321 | @@ -273,24 +276,36 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) | ||
322 | * but traditionally tracefs has ignored all mount options | ||
323 | */ | ||
324 | } | ||
325 | + | ||
326 | + opts->opts |= BIT(token); | ||
327 | } | ||
328 | |||
329 | return 0; | ||
330 | } | ||
331 | |||
332 | -static int tracefs_apply_options(struct super_block *sb) | ||
333 | +static int tracefs_apply_options(struct super_block *sb, bool remount) | ||
334 | { | ||
335 | struct tracefs_fs_info *fsi = sb->s_fs_info; | ||
336 | struct inode *inode = sb->s_root->d_inode; | ||
337 | struct tracefs_mount_opts *opts = &fsi->mount_opts; | ||
338 | |||
339 | - inode->i_mode &= ~S_IALLUGO; | ||
340 | - inode->i_mode |= opts->mode; | ||
341 | + /* | ||
342 | + * On remount, only reset mode/uid/gid if they were provided as mount | ||
343 | + * options. | ||
344 | + */ | ||
345 | + | ||
346 | + if (!remount || opts->opts & BIT(Opt_mode)) { | ||
347 | + inode->i_mode &= ~S_IALLUGO; | ||
348 | + inode->i_mode |= opts->mode; | ||
349 | + } | ||
350 | |||
351 | - inode->i_uid = opts->uid; | ||
352 | + if (!remount || opts->opts & BIT(Opt_uid)) | ||
353 | + inode->i_uid = opts->uid; | ||
354 | |||
355 | - /* Set all the group ids to the mount option */ | ||
356 | - set_gid(sb->s_root, opts->gid); | ||
357 | + if (!remount || opts->opts & BIT(Opt_gid)) { | ||
358 | + /* Set all the group ids to the mount option */ | ||
359 | + set_gid(sb->s_root, opts->gid); | ||
360 | + } | ||
361 | |||
362 | return 0; | ||
363 | } | ||
364 | @@ -305,7 +320,7 @@ static int tracefs_remount(struct super_block *sb, int *flags, char *data) | ||
365 | if (err) | ||
366 | goto fail; | ||
367 | |||
368 | - tracefs_apply_options(sb); | ||
369 | + tracefs_apply_options(sb, true); | ||
370 | |||
371 | fail: | ||
372 | return err; | ||
373 | @@ -357,7 +372,7 @@ static int trace_fill_super(struct super_block *sb, void *data, int silent) | ||
374 | |||
375 | sb->s_op = &tracefs_super_operations; | ||
376 | |||
377 | - tracefs_apply_options(sb); | ||
378 | + tracefs_apply_options(sb, false); | ||
379 | |||
380 | return 0; | ||
381 | |||
382 | diff --git a/mm/mmap.c b/mm/mmap.c | ||
383 | index e8cf6f88933c3..eeebbb20accfe 100644 | ||
384 | --- a/mm/mmap.c | ||
385 | +++ b/mm/mmap.c | ||
386 | @@ -2605,6 +2605,7 @@ static void unmap_region(struct mm_struct *mm, | ||
387 | { | ||
388 | struct vm_area_struct *next = prev ? prev->vm_next : mm->mmap; | ||
389 | struct mmu_gather tlb; | ||
390 | + struct vm_area_struct *cur_vma; | ||
391 | |||
392 | lru_add_drain(); | ||
393 | tlb_gather_mmu(&tlb, mm, start, end); | ||
394 | @@ -2619,8 +2620,12 @@ static void unmap_region(struct mm_struct *mm, | ||
395 | * concurrent flush in this region has to be coming through the rmap, | ||
396 | * and we synchronize against that using the rmap lock. | ||
397 | */ | ||
398 | - if ((vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) != 0) | ||
399 | - tlb_flush_mmu(&tlb); | ||
400 | + for (cur_vma = vma; cur_vma; cur_vma = cur_vma->vm_next) { | ||
401 | + if ((cur_vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) != 0) { | ||
402 | + tlb_flush_mmu(&tlb); | ||
403 | + break; | ||
404 | + } | ||
405 | + } | ||
406 | |||
407 | free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS, | ||
408 | next ? next->vm_start : USER_PGTABLES_CEILING); |