Contents of /trunk/kernel-alx-legacy/patches-4.9/0402-4.9.303-all-fixes.patch
Parent Directory | Revision Log
Revision 3704 -
(show annotations)
(download)
Mon Oct 24 14:08:17 2022 UTC (18 months, 3 weeks ago) by niro
File size: 34900 byte(s)
Mon Oct 24 14:08:17 2022 UTC (18 months, 3 weeks ago) by niro
File size: 34900 byte(s)
-linux-4.9.303
1 | diff --git a/Makefile b/Makefile |
2 | index d2a09d4a37082..27d5e129444e3 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 4 |
7 | PATCHLEVEL = 9 |
8 | -SUBLEVEL = 302 |
9 | +SUBLEVEL = 303 |
10 | EXTRAVERSION = |
11 | NAME = Roaring Lionus |
12 | |
13 | diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c |
14 | index 0827ee7d0e9b6..f1aa0b932c547 100644 |
15 | --- a/arch/x86/kvm/pmu.c |
16 | +++ b/arch/x86/kvm/pmu.c |
17 | @@ -164,7 +164,7 @@ void reprogram_gp_counter(struct kvm_pmc *pmc, u64 eventsel) |
18 | } |
19 | |
20 | if (type == PERF_TYPE_RAW) |
21 | - config = eventsel & X86_RAW_EVENT_MASK; |
22 | + config = eventsel & AMD64_RAW_EVENT_MASK; |
23 | |
24 | pmc_reprogram_counter(pmc, type, config, |
25 | !(eventsel & ARCH_PERFMON_EVENTSEL_USR), |
26 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
27 | index a92cbe1aa72a2..35db918a1de56 100644 |
28 | --- a/drivers/ata/libata-core.c |
29 | +++ b/drivers/ata/libata-core.c |
30 | @@ -4486,6 +4486,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
31 | |
32 | /* devices that don't properly handle TRIM commands */ |
33 | { "SuperSSpeed S238*", NULL, ATA_HORKAGE_NOTRIM, }, |
34 | + { "M88V29*", NULL, ATA_HORKAGE_NOTRIM, }, |
35 | |
36 | /* |
37 | * As defined, the DRAT (Deterministic Read After Trim) and RZAT |
38 | diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c |
39 | index c3ee3ad98a638..4fb313f6612ce 100644 |
40 | --- a/drivers/edac/edac_mc.c |
41 | +++ b/drivers/edac/edac_mc.c |
42 | @@ -199,7 +199,7 @@ void *edac_align_ptr(void **p, unsigned size, int n_elems) |
43 | else |
44 | return (char *)ptr; |
45 | |
46 | - r = (unsigned long)p % align; |
47 | + r = (unsigned long)ptr % align; |
48 | |
49 | if (r == 0) |
50 | return (char *)ptr; |
51 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
52 | index 7bb1e531325be..1b8652cf02187 100644 |
53 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
54 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
55 | @@ -192,7 +192,8 @@ void radeon_atom_backlight_init(struct radeon_encoder *radeon_encoder, |
56 | * so don't register a backlight device |
57 | */ |
58 | if ((rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) && |
59 | - (rdev->pdev->device == 0x6741)) |
60 | + (rdev->pdev->device == 0x6741) && |
61 | + !dmi_match(DMI_PRODUCT_NAME, "iMac12,1")) |
62 | return; |
63 | |
64 | if (!radeon_encoder->enc_priv) |
65 | diff --git a/drivers/i2c/busses/i2c-brcmstb.c b/drivers/i2c/busses/i2c-brcmstb.c |
66 | index a658f975605a7..fe51d3fb5c6b1 100644 |
67 | --- a/drivers/i2c/busses/i2c-brcmstb.c |
68 | +++ b/drivers/i2c/busses/i2c-brcmstb.c |
69 | @@ -645,7 +645,7 @@ static int brcmstb_i2c_probe(struct platform_device *pdev) |
70 | |
71 | /* set the data in/out register size for compatible SoCs */ |
72 | if (of_device_is_compatible(dev->device->of_node, |
73 | - "brcmstb,brcmper-i2c")) |
74 | + "brcm,brcmper-i2c")) |
75 | dev->data_regsz = sizeof(u8); |
76 | else |
77 | dev->data_regsz = sizeof(u32); |
78 | diff --git a/drivers/net/ieee802154/at86rf230.c b/drivers/net/ieee802154/at86rf230.c |
79 | index ce3b7fb7eda09..80c8e9abb402e 100644 |
80 | --- a/drivers/net/ieee802154/at86rf230.c |
81 | +++ b/drivers/net/ieee802154/at86rf230.c |
82 | @@ -108,6 +108,7 @@ struct at86rf230_local { |
83 | unsigned long cal_timeout; |
84 | bool is_tx; |
85 | bool is_tx_from_off; |
86 | + bool was_tx; |
87 | u8 tx_retry; |
88 | struct sk_buff *tx_skb; |
89 | struct at86rf230_state_change tx; |
90 | @@ -351,7 +352,11 @@ at86rf230_async_error_recover_complete(void *context) |
91 | if (ctx->free) |
92 | kfree(ctx); |
93 | |
94 | - ieee802154_wake_queue(lp->hw); |
95 | + if (lp->was_tx) { |
96 | + lp->was_tx = 0; |
97 | + dev_kfree_skb_any(lp->tx_skb); |
98 | + ieee802154_wake_queue(lp->hw); |
99 | + } |
100 | } |
101 | |
102 | static void |
103 | @@ -360,7 +365,11 @@ at86rf230_async_error_recover(void *context) |
104 | struct at86rf230_state_change *ctx = context; |
105 | struct at86rf230_local *lp = ctx->lp; |
106 | |
107 | - lp->is_tx = 0; |
108 | + if (lp->is_tx) { |
109 | + lp->was_tx = 1; |
110 | + lp->is_tx = 0; |
111 | + } |
112 | + |
113 | at86rf230_async_state_change(lp, ctx, STATE_RX_AACK_ON, |
114 | at86rf230_async_error_recover_complete); |
115 | } |
116 | diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c |
117 | index 412a36f27de6d..738d10fc595c0 100644 |
118 | --- a/drivers/net/usb/ax88179_178a.c |
119 | +++ b/drivers/net/usb/ax88179_178a.c |
120 | @@ -1369,59 +1369,69 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
121 | u16 hdr_off; |
122 | u32 *pkt_hdr; |
123 | |
124 | - /* This check is no longer done by usbnet */ |
125 | - if (skb->len < dev->net->hard_header_len) |
126 | + /* At the end of the SKB, there's a header telling us how many packets |
127 | + * are bundled into this buffer and where we can find an array of |
128 | + * per-packet metadata (which contains elements encoded into u16). |
129 | + */ |
130 | + if (skb->len < 4) |
131 | return 0; |
132 | - |
133 | skb_trim(skb, skb->len - 4); |
134 | memcpy(&rx_hdr, skb_tail_pointer(skb), 4); |
135 | le32_to_cpus(&rx_hdr); |
136 | - |
137 | pkt_cnt = (u16)rx_hdr; |
138 | hdr_off = (u16)(rx_hdr >> 16); |
139 | + |
140 | + if (pkt_cnt == 0) |
141 | + return 0; |
142 | + |
143 | + /* Make sure that the bounds of the metadata array are inside the SKB |
144 | + * (and in front of the counter at the end). |
145 | + */ |
146 | + if (pkt_cnt * 2 + hdr_off > skb->len) |
147 | + return 0; |
148 | pkt_hdr = (u32 *)(skb->data + hdr_off); |
149 | |
150 | - while (pkt_cnt--) { |
151 | + /* Packets must not overlap the metadata array */ |
152 | + skb_trim(skb, hdr_off); |
153 | + |
154 | + for (; ; pkt_cnt--, pkt_hdr++) { |
155 | u16 pkt_len; |
156 | |
157 | le32_to_cpus(pkt_hdr); |
158 | pkt_len = (*pkt_hdr >> 16) & 0x1fff; |
159 | |
160 | - /* Check CRC or runt packet */ |
161 | - if ((*pkt_hdr & AX_RXHDR_CRC_ERR) || |
162 | - (*pkt_hdr & AX_RXHDR_DROP_ERR)) { |
163 | - skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
164 | - pkt_hdr++; |
165 | - continue; |
166 | - } |
167 | - |
168 | - if (pkt_cnt == 0) { |
169 | - skb->len = pkt_len; |
170 | - /* Skip IP alignment pseudo header */ |
171 | - skb_pull(skb, 2); |
172 | - skb_set_tail_pointer(skb, skb->len); |
173 | - skb->truesize = pkt_len + sizeof(struct sk_buff); |
174 | - ax88179_rx_checksum(skb, pkt_hdr); |
175 | - return 1; |
176 | - } |
177 | + if (pkt_len > skb->len) |
178 | + return 0; |
179 | |
180 | - ax_skb = skb_clone(skb, GFP_ATOMIC); |
181 | - if (ax_skb) { |
182 | + /* Check CRC or runt packet */ |
183 | + if (((*pkt_hdr & (AX_RXHDR_CRC_ERR | AX_RXHDR_DROP_ERR)) == 0) && |
184 | + pkt_len >= 2 + ETH_HLEN) { |
185 | + bool last = (pkt_cnt == 0); |
186 | + |
187 | + if (last) { |
188 | + ax_skb = skb; |
189 | + } else { |
190 | + ax_skb = skb_clone(skb, GFP_ATOMIC); |
191 | + if (!ax_skb) |
192 | + return 0; |
193 | + } |
194 | ax_skb->len = pkt_len; |
195 | /* Skip IP alignment pseudo header */ |
196 | skb_pull(ax_skb, 2); |
197 | skb_set_tail_pointer(ax_skb, ax_skb->len); |
198 | ax_skb->truesize = pkt_len + sizeof(struct sk_buff); |
199 | ax88179_rx_checksum(ax_skb, pkt_hdr); |
200 | + |
201 | + if (last) |
202 | + return 1; |
203 | + |
204 | usbnet_skb_return(dev, ax_skb); |
205 | - } else { |
206 | - return 0; |
207 | } |
208 | |
209 | - skb_pull(skb, (pkt_len + 7) & 0xFFF8); |
210 | - pkt_hdr++; |
211 | + /* Trim this packet away from the SKB */ |
212 | + if (!skb_pull(skb, (pkt_len + 7) & 0xFFF8)) |
213 | + return 0; |
214 | } |
215 | - return 1; |
216 | } |
217 | |
218 | static struct sk_buff * |
219 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c |
220 | index a8c960152a357..003c53a5bb336 100644 |
221 | --- a/drivers/net/usb/qmi_wwan.c |
222 | +++ b/drivers/net/usb/qmi_wwan.c |
223 | @@ -964,6 +964,8 @@ static const struct usb_device_id products[] = { |
224 | {QMI_FIXED_INTF(0x413c, 0x81d7, 0)}, /* Dell Wireless 5821e */ |
225 | {QMI_FIXED_INTF(0x413c, 0x81d7, 1)}, /* Dell Wireless 5821e preproduction config */ |
226 | {QMI_FIXED_INTF(0x413c, 0x81e0, 0)}, /* Dell Wireless 5821e with eSIM support*/ |
227 | + {QMI_FIXED_INTF(0x413c, 0x81e4, 0)}, /* Dell Wireless 5829e with eSIM support*/ |
228 | + {QMI_FIXED_INTF(0x413c, 0x81e6, 0)}, /* Dell Wireless 5829e */ |
229 | {QMI_FIXED_INTF(0x03f0, 0x4e1d, 8)}, /* HP lt4111 LTE/EV-DO/HSPA+ Gobi 4G Module */ |
230 | {QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */ |
231 | {QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */ |
232 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
233 | index 71edbf7a42ed4..1acffca3d75d7 100644 |
234 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
235 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c |
236 | @@ -1183,8 +1183,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, |
237 | /* This may fail if AMT took ownership of the device */ |
238 | if (iwl_pcie_prepare_card_hw(trans)) { |
239 | IWL_WARN(trans, "Exit HW not ready\n"); |
240 | - ret = -EIO; |
241 | - goto out; |
242 | + return -EIO; |
243 | } |
244 | |
245 | iwl_enable_rfkill_int(trans); |
246 | diff --git a/drivers/parisc/ccio-dma.c b/drivers/parisc/ccio-dma.c |
247 | index 7a5306bf56c85..f6ef5952e94b3 100644 |
248 | --- a/drivers/parisc/ccio-dma.c |
249 | +++ b/drivers/parisc/ccio-dma.c |
250 | @@ -1008,7 +1008,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
251 | ioc->usg_calls++; |
252 | #endif |
253 | |
254 | - while(sg_dma_len(sglist) && nents--) { |
255 | + while (nents && sg_dma_len(sglist)) { |
256 | |
257 | #ifdef CCIO_COLLECT_STATS |
258 | ioc->usg_pages += sg_dma_len(sglist) >> PAGE_SHIFT; |
259 | @@ -1016,6 +1016,7 @@ ccio_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
260 | ccio_unmap_page(dev, sg_dma_address(sglist), |
261 | sg_dma_len(sglist), direction, 0); |
262 | ++sglist; |
263 | + nents--; |
264 | } |
265 | |
266 | DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
267 | diff --git a/drivers/parisc/sba_iommu.c b/drivers/parisc/sba_iommu.c |
268 | index a7f542e784dd0..c715af1b6c3c0 100644 |
269 | --- a/drivers/parisc/sba_iommu.c |
270 | +++ b/drivers/parisc/sba_iommu.c |
271 | @@ -1061,7 +1061,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
272 | spin_unlock_irqrestore(&ioc->res_lock, flags); |
273 | #endif |
274 | |
275 | - while (sg_dma_len(sglist) && nents--) { |
276 | + while (nents && sg_dma_len(sglist)) { |
277 | |
278 | sba_unmap_page(dev, sg_dma_address(sglist), sg_dma_len(sglist), |
279 | direction, 0); |
280 | @@ -1070,6 +1070,7 @@ sba_unmap_sg(struct device *dev, struct scatterlist *sglist, int nents, |
281 | ioc->usingle_calls--; /* kluge since call is unmap_sg() */ |
282 | #endif |
283 | ++sglist; |
284 | + nents--; |
285 | } |
286 | |
287 | DBG_RUN_SG("%s() DONE (nents %d)\n", __func__, nents); |
288 | diff --git a/drivers/tty/serial/8250/8250_gsc.c b/drivers/tty/serial/8250/8250_gsc.c |
289 | index b1e6ae9f1ff95..642271c2c48f4 100644 |
290 | --- a/drivers/tty/serial/8250/8250_gsc.c |
291 | +++ b/drivers/tty/serial/8250/8250_gsc.c |
292 | @@ -30,7 +30,7 @@ static int __init serial_init_chip(struct parisc_device *dev) |
293 | unsigned long address; |
294 | int err; |
295 | |
296 | -#ifdef CONFIG_64BIT |
297 | +#if defined(CONFIG_64BIT) && defined(CONFIG_IOSAPIC) |
298 | if (!dev->irq && (dev->id.sversion == 0xad)) |
299 | dev->irq = iosapic_serial_irq(dev); |
300 | #endif |
301 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
302 | index 080b12d65b0cb..35dea3f86fdfa 100644 |
303 | --- a/fs/btrfs/send.c |
304 | +++ b/fs/btrfs/send.c |
305 | @@ -4675,6 +4675,10 @@ static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) |
306 | lock_page(page); |
307 | if (!PageUptodate(page)) { |
308 | unlock_page(page); |
309 | + btrfs_err(fs_info, |
310 | + "send: IO error at offset %llu for inode %llu root %llu", |
311 | + page_offset(page), sctx->cur_ino, |
312 | + sctx->send_root->root_key.objectid); |
313 | put_page(page); |
314 | ret = -EIO; |
315 | break; |
316 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c |
317 | index 24e854dfb3c25..7e94c46d77d7a 100644 |
318 | --- a/fs/nfs/dir.c |
319 | +++ b/fs/nfs/dir.c |
320 | @@ -1605,14 +1605,14 @@ no_open: |
321 | if (!res) { |
322 | inode = d_inode(dentry); |
323 | if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
324 | - !S_ISDIR(inode->i_mode)) |
325 | + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) |
326 | res = ERR_PTR(-ENOTDIR); |
327 | else if (inode && S_ISREG(inode->i_mode)) |
328 | res = ERR_PTR(-EOPENSTALE); |
329 | } else if (!IS_ERR(res)) { |
330 | inode = d_inode(res); |
331 | if ((lookup_flags & LOOKUP_DIRECTORY) && inode && |
332 | - !S_ISDIR(inode->i_mode)) { |
333 | + !(S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode))) { |
334 | dput(res); |
335 | res = ERR_PTR(-ENOTDIR); |
336 | } else if (inode && S_ISREG(inode->i_mode)) { |
337 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c |
338 | index 7a94f5a5f8c8c..99a67d132ec30 100644 |
339 | --- a/fs/nfs/inode.c |
340 | +++ b/fs/nfs/inode.c |
341 | @@ -661,11 +661,8 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
342 | |
343 | trace_nfs_getattr_enter(inode); |
344 | /* Flush out writes to the server in order to update c/mtime. */ |
345 | - if (S_ISREG(inode->i_mode)) { |
346 | - err = filemap_write_and_wait(inode->i_mapping); |
347 | - if (err) |
348 | - goto out; |
349 | - } |
350 | + if (S_ISREG(inode->i_mode)) |
351 | + filemap_write_and_wait(inode->i_mapping); |
352 | |
353 | /* |
354 | * We may force a getattr if the user cares about atime. |
355 | @@ -693,7 +690,7 @@ int nfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) |
356 | if (S_ISDIR(inode->i_mode)) |
357 | stat->blksize = NFS_SERVER(inode)->dtsize; |
358 | } |
359 | -out: |
360 | + |
361 | trace_nfs_getattr_exit(inode, err); |
362 | return err; |
363 | } |
364 | diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c |
365 | index 82a5ecbe2da96..022b237c6a134 100644 |
366 | --- a/fs/quota/dquot.c |
367 | +++ b/fs/quota/dquot.c |
368 | @@ -676,9 +676,14 @@ int dquot_quota_sync(struct super_block *sb, int type) |
369 | /* This is not very clever (and fast) but currently I don't know about |
370 | * any other simple way of getting quota data to disk and we must get |
371 | * them there for userspace to be visible... */ |
372 | - if (sb->s_op->sync_fs) |
373 | - sb->s_op->sync_fs(sb, 1); |
374 | - sync_blockdev(sb->s_bdev); |
375 | + if (sb->s_op->sync_fs) { |
376 | + ret = sb->s_op->sync_fs(sb, 1); |
377 | + if (ret) |
378 | + return ret; |
379 | + } |
380 | + ret = sync_blockdev(sb->s_bdev); |
381 | + if (ret) |
382 | + return ret; |
383 | |
384 | /* |
385 | * Now when everything is written we can discard the pagecache so |
386 | diff --git a/fs/super.c b/fs/super.c |
387 | index 377c439477b74..20e9cd2b6488d 100644 |
388 | --- a/fs/super.c |
389 | +++ b/fs/super.c |
390 | @@ -1298,11 +1298,9 @@ static void lockdep_sb_freeze_acquire(struct super_block *sb) |
391 | percpu_rwsem_acquire(sb->s_writers.rw_sem + level, 0, _THIS_IP_); |
392 | } |
393 | |
394 | -static void sb_freeze_unlock(struct super_block *sb) |
395 | +static void sb_freeze_unlock(struct super_block *sb, int level) |
396 | { |
397 | - int level; |
398 | - |
399 | - for (level = SB_FREEZE_LEVELS - 1; level >= 0; level--) |
400 | + for (level--; level >= 0; level--) |
401 | percpu_up_write(sb->s_writers.rw_sem + level); |
402 | } |
403 | |
404 | @@ -1373,7 +1371,14 @@ int freeze_super(struct super_block *sb) |
405 | sb_wait_write(sb, SB_FREEZE_PAGEFAULT); |
406 | |
407 | /* All writers are done so after syncing there won't be dirty data */ |
408 | - sync_filesystem(sb); |
409 | + ret = sync_filesystem(sb); |
410 | + if (ret) { |
411 | + sb->s_writers.frozen = SB_UNFROZEN; |
412 | + sb_freeze_unlock(sb, SB_FREEZE_PAGEFAULT); |
413 | + wake_up(&sb->s_writers.wait_unfrozen); |
414 | + deactivate_locked_super(sb); |
415 | + return ret; |
416 | + } |
417 | |
418 | /* Now wait for internal filesystem counter */ |
419 | sb->s_writers.frozen = SB_FREEZE_FS; |
420 | @@ -1385,7 +1390,7 @@ int freeze_super(struct super_block *sb) |
421 | printk(KERN_ERR |
422 | "VFS:Filesystem freeze failed\n"); |
423 | sb->s_writers.frozen = SB_UNFROZEN; |
424 | - sb_freeze_unlock(sb); |
425 | + sb_freeze_unlock(sb, SB_FREEZE_FS); |
426 | wake_up(&sb->s_writers.wait_unfrozen); |
427 | deactivate_locked_super(sb); |
428 | return ret; |
429 | @@ -1437,7 +1442,7 @@ int thaw_super(struct super_block *sb) |
430 | } |
431 | |
432 | sb->s_writers.frozen = SB_UNFROZEN; |
433 | - sb_freeze_unlock(sb); |
434 | + sb_freeze_unlock(sb, SB_FREEZE_FS); |
435 | out: |
436 | wake_up(&sb->s_writers.wait_unfrozen); |
437 | deactivate_locked_super(sb); |
438 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c |
439 | index 01c646a1d9e76..12bee7043be6f 100644 |
440 | --- a/kernel/trace/trace.c |
441 | +++ b/kernel/trace/trace.c |
442 | @@ -228,6 +228,10 @@ __setup("trace_clock=", set_trace_boot_clock); |
443 | |
444 | static int __init set_tracepoint_printk(char *str) |
445 | { |
446 | + /* Ignore the "tp_printk_stop_on_boot" param */ |
447 | + if (*str == '_') |
448 | + return 0; |
449 | + |
450 | if ((strcmp(str, "=0") != 0 && strcmp(str, "=off") != 0)) |
451 | tracepoint_printk = 1; |
452 | return 1; |
453 | diff --git a/kernel/tsacct.c b/kernel/tsacct.c |
454 | index f8e26ab963ed2..06406633d7cdb 100644 |
455 | --- a/kernel/tsacct.c |
456 | +++ b/kernel/tsacct.c |
457 | @@ -44,11 +44,10 @@ void bacct_add_tsk(struct user_namespace *user_ns, |
458 | /* Convert to seconds for btime */ |
459 | do_div(delta, USEC_PER_SEC); |
460 | stats->ac_btime = get_seconds() - delta; |
461 | - if (thread_group_leader(tsk)) { |
462 | + if (tsk->flags & PF_EXITING) |
463 | stats->ac_exitcode = tsk->exit_code; |
464 | - if (tsk->flags & PF_FORKNOEXEC) |
465 | - stats->ac_flag |= AFORK; |
466 | - } |
467 | + if (thread_group_leader(tsk) && (tsk->flags & PF_FORKNOEXEC)) |
468 | + stats->ac_flag |= AFORK; |
469 | if (tsk->flags & PF_SUPERPRIV) |
470 | stats->ac_flag |= ASU; |
471 | if (tsk->flags & PF_DUMPCORE) |
472 | diff --git a/lib/iov_iter.c b/lib/iov_iter.c |
473 | index 07d735b2eccf7..e01bb1c51d87b 100644 |
474 | --- a/lib/iov_iter.c |
475 | +++ b/lib/iov_iter.c |
476 | @@ -370,6 +370,7 @@ static size_t copy_page_to_iter_pipe(struct page *page, size_t offset, size_t by |
477 | return 0; |
478 | pipe->nrbufs++; |
479 | buf->ops = &page_cache_pipe_buf_ops; |
480 | + buf->flags = 0; |
481 | get_page(buf->page = page); |
482 | buf->offset = offset; |
483 | buf->len = bytes; |
484 | @@ -494,6 +495,7 @@ static size_t push_pipe(struct iov_iter *i, size_t size, |
485 | break; |
486 | pipe->nrbufs++; |
487 | pipe->bufs[idx].ops = &default_pipe_buf_ops; |
488 | + pipe->bufs[idx].flags = 0; |
489 | pipe->bufs[idx].page = page; |
490 | pipe->bufs[idx].offset = 0; |
491 | if (left <= PAGE_SIZE) { |
492 | diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c |
493 | index f4c8567e91b38..c4ef1be59cb19 100644 |
494 | --- a/net/ax25/af_ax25.c |
495 | +++ b/net/ax25/af_ax25.c |
496 | @@ -80,6 +80,7 @@ static void ax25_kill_by_device(struct net_device *dev) |
497 | { |
498 | ax25_dev *ax25_dev; |
499 | ax25_cb *s; |
500 | + struct sock *sk; |
501 | |
502 | if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) |
503 | return; |
504 | @@ -88,13 +89,15 @@ static void ax25_kill_by_device(struct net_device *dev) |
505 | again: |
506 | ax25_for_each(s, &ax25_list) { |
507 | if (s->ax25_dev == ax25_dev) { |
508 | + sk = s->sk; |
509 | + sock_hold(sk); |
510 | spin_unlock_bh(&ax25_list_lock); |
511 | - lock_sock(s->sk); |
512 | + lock_sock(sk); |
513 | s->ax25_dev = NULL; |
514 | - release_sock(s->sk); |
515 | + release_sock(sk); |
516 | ax25_disconnect(s, ENETUNREACH); |
517 | spin_lock_bh(&ax25_list_lock); |
518 | - |
519 | + sock_put(sk); |
520 | /* The entry could have been deleted from the |
521 | * list meanwhile and thus the next pointer is |
522 | * no longer valid. Play it safe and restart |
523 | diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c |
524 | index 6d7ff117f3792..6655c06a325cf 100644 |
525 | --- a/net/core/drop_monitor.c |
526 | +++ b/net/core/drop_monitor.c |
527 | @@ -224,13 +224,17 @@ static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi, |
528 | |
529 | rcu_read_lock(); |
530 | list_for_each_entry_rcu(new_stat, &hw_stats_list, list) { |
531 | + struct net_device *dev; |
532 | + |
533 | /* |
534 | * only add a note to our monitor buffer if: |
535 | * 1) this is the dev we received on |
536 | * 2) its after the last_rx delta |
537 | * 3) our rx_dropped count has gone up |
538 | */ |
539 | - if ((new_stat->dev == napi->dev) && |
540 | + /* Paired with WRITE_ONCE() in dropmon_net_event() */ |
541 | + dev = READ_ONCE(new_stat->dev); |
542 | + if ((dev == napi->dev) && |
543 | (time_after(jiffies, new_stat->last_rx + dm_hw_check_delta)) && |
544 | (napi->dev->stats.rx_dropped != new_stat->last_drop_val)) { |
545 | trace_drop_common(NULL, NULL); |
546 | @@ -345,7 +349,10 @@ static int dropmon_net_event(struct notifier_block *ev_block, |
547 | mutex_lock(&trace_state_mutex); |
548 | list_for_each_entry_safe(new_stat, tmp, &hw_stats_list, list) { |
549 | if (new_stat->dev == dev) { |
550 | - new_stat->dev = NULL; |
551 | + |
552 | + /* Paired with READ_ONCE() in trace_napi_poll_hit() */ |
553 | + WRITE_ONCE(new_stat->dev, NULL); |
554 | + |
555 | if (trace_state == TRACE_OFF) { |
556 | list_del_rcu(&new_stat->list); |
557 | kfree_rcu(new_stat, rcu); |
558 | diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c |
559 | index 1805413cd2251..0f405045dcd81 100644 |
560 | --- a/net/ipv4/xfrm4_policy.c |
561 | +++ b/net/ipv4/xfrm4_policy.c |
562 | @@ -16,6 +16,7 @@ |
563 | #include <net/xfrm.h> |
564 | #include <net/ip.h> |
565 | #include <net/l3mdev.h> |
566 | +#include <net/inet_ecn.h> |
567 | |
568 | static struct xfrm_policy_afinfo xfrm4_policy_afinfo; |
569 | |
570 | @@ -123,7 +124,7 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse) |
571 | fl4->flowi4_proto = iph->protocol; |
572 | fl4->daddr = reverse ? iph->saddr : iph->daddr; |
573 | fl4->saddr = reverse ? iph->daddr : iph->saddr; |
574 | - fl4->flowi4_tos = iph->tos; |
575 | + fl4->flowi4_tos = iph->tos & ~INET_ECN_MASK; |
576 | |
577 | if (!ip_is_fragment(iph)) { |
578 | switch (iph->protocol) { |
579 | diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c |
580 | index 95470d628d34b..46ff984da6f44 100644 |
581 | --- a/net/vmw_vsock/af_vsock.c |
582 | +++ b/net/vmw_vsock/af_vsock.c |
583 | @@ -279,7 +279,8 @@ EXPORT_SYMBOL_GPL(vsock_insert_connected); |
584 | void vsock_remove_bound(struct vsock_sock *vsk) |
585 | { |
586 | spin_lock_bh(&vsock_table_lock); |
587 | - __vsock_remove_bound(vsk); |
588 | + if (__vsock_in_bound_table(vsk)) |
589 | + __vsock_remove_bound(vsk); |
590 | spin_unlock_bh(&vsock_table_lock); |
591 | } |
592 | EXPORT_SYMBOL_GPL(vsock_remove_bound); |
593 | @@ -287,7 +288,8 @@ EXPORT_SYMBOL_GPL(vsock_remove_bound); |
594 | void vsock_remove_connected(struct vsock_sock *vsk) |
595 | { |
596 | spin_lock_bh(&vsock_table_lock); |
597 | - __vsock_remove_connected(vsk); |
598 | + if (__vsock_in_connected_table(vsk)) |
599 | + __vsock_remove_connected(vsk); |
600 | spin_unlock_bh(&vsock_table_lock); |
601 | } |
602 | EXPORT_SYMBOL_GPL(vsock_remove_connected); |
603 | @@ -323,35 +325,10 @@ struct sock *vsock_find_connected_socket(struct sockaddr_vm *src, |
604 | } |
605 | EXPORT_SYMBOL_GPL(vsock_find_connected_socket); |
606 | |
607 | -static bool vsock_in_bound_table(struct vsock_sock *vsk) |
608 | -{ |
609 | - bool ret; |
610 | - |
611 | - spin_lock_bh(&vsock_table_lock); |
612 | - ret = __vsock_in_bound_table(vsk); |
613 | - spin_unlock_bh(&vsock_table_lock); |
614 | - |
615 | - return ret; |
616 | -} |
617 | - |
618 | -static bool vsock_in_connected_table(struct vsock_sock *vsk) |
619 | -{ |
620 | - bool ret; |
621 | - |
622 | - spin_lock_bh(&vsock_table_lock); |
623 | - ret = __vsock_in_connected_table(vsk); |
624 | - spin_unlock_bh(&vsock_table_lock); |
625 | - |
626 | - return ret; |
627 | -} |
628 | - |
629 | void vsock_remove_sock(struct vsock_sock *vsk) |
630 | { |
631 | - if (vsock_in_bound_table(vsk)) |
632 | - vsock_remove_bound(vsk); |
633 | - |
634 | - if (vsock_in_connected_table(vsk)) |
635 | - vsock_remove_connected(vsk); |
636 | + vsock_remove_bound(vsk); |
637 | + vsock_remove_connected(vsk); |
638 | } |
639 | EXPORT_SYMBOL_GPL(vsock_remove_sock); |
640 | |
641 | @@ -482,8 +459,7 @@ static void vsock_pending_work(struct work_struct *work) |
642 | * incoming packets can't find this socket, and to reduce the reference |
643 | * count. |
644 | */ |
645 | - if (vsock_in_connected_table(vsk)) |
646 | - vsock_remove_connected(vsk); |
647 | + vsock_remove_connected(vsk); |
648 | |
649 | sk->sk_state = SS_FREE; |
650 | |
651 | @@ -1244,6 +1220,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, |
652 | sk->sk_state = SS_UNCONNECTED; |
653 | sock->state = SS_UNCONNECTED; |
654 | vsock_transport_cancel_pkt(vsk); |
655 | + vsock_remove_connected(vsk); |
656 | goto out_wait; |
657 | } else if (timeout == 0) { |
658 | err = -ETIMEDOUT; |
659 | diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn |
660 | index 1532038f60055..e823bf6a413cb 100644 |
661 | --- a/scripts/Makefile.extrawarn |
662 | +++ b/scripts/Makefile.extrawarn |
663 | @@ -71,5 +71,6 @@ KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) |
664 | KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length) |
665 | KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized) |
666 | KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) |
667 | +KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) |
668 | endif |
669 | endif |
670 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
671 | index 16a692fc7f649..74ce577de7dfe 100644 |
672 | --- a/sound/pci/hda/hda_intel.c |
673 | +++ b/sound/pci/hda/hda_intel.c |
674 | @@ -1424,6 +1424,7 @@ static struct snd_pci_quirk probe_mask_list[] = { |
675 | /* forced codec slots */ |
676 | SND_PCI_QUIRK(0x1043, 0x1262, "ASUS W5Fm", 0x103), |
677 | SND_PCI_QUIRK(0x1046, 0x1262, "ASUS W5F", 0x103), |
678 | + SND_PCI_QUIRK(0x1558, 0x0351, "Schenker Dock 15", 0x105), |
679 | /* WinFast VP200 H (Teradici) user reported broken communication */ |
680 | SND_PCI_QUIRK(0x3a21, 0x040d, "WinFast VP200 H", 0x101), |
681 | {} |
682 | @@ -1609,8 +1610,6 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
683 | |
684 | assign_position_fix(chip, check_position_fix(chip, position_fix[dev])); |
685 | |
686 | - check_probe_mask(chip, dev); |
687 | - |
688 | chip->single_cmd = single_cmd; |
689 | azx_check_snoop_available(chip); |
690 | |
691 | @@ -1631,6 +1630,8 @@ static int azx_create(struct snd_card *card, struct pci_dev *pci, |
692 | chip->bus.needs_damn_long_delay = 1; |
693 | } |
694 | |
695 | + check_probe_mask(chip, dev); |
696 | + |
697 | err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); |
698 | if (err < 0) { |
699 | dev_err(card->dev, "Error creating device [card]!\n"); |
700 | diff --git a/sound/soc/soc-ops.c b/sound/soc/soc-ops.c |
701 | index 4da6f66ea3a21..e2c200c3c1353 100644 |
702 | --- a/sound/soc/soc-ops.c |
703 | +++ b/sound/soc/soc-ops.c |
704 | @@ -319,7 +319,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
705 | unsigned int sign_bit = mc->sign_bit; |
706 | unsigned int mask = (1 << fls(max)) - 1; |
707 | unsigned int invert = mc->invert; |
708 | - int err; |
709 | + int err, ret; |
710 | bool type_2r = false; |
711 | unsigned int val2 = 0; |
712 | unsigned int val, val_mask; |
713 | @@ -361,12 +361,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, |
714 | err = snd_soc_component_update_bits(component, reg, val_mask, val); |
715 | if (err < 0) |
716 | return err; |
717 | + ret = err; |
718 | |
719 | - if (type_2r) |
720 | + if (type_2r) { |
721 | err = snd_soc_component_update_bits(component, reg2, val_mask, |
722 | - val2); |
723 | + val2); |
724 | + /* Don't discard any error code or drop change flag */ |
725 | + if (ret == 0 || err < 0) { |
726 | + ret = err; |
727 | + } |
728 | + } |
729 | |
730 | - return err; |
731 | + return ret; |
732 | } |
733 | EXPORT_SYMBOL_GPL(snd_soc_put_volsw); |
734 | |
735 | @@ -522,7 +528,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
736 | unsigned int mask = (1 << fls(max)) - 1; |
737 | unsigned int invert = mc->invert; |
738 | unsigned int val, val_mask; |
739 | - int ret; |
740 | + int err, ret; |
741 | |
742 | if (invert) |
743 | val = (max - ucontrol->value.integer.value[0]) & mask; |
744 | @@ -531,9 +537,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
745 | val_mask = mask << shift; |
746 | val = val << shift; |
747 | |
748 | - ret = snd_soc_component_update_bits(component, reg, val_mask, val); |
749 | - if (ret < 0) |
750 | - return ret; |
751 | + err = snd_soc_component_update_bits(component, reg, val_mask, val); |
752 | + if (err < 0) |
753 | + return err; |
754 | + ret = err; |
755 | |
756 | if (snd_soc_volsw_is_stereo(mc)) { |
757 | if (invert) |
758 | @@ -543,8 +550,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, |
759 | val_mask = mask << shift; |
760 | val = val << shift; |
761 | |
762 | - ret = snd_soc_component_update_bits(component, rreg, val_mask, |
763 | + err = snd_soc_component_update_bits(component, rreg, val_mask, |
764 | val); |
765 | + /* Don't discard any error code or drop change flag */ |
766 | + if (ret == 0 || err < 0) { |
767 | + ret = err; |
768 | + } |
769 | } |
770 | |
771 | return ret; |
772 | diff --git a/tools/lib/subcmd/subcmd-util.h b/tools/lib/subcmd/subcmd-util.h |
773 | index fc2e45d8aaf1d..f49dbd1674a61 100644 |
774 | --- a/tools/lib/subcmd/subcmd-util.h |
775 | +++ b/tools/lib/subcmd/subcmd-util.h |
776 | @@ -49,15 +49,8 @@ static NORETURN inline void die(const char *err, ...) |
777 | static inline void *xrealloc(void *ptr, size_t size) |
778 | { |
779 | void *ret = realloc(ptr, size); |
780 | - if (!ret && !size) |
781 | - ret = realloc(ptr, 1); |
782 | - if (!ret) { |
783 | - ret = realloc(ptr, size); |
784 | - if (!ret && !size) |
785 | - ret = realloc(ptr, 1); |
786 | - if (!ret) |
787 | - die("Out of memory, realloc failed"); |
788 | - } |
789 | + if (!ret) |
790 | + die("Out of memory, realloc failed"); |
791 | return ret; |
792 | } |
793 | |
794 | diff --git a/tools/testing/selftests/zram/zram.sh b/tools/testing/selftests/zram/zram.sh |
795 | index 9399c4aeaa265..d4652e295ff8a 100755 |
796 | --- a/tools/testing/selftests/zram/zram.sh |
797 | +++ b/tools/testing/selftests/zram/zram.sh |
798 | @@ -1,9 +1,6 @@ |
799 | #!/bin/bash |
800 | TCID="zram.sh" |
801 | |
802 | -# Kselftest framework requirement - SKIP code is 4. |
803 | -ksft_skip=4 |
804 | - |
805 | . ./zram_lib.sh |
806 | |
807 | run_zram () { |
808 | @@ -17,14 +14,4 @@ echo "" |
809 | |
810 | check_prereqs |
811 | |
812 | -# check zram module exists |
813 | -MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
814 | -if [ -f $MODULE_PATH ]; then |
815 | - run_zram |
816 | -elif [ -b /dev/zram0 ]; then |
817 | - run_zram |
818 | -else |
819 | - echo "$TCID : No zram.ko module or /dev/zram0 device file not found" |
820 | - echo "$TCID : CONFIG_ZRAM is not set" |
821 | - exit $ksft_skip |
822 | -fi |
823 | +run_zram |
824 | diff --git a/tools/testing/selftests/zram/zram01.sh b/tools/testing/selftests/zram/zram01.sh |
825 | index b9566a6478a9c..8abc9965089d1 100755 |
826 | --- a/tools/testing/selftests/zram/zram01.sh |
827 | +++ b/tools/testing/selftests/zram/zram01.sh |
828 | @@ -42,9 +42,7 @@ zram_algs="lzo" |
829 | |
830 | zram_fill_fs() |
831 | { |
832 | - local mem_free0=$(free -m | awk 'NR==2 {print $4}') |
833 | - |
834 | - for i in $(seq 0 $(($dev_num - 1))); do |
835 | + for i in $(seq $dev_start $dev_end); do |
836 | echo "fill zram$i..." |
837 | local b=0 |
838 | while [ true ]; do |
839 | @@ -54,29 +52,17 @@ zram_fill_fs() |
840 | b=$(($b + 1)) |
841 | done |
842 | echo "zram$i can be filled with '$b' KB" |
843 | - done |
844 | |
845 | - local mem_free1=$(free -m | awk 'NR==2 {print $4}') |
846 | - local used_mem=$(($mem_free0 - $mem_free1)) |
847 | + local mem_used_total=`awk '{print $3}' "/sys/block/zram$i/mm_stat"` |
848 | + local v=$((100 * 1024 * $b / $mem_used_total)) |
849 | + if [ "$v" -lt 100 ]; then |
850 | + echo "FAIL compression ratio: 0.$v:1" |
851 | + ERR_CODE=-1 |
852 | + return |
853 | + fi |
854 | |
855 | - local total_size=0 |
856 | - for sm in $zram_sizes; do |
857 | - local s=$(echo $sm | sed 's/M//') |
858 | - total_size=$(($total_size + $s)) |
859 | + echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
860 | done |
861 | - |
862 | - echo "zram used ${used_mem}M, zram disk sizes ${total_size}M" |
863 | - |
864 | - local v=$((100 * $total_size / $used_mem)) |
865 | - |
866 | - if [ "$v" -lt 100 ]; then |
867 | - echo "FAIL compression ratio: 0.$v:1" |
868 | - ERR_CODE=-1 |
869 | - zram_cleanup |
870 | - return |
871 | - fi |
872 | - |
873 | - echo "zram compression ratio: $(echo "scale=2; $v / 100 " | bc):1: OK" |
874 | } |
875 | |
876 | check_prereqs |
877 | @@ -90,7 +76,6 @@ zram_mount |
878 | |
879 | zram_fill_fs |
880 | zram_cleanup |
881 | -zram_unload |
882 | |
883 | if [ $ERR_CODE -ne 0 ]; then |
884 | echo "$TCID : [FAIL]" |
885 | diff --git a/tools/testing/selftests/zram/zram02.sh b/tools/testing/selftests/zram/zram02.sh |
886 | index 74569b883737f..3768cfd2e5f83 100755 |
887 | --- a/tools/testing/selftests/zram/zram02.sh |
888 | +++ b/tools/testing/selftests/zram/zram02.sh |
889 | @@ -45,7 +45,6 @@ zram_set_memlimit |
890 | zram_makeswap |
891 | zram_swapoff |
892 | zram_cleanup |
893 | -zram_unload |
894 | |
895 | if [ $ERR_CODE -ne 0 ]; then |
896 | echo "$TCID : [FAIL]" |
897 | diff --git a/tools/testing/selftests/zram/zram_lib.sh b/tools/testing/selftests/zram/zram_lib.sh |
898 | index 9e73a4fb9b0aa..130d193cbd727 100755 |
899 | --- a/tools/testing/selftests/zram/zram_lib.sh |
900 | +++ b/tools/testing/selftests/zram/zram_lib.sh |
901 | @@ -14,12 +14,17 @@ |
902 | # Author: Alexey Kodanev <alexey.kodanev@oracle.com> |
903 | # Modified: Naresh Kamboju <naresh.kamboju@linaro.org> |
904 | |
905 | -MODULE=0 |
906 | dev_makeswap=-1 |
907 | dev_mounted=-1 |
908 | - |
909 | +dev_start=0 |
910 | +dev_end=-1 |
911 | +module_load=-1 |
912 | +sys_control=-1 |
913 | # Kselftest framework requirement - SKIP code is 4. |
914 | ksft_skip=4 |
915 | +kernel_version=`uname -r | cut -d'.' -f1,2` |
916 | +kernel_major=${kernel_version%.*} |
917 | +kernel_minor=${kernel_version#*.} |
918 | |
919 | trap INT |
920 | |
921 | @@ -34,68 +39,104 @@ check_prereqs() |
922 | fi |
923 | } |
924 | |
925 | +kernel_gte() |
926 | +{ |
927 | + major=${1%.*} |
928 | + minor=${1#*.} |
929 | + |
930 | + if [ $kernel_major -gt $major ]; then |
931 | + return 0 |
932 | + elif [[ $kernel_major -eq $major && $kernel_minor -ge $minor ]]; then |
933 | + return 0 |
934 | + fi |
935 | + |
936 | + return 1 |
937 | +} |
938 | + |
939 | zram_cleanup() |
940 | { |
941 | echo "zram cleanup" |
942 | local i= |
943 | - for i in $(seq 0 $dev_makeswap); do |
944 | + for i in $(seq $dev_start $dev_makeswap); do |
945 | swapoff /dev/zram$i |
946 | done |
947 | |
948 | - for i in $(seq 0 $dev_mounted); do |
949 | + for i in $(seq $dev_start $dev_mounted); do |
950 | umount /dev/zram$i |
951 | done |
952 | |
953 | - for i in $(seq 0 $(($dev_num - 1))); do |
954 | + for i in $(seq $dev_start $dev_end); do |
955 | echo 1 > /sys/block/zram${i}/reset |
956 | rm -rf zram$i |
957 | done |
958 | |
959 | -} |
960 | + if [ $sys_control -eq 1 ]; then |
961 | + for i in $(seq $dev_start $dev_end); do |
962 | + echo $i > /sys/class/zram-control/hot_remove |
963 | + done |
964 | + fi |
965 | |
966 | -zram_unload() |
967 | -{ |
968 | - if [ $MODULE -ne 0 ] ; then |
969 | - echo "zram rmmod zram" |
970 | + if [ $module_load -eq 1 ]; then |
971 | rmmod zram > /dev/null 2>&1 |
972 | fi |
973 | } |
974 | |
975 | zram_load() |
976 | { |
977 | - # check zram module exists |
978 | - MODULE_PATH=/lib/modules/`uname -r`/kernel/drivers/block/zram/zram.ko |
979 | - if [ -f $MODULE_PATH ]; then |
980 | - MODULE=1 |
981 | - echo "create '$dev_num' zram device(s)" |
982 | - modprobe zram num_devices=$dev_num |
983 | - if [ $? -ne 0 ]; then |
984 | - echo "failed to insert zram module" |
985 | - exit 1 |
986 | - fi |
987 | - |
988 | - dev_num_created=$(ls /dev/zram* | wc -w) |
989 | + echo "create '$dev_num' zram device(s)" |
990 | + |
991 | + # zram module loaded, new kernel |
992 | + if [ -d "/sys/class/zram-control" ]; then |
993 | + echo "zram modules already loaded, kernel supports" \ |
994 | + "zram-control interface" |
995 | + dev_start=$(ls /dev/zram* | wc -w) |
996 | + dev_end=$(($dev_start + $dev_num - 1)) |
997 | + sys_control=1 |
998 | + |
999 | + for i in $(seq $dev_start $dev_end); do |
1000 | + cat /sys/class/zram-control/hot_add > /dev/null |
1001 | + done |
1002 | + |
1003 | + echo "all zram devices (/dev/zram$dev_start~$dev_end" \ |
1004 | + "successfully created" |
1005 | + return 0 |
1006 | + fi |
1007 | |
1008 | - if [ "$dev_num_created" -ne "$dev_num" ]; then |
1009 | - echo "unexpected num of devices: $dev_num_created" |
1010 | - ERR_CODE=-1 |
1011 | + # detect old kernel or built-in |
1012 | + modprobe zram num_devices=$dev_num |
1013 | + if [ ! -d "/sys/class/zram-control" ]; then |
1014 | + if grep -q '^zram' /proc/modules; then |
1015 | + rmmod zram > /dev/null 2>&1 |
1016 | + if [ $? -ne 0 ]; then |
1017 | + echo "zram module is being used on old kernel" \ |
1018 | + "without zram-control interface" |
1019 | + exit $ksft_skip |
1020 | + fi |
1021 | else |
1022 | - echo "zram load module successful" |
1023 | + echo "test needs CONFIG_ZRAM=m on old kernel without" \ |
1024 | + "zram-control interface" |
1025 | + exit $ksft_skip |
1026 | fi |
1027 | - elif [ -b /dev/zram0 ]; then |
1028 | - echo "/dev/zram0 device file found: OK" |
1029 | - else |
1030 | - echo "ERROR: No zram.ko module or no /dev/zram0 device found" |
1031 | - echo "$TCID : CONFIG_ZRAM is not set" |
1032 | - exit 1 |
1033 | + modprobe zram num_devices=$dev_num |
1034 | fi |
1035 | + |
1036 | + module_load=1 |
1037 | + dev_end=$(($dev_num - 1)) |
1038 | + echo "all zram devices (/dev/zram0~$dev_end) successfully created" |
1039 | } |
1040 | |
1041 | zram_max_streams() |
1042 | { |
1043 | echo "set max_comp_streams to zram device(s)" |
1044 | |
1045 | - local i=0 |
1046 | + kernel_gte 4.7 |
1047 | + if [ $? -eq 0 ]; then |
1048 | + echo "The device attribute max_comp_streams was"\ |
1049 | + "deprecated in 4.7" |
1050 | + return 0 |
1051 | + fi |
1052 | + |
1053 | + local i=$dev_start |
1054 | for max_s in $zram_max_streams; do |
1055 | local sys_path="/sys/block/zram${i}/max_comp_streams" |
1056 | echo $max_s > $sys_path || \ |
1057 | @@ -107,7 +148,7 @@ zram_max_streams() |
1058 | echo "FAIL can't set max_streams '$max_s', get $max_stream" |
1059 | |
1060 | i=$(($i + 1)) |
1061 | - echo "$sys_path = '$max_streams' ($i/$dev_num)" |
1062 | + echo "$sys_path = '$max_streams'" |
1063 | done |
1064 | |
1065 | echo "zram max streams: OK" |
1066 | @@ -117,15 +158,16 @@ zram_compress_alg() |
1067 | { |
1068 | echo "test that we can set compression algorithm" |
1069 | |
1070 | - local algs=$(cat /sys/block/zram0/comp_algorithm) |
1071 | + local i=$dev_start |
1072 | + local algs=$(cat /sys/block/zram${i}/comp_algorithm) |
1073 | echo "supported algs: $algs" |
1074 | - local i=0 |
1075 | + |
1076 | for alg in $zram_algs; do |
1077 | local sys_path="/sys/block/zram${i}/comp_algorithm" |
1078 | echo "$alg" > $sys_path || \ |
1079 | echo "FAIL can't set '$alg' to $sys_path" |
1080 | i=$(($i + 1)) |
1081 | - echo "$sys_path = '$alg' ($i/$dev_num)" |
1082 | + echo "$sys_path = '$alg'" |
1083 | done |
1084 | |
1085 | echo "zram set compression algorithm: OK" |
1086 | @@ -134,14 +176,14 @@ zram_compress_alg() |
1087 | zram_set_disksizes() |
1088 | { |
1089 | echo "set disk size to zram device(s)" |
1090 | - local i=0 |
1091 | + local i=$dev_start |
1092 | for ds in $zram_sizes; do |
1093 | local sys_path="/sys/block/zram${i}/disksize" |
1094 | echo "$ds" > $sys_path || \ |
1095 | echo "FAIL can't set '$ds' to $sys_path" |
1096 | |
1097 | i=$(($i + 1)) |
1098 | - echo "$sys_path = '$ds' ($i/$dev_num)" |
1099 | + echo "$sys_path = '$ds'" |
1100 | done |
1101 | |
1102 | echo "zram set disksizes: OK" |
1103 | @@ -151,14 +193,14 @@ zram_set_memlimit() |
1104 | { |
1105 | echo "set memory limit to zram device(s)" |
1106 | |
1107 | - local i=0 |
1108 | + local i=$dev_start |
1109 | for ds in $zram_mem_limits; do |
1110 | local sys_path="/sys/block/zram${i}/mem_limit" |
1111 | echo "$ds" > $sys_path || \ |
1112 | echo "FAIL can't set '$ds' to $sys_path" |
1113 | |
1114 | i=$(($i + 1)) |
1115 | - echo "$sys_path = '$ds' ($i/$dev_num)" |
1116 | + echo "$sys_path = '$ds'" |
1117 | done |
1118 | |
1119 | echo "zram set memory limit: OK" |
1120 | @@ -167,8 +209,8 @@ zram_set_memlimit() |
1121 | zram_makeswap() |
1122 | { |
1123 | echo "make swap with zram device(s)" |
1124 | - local i=0 |
1125 | - for i in $(seq 0 $(($dev_num - 1))); do |
1126 | + local i=$dev_start |
1127 | + for i in $(seq $dev_start $dev_end); do |
1128 | mkswap /dev/zram$i > err.log 2>&1 |
1129 | if [ $? -ne 0 ]; then |
1130 | cat err.log |
1131 | @@ -191,7 +233,7 @@ zram_makeswap() |
1132 | zram_swapoff() |
1133 | { |
1134 | local i= |
1135 | - for i in $(seq 0 $dev_makeswap); do |
1136 | + for i in $(seq $dev_start $dev_end); do |
1137 | swapoff /dev/zram$i > err.log 2>&1 |
1138 | if [ $? -ne 0 ]; then |
1139 | cat err.log |
1140 | @@ -205,7 +247,7 @@ zram_swapoff() |
1141 | |
1142 | zram_makefs() |
1143 | { |
1144 | - local i=0 |
1145 | + local i=$dev_start |
1146 | for fs in $zram_filesystems; do |
1147 | # if requested fs not supported default it to ext2 |
1148 | which mkfs.$fs > /dev/null 2>&1 || fs=ext2 |
1149 | @@ -224,7 +266,7 @@ zram_makefs() |
1150 | zram_mount() |
1151 | { |
1152 | local i=0 |
1153 | - for i in $(seq 0 $(($dev_num - 1))); do |
1154 | + for i in $(seq $dev_start $dev_end); do |
1155 | echo "mount /dev/zram$i" |
1156 | mkdir zram$i |
1157 | mount /dev/zram$i zram$i > /dev/null || \ |