commit: b46fdd9d1832e5019b9f4a733e8d56204f769b2d Author: Mike Pagano <mpagano <AT> gentoo <DOT> org> AuthorDate: Sun Nov 24 15:44:49 2019 +0000 Commit: Mike Pagano <mpagano <AT> gentoo <DOT> org> CommitDate: Sun Nov 24 15:44:49 2019 +0000 URL: https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=b46fdd9d
Linux patch 5.3.13 Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org> 0000_README | 4 + 1012_linux-5.3.13.patch | 451 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 455 insertions(+) diff --git a/0000_README b/0000_README index bb387d0..5f3156b 100644 --- a/0000_README +++ b/0000_README @@ -91,6 +91,10 @@ Patch: 1011_linux-5.3.12.patch From: http://www.kernel.org Desc: Linux 5.3.12 +Patch: 1012_linux-5.3.13.patch +From: http://www.kernel.org +Desc: Linux 5.3.13 + Patch: 1500_XATTR_USER_PREFIX.patch From: https://bugs.gentoo.org/show_bug.cgi?id=470644 Desc: Support for namespace user.pax.* on tmpfs. diff --git a/1012_linux-5.3.13.patch b/1012_linux-5.3.13.patch new file mode 100644 index 0000000..8684d09 --- /dev/null +++ b/1012_linux-5.3.13.patch @@ -0,0 +1,451 @@ +diff --git a/Makefile b/Makefile +index 2f0c428ed2b6..f9d3d58ae801 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 3 +-SUBLEVEL = 12 ++SUBLEVEL = 13 + EXTRAVERSION = + NAME = Bobtail Squid + +diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S +index 10415572e82f..322b55664cca 100644 +--- a/arch/arm64/lib/clear_user.S ++++ b/arch/arm64/lib/clear_user.S +@@ -48,5 +48,6 @@ EXPORT_SYMBOL(__arch_clear_user) + .section .fixup,"ax" + .align 2 + 9: mov x0, x2 // return the original size ++ uaccess_disable_not_uao x2, x3 + ret + .previous +diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S +index 680e74409ff9..8472dc7798b3 100644 +--- a/arch/arm64/lib/copy_from_user.S ++++ b/arch/arm64/lib/copy_from_user.S +@@ -66,5 +66,6 @@ EXPORT_SYMBOL(__arch_copy_from_user) + .section .fixup,"ax" + .align 2 + 9998: sub x0, end, dst // bytes not copied ++ uaccess_disable_not_uao x3, x4 + ret + .previous +diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S +index 0bedae3f3792..8e0355c1e318 100644 +--- a/arch/arm64/lib/copy_in_user.S ++++ b/arch/arm64/lib/copy_in_user.S +@@ -68,5 +68,6 @@ EXPORT_SYMBOL(__arch_copy_in_user) + .section .fixup,"ax" + .align 2 + 9998: sub x0, end, dst // bytes not copied ++ uaccess_disable_not_uao x3, x4 + ret + .previous +diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S +index 2d88c736e8f2..6085214654dc 100644 +--- a/arch/arm64/lib/copy_to_user.S ++++ b/arch/arm64/lib/copy_to_user.S +@@ -65,5 +65,6 @@ EXPORT_SYMBOL(__arch_copy_to_user) + .section .fixup,"ax" + .align 2 + 9998: sub x0, end, dst // bytes not copied ++ uaccess_disable_not_uao x3, x4 + ret + .previous +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c +index 70bcbd02edcb..aabc8c1ab0cd 100644 +--- a/block/bfq-iosched.c ++++ b/block/bfq-iosched.c +@@ -2699,6 +2699,28 @@ static void bfq_bfqq_save_state(struct bfq_queue *bfqq) + } + } + ++ ++static ++void bfq_release_process_ref(struct bfq_data *bfqd, struct bfq_queue *bfqq) ++{ ++ /* ++ * To prevent bfqq's service guarantees from being violated, ++ * bfqq may be left busy, i.e., queued for service, even if ++ * empty (see comments in __bfq_bfqq_expire() for ++ * details). But, if no process will send requests to bfqq any ++ * longer, then there is no point in keeping bfqq queued for ++ * service. In addition, keeping bfqq queued for service, but ++ * with no process ref any longer, may have caused bfqq to be ++ * freed when dequeued from service. But this is assumed to ++ * never happen. ++ */ ++ if (bfq_bfqq_busy(bfqq) && RB_EMPTY_ROOT(&bfqq->sort_list) && ++ bfqq != bfqd->in_service_queue) ++ bfq_del_bfqq_busy(bfqd, bfqq, false); ++ ++ bfq_put_queue(bfqq); ++} ++ + static void + bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic, + struct bfq_queue *bfqq, struct bfq_queue *new_bfqq) +@@ -2769,8 +2791,7 @@ bfq_merge_bfqqs(struct bfq_data *bfqd, struct bfq_io_cq *bic, + */ + new_bfqq->pid = -1; + bfqq->bic = NULL; +- /* release process reference to bfqq */ +- bfq_put_queue(bfqq); ++ bfq_release_process_ref(bfqd, bfqq); + } + + static bool bfq_allow_bio_merge(struct request_queue *q, struct request *rq, +@@ -4885,7 +4906,7 @@ static void bfq_exit_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq) + + bfq_put_cooperator(bfqq); + +- bfq_put_queue(bfqq); /* release process reference */ ++ bfq_release_process_ref(bfqd, bfqq); + } + + static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync) +@@ -4987,8 +5008,7 @@ static void bfq_check_ioprio_change(struct bfq_io_cq *bic, struct bio *bio) + + bfqq = bic_to_bfqq(bic, false); + if (bfqq) { +- /* release process reference on this queue */ +- bfq_put_queue(bfqq); ++ bfq_release_process_ref(bfqd, bfqq); + bfqq = bfq_get_queue(bfqd, bio, BLK_RW_ASYNC, bic); + bic_set_bfqq(bic, bfqq, false); + } +@@ -5948,7 +5968,7 @@ bfq_split_bfqq(struct bfq_io_cq *bic, struct bfq_queue *bfqq) + + bfq_put_cooperator(bfqq); + +- bfq_put_queue(bfqq); ++ bfq_release_process_ref(bfqq->bfqd, bfqq); + return NULL; + } + +diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c +index a245597a3902..c2c82e6391b4 100644 +--- a/drivers/net/usb/cdc_ncm.c ++++ b/drivers/net/usb/cdc_ncm.c +@@ -579,7 +579,7 @@ static void cdc_ncm_set_dgram_size(struct usbnet *dev, int new_size) + err = usbnet_read_cmd(dev, USB_CDC_GET_MAX_DATAGRAM_SIZE, + USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE, + 0, iface_no, &max_datagram_size, sizeof(max_datagram_size)); +- if (err < sizeof(max_datagram_size)) { ++ if (err != sizeof(max_datagram_size)) { + dev_dbg(&dev->intf->dev, "GET_MAX_DATAGRAM_SIZE failed\n"); + goto out; + } +diff --git a/drivers/video/fbdev/core/fbmon.c b/drivers/video/fbdev/core/fbmon.c +index 3558a70a6664..8e2e19f3bf44 100644 +--- a/drivers/video/fbdev/core/fbmon.c ++++ b/drivers/video/fbdev/core/fbmon.c +@@ -999,98 +999,6 @@ void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs) + DPRINTK("========================================\n"); + } + +-/** +- * fb_edid_add_monspecs() - add monitor video modes from E-EDID data +- * @edid: 128 byte array with an E-EDID block +- * @spacs: monitor specs to be extended +- */ +-void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) +-{ +- unsigned char *block; +- struct fb_videomode *m; +- int num = 0, i; +- u8 svd[64], edt[(128 - 4) / DETAILED_TIMING_DESCRIPTION_SIZE]; +- u8 pos = 4, svd_n = 0; +- +- if (!edid) +- return; +- +- if (!edid_checksum(edid)) +- return; +- +- if (edid[0] != 0x2 || +- edid[2] < 4 || edid[2] > 128 - DETAILED_TIMING_DESCRIPTION_SIZE) +- return; +- +- DPRINTK(" Short Video Descriptors\n"); +- +- while (pos < edid[2]) { +- u8 len = edid[pos] & 0x1f, type = (edid[pos] >> 5) & 7; +- pr_debug("Data block %u of %u bytes\n", type, len); +- if (type == 2) { +- for (i = pos; i < pos + len; i++) { +- u8 idx = edid[pos + i] & 0x7f; +- svd[svd_n++] = idx; +- pr_debug("N%sative mode #%d\n", +- edid[pos + i] & 0x80 ? "" : "on-n", idx); +- } +- } else if (type == 3 && len >= 3) { +- /* Check Vendor Specific Data Block. For HDMI, +- it is always 00-0C-03 for HDMI Licensing, LLC. */ +- if (edid[pos + 1] == 3 && edid[pos + 2] == 0xc && +- edid[pos + 3] == 0) +- specs->misc |= FB_MISC_HDMI; +- } +- pos += len + 1; +- } +- +- block = edid + edid[2]; +- +- DPRINTK(" Extended Detailed Timings\n"); +- +- for (i = 0; i < (128 - edid[2]) / DETAILED_TIMING_DESCRIPTION_SIZE; +- i++, block += DETAILED_TIMING_DESCRIPTION_SIZE) +- if (PIXEL_CLOCK != 0) +- edt[num++] = block - edid; +- +- /* Yikes, EDID data is totally useless */ +- if (!(num + svd_n)) +- return; +- +- m = kcalloc(specs->modedb_len + num + svd_n, +- sizeof(struct fb_videomode), +- GFP_KERNEL); +- +- if (!m) +- return; +- +- memcpy(m, specs->modedb, specs->modedb_len * sizeof(struct fb_videomode)); +- +- for (i = specs->modedb_len; i < specs->modedb_len + num; i++) { +- get_detailed_timing(edid + edt[i - specs->modedb_len], &m[i]); +- if (i == specs->modedb_len) +- m[i].flag |= FB_MODE_IS_FIRST; +- pr_debug("Adding %ux%u@%u\n", m[i].xres, m[i].yres, m[i].refresh); +- } +- +- for (i = specs->modedb_len + num; i < specs->modedb_len + num + svd_n; i++) { +- int idx = svd[i - specs->modedb_len - num]; +- if (!idx || idx >= ARRAY_SIZE(cea_modes)) { +- pr_warn("Reserved SVD code %d\n", idx); +- } else if (!cea_modes[idx].xres) { +- pr_warn("Unimplemented SVD code %d\n", idx); +- } else { +- memcpy(&m[i], cea_modes + idx, sizeof(m[i])); +- pr_debug("Adding SVD #%d: %ux%u@%u\n", idx, +- m[i].xres, m[i].yres, m[i].refresh); +- } +- } +- +- kfree(specs->modedb); +- specs->modedb = m; +- specs->modedb_len = specs->modedb_len + num + svd_n; +-} +- + /* + * VESA Generalized Timing Formula (GTF) + */ +@@ -1500,9 +1408,6 @@ int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var) + void fb_edid_to_monspecs(unsigned char *edid, struct fb_monspecs *specs) + { + } +-void fb_edid_add_monspecs(unsigned char *edid, struct fb_monspecs *specs) +-{ +-} + void fb_destroy_modedb(struct fb_videomode *modedb) + { + } +@@ -1610,7 +1515,6 @@ EXPORT_SYMBOL(fb_firmware_edid); + + EXPORT_SYMBOL(fb_parse_edid); + EXPORT_SYMBOL(fb_edid_to_monspecs); +-EXPORT_SYMBOL(fb_edid_add_monspecs); + EXPORT_SYMBOL(fb_get_mode); + EXPORT_SYMBOL(fb_validate_mode); + EXPORT_SYMBOL(fb_destroy_modedb); +diff --git a/drivers/video/fbdev/core/modedb.c b/drivers/video/fbdev/core/modedb.c +index ac049871704d..6473e0dfe146 100644 +--- a/drivers/video/fbdev/core/modedb.c ++++ b/drivers/video/fbdev/core/modedb.c +@@ -289,63 +289,6 @@ static const struct fb_videomode modedb[] = { + }; + + #ifdef CONFIG_FB_MODE_HELPERS +-const struct fb_videomode cea_modes[65] = { +- /* #1: 640x480p@59.94/60Hz */ +- [1] = { +- NULL, 60, 640, 480, 39722, 48, 16, 33, 10, 96, 2, 0, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #3: 720x480p@59.94/60Hz */ +- [3] = { +- NULL, 60, 720, 480, 37037, 60, 16, 30, 9, 62, 6, 0, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #5: 1920x1080i@59.94/60Hz */ +- [5] = { +- NULL, 60, 1920, 1080, 13763, 148, 88, 15, 2, 44, 5, +- FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, +- FB_VMODE_INTERLACED, 0, +- }, +- /* #7: 720(1440)x480iH@59.94/60Hz */ +- [7] = { +- NULL, 60, 1440, 480, 18554/*37108*/, 114, 38, 15, 4, 124, 3, 0, +- FB_VMODE_INTERLACED, 0, +- }, +- /* #9: 720(1440)x240pH@59.94/60Hz */ +- [9] = { +- NULL, 60, 1440, 240, 18554, 114, 38, 16, 4, 124, 3, 0, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #18: 720x576pH@50Hz */ +- [18] = { +- NULL, 50, 720, 576, 37037, 68, 12, 39, 5, 64, 5, 0, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #19: 1280x720p@50Hz */ +- [19] = { +- NULL, 50, 1280, 720, 13468, 220, 440, 20, 5, 40, 5, +- FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #20: 1920x1080i@50Hz */ +- [20] = { +- NULL, 50, 1920, 1080, 13480, 148, 528, 15, 5, 528, 5, +- FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, +- FB_VMODE_INTERLACED, 0, +- }, +- /* #32: 1920x1080p@23.98/24Hz */ +- [32] = { +- NULL, 24, 1920, 1080, 13468, 148, 638, 36, 4, 44, 5, +- FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, +- FB_VMODE_NONINTERLACED, 0, +- }, +- /* #35: (2880)x480p4x@59.94/60Hz */ +- [35] = { +- NULL, 60, 2880, 480, 9250, 240, 64, 30, 9, 248, 6, 0, +- FB_VMODE_NONINTERLACED, 0, +- }, +-}; +- + const struct fb_videomode vesa_modes[] = { + /* 0 640x350-85 VESA */ + { NULL, 85, 640, 350, 31746, 96, 32, 60, 32, 64, 3, +diff --git a/include/linux/fb.h b/include/linux/fb.h +index 303771264644..50948e519897 100644 +--- a/include/linux/fb.h ++++ b/include/linux/fb.h +@@ -721,8 +721,6 @@ extern int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var); + extern const unsigned char *fb_firmware_edid(struct device *device); + extern void fb_edid_to_monspecs(unsigned char *edid, + struct fb_monspecs *specs); +-extern void fb_edid_add_monspecs(unsigned char *edid, +- struct fb_monspecs *specs); + extern void fb_destroy_modedb(struct fb_videomode *modedb); + extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb); + extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter); +@@ -796,7 +794,6 @@ struct dmt_videomode { + + extern const char *fb_mode_option; + extern const struct fb_videomode vesa_modes[]; +-extern const struct fb_videomode cea_modes[65]; + extern const struct dmt_videomode dmt_modes[]; + + struct fb_modelist { +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index 2c1a66cd47df..f363fed0db4f 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -436,67 +436,33 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, + zone_span_writeunlock(zone); + } + +-static void shrink_pgdat_span(struct pglist_data *pgdat, +- unsigned long start_pfn, unsigned long end_pfn) ++static void update_pgdat_span(struct pglist_data *pgdat) + { +- unsigned long pgdat_start_pfn = pgdat->node_start_pfn; +- unsigned long p = pgdat_end_pfn(pgdat); /* pgdat_end_pfn namespace clash */ +- unsigned long pgdat_end_pfn = p; +- unsigned long pfn; +- int nid = pgdat->node_id; +- +- if (pgdat_start_pfn == start_pfn) { +- /* +- * If the section is smallest section in the pgdat, it need +- * shrink pgdat->node_start_pfn and pgdat->node_spanned_pages. +- * In this case, we find second smallest valid mem_section +- * for shrinking zone. +- */ +- pfn = find_smallest_section_pfn(nid, NULL, end_pfn, +- pgdat_end_pfn); +- if (pfn) { +- pgdat->node_start_pfn = pfn; +- pgdat->node_spanned_pages = pgdat_end_pfn - pfn; +- } +- } else if (pgdat_end_pfn == end_pfn) { +- /* +- * If the section is biggest section in the pgdat, it need +- * shrink pgdat->node_spanned_pages. +- * In this case, we find second biggest valid mem_section for +- * shrinking zone. +- */ +- pfn = find_biggest_section_pfn(nid, NULL, pgdat_start_pfn, +- start_pfn); +- if (pfn) +- pgdat->node_spanned_pages = pfn - pgdat_start_pfn + 1; +- } ++ unsigned long node_start_pfn = 0, node_end_pfn = 0; ++ struct zone *zone; + +- /* +- * If the section is not biggest or smallest mem_section in the pgdat, +- * it only creates a hole in the pgdat. So in this case, we need not +- * change the pgdat. +- * But perhaps, the pgdat has only hole data. Thus it check the pgdat +- * has only hole or not. +- */ +- pfn = pgdat_start_pfn; +- for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUBSECTION) { +- if (unlikely(!pfn_valid(pfn))) +- continue; ++ for (zone = pgdat->node_zones; ++ zone < pgdat->node_zones + MAX_NR_ZONES; zone++) { ++ unsigned long zone_end_pfn = zone->zone_start_pfn + ++ zone->spanned_pages; + +- if (pfn_to_nid(pfn) != nid) ++ /* No need to lock the zones, they can't change. */ ++ if (!zone->spanned_pages) + continue; +- +- /* Skip range to be removed */ +- if (pfn >= start_pfn && pfn < end_pfn) ++ if (!node_end_pfn) { ++ node_start_pfn = zone->zone_start_pfn; ++ node_end_pfn = zone_end_pfn; + continue; ++ } + +- /* If we find valid section, we have nothing to do */ +- return; ++ if (zone_end_pfn > node_end_pfn) ++ node_end_pfn = zone_end_pfn; ++ if (zone->zone_start_pfn < node_start_pfn) ++ node_start_pfn = zone->zone_start_pfn; + } + +- /* The pgdat has no valid section */ +- pgdat->node_start_pfn = 0; +- pgdat->node_spanned_pages = 0; ++ pgdat->node_start_pfn = node_start_pfn; ++ pgdat->node_spanned_pages = node_end_pfn - node_start_pfn; + } + + static void __remove_zone(struct zone *zone, unsigned long start_pfn, +@@ -507,7 +473,7 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn, + + pgdat_resize_lock(zone->zone_pgdat, &flags); + shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); +- shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages); ++ update_pgdat_span(pgdat); + pgdat_resize_unlock(zone->zone_pgdat, &flags); + } +