From: Sasha Levin Date: Mon, 27 Apr 2020 13:11:44 +0000 (-0400) Subject: Fixes for 5.6 X-Git-Tag: v4.19.119~34 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b5c5639f9aa596acf4a3380b1044e0d3399c7a54;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.6 Signed-off-by: Sasha Levin --- diff --git a/queue-5.6/alsa-hda-remove-asus-rog-zenith-from-the-blacklist.patch b/queue-5.6/alsa-hda-remove-asus-rog-zenith-from-the-blacklist.patch new file mode 100644 index 00000000000..f04b9bd0ee4 --- /dev/null +++ b/queue-5.6/alsa-hda-remove-asus-rog-zenith-from-the-blacklist.patch @@ -0,0 +1,48 @@ +From 785245bd32e4a9eb98bbb1f19ff2a72ab14ee538 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 19 Apr 2020 09:19:26 +0200 +Subject: ALSA: hda: Remove ASUS ROG Zenith from the blacklist + +From: Takashi Iwai + +[ Upstream commit a8cf44f085ac12c0b5b8750ebb3b436c7f455419 ] + +The commit 3c6fd1f07ed0 ("ALSA: hda: Add driver blacklist") added a +new blacklist for the devices that are known to have empty codecs, and +one of the entries was ASUS ROG Zenith II (PCI SSID 1043:874f). +However, it turned out that the very same PCI SSID is used for the +previous model that does have the valid HD-audio codecs and the change +broke the sound on it. + +This patch reverts the corresponding entry as a temporary solution. +Although Zenith II and co will see get the empty HD-audio bus again, +it'd be merely resource wastes and won't affect the functionality, +so it's no end of the world. We'll need to address this later, +e.g. by either switching to DMI string matching or using PCI ID & +SSID pairs. + +Fixes: 3c6fd1f07ed0 ("ALSA: hda: Add driver blacklist") +Reported-by: Johnathan Smithinovic +Cc: +Link: https://lore.kernel.org/r/20200419071926.22683-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/pci/hda/hda_intel.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index f41d8b7864c1e..af21e9583c0d3 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -2076,7 +2076,6 @@ static void pcm_mmap_prepare(struct snd_pcm_substream *substream, + * should be ignored from the beginning. + */ + static const struct snd_pci_quirk driver_blacklist[] = { +- SND_PCI_QUIRK(0x1043, 0x874f, "ASUS ROG Zenith II / Strix", 0), + SND_PCI_QUIRK(0x1462, 0xcb59, "MSI TRX40 Creator", 0), + SND_PCI_QUIRK(0x1462, 0xcb60, "MSI TRX40", 0), + {} +-- +2.20.1 + diff --git a/queue-5.6/alsa-usb-audio-add-connector-notifier-delegation.patch b/queue-5.6/alsa-usb-audio-add-connector-notifier-delegation.patch new file mode 100644 index 00000000000..24870b4ac7c --- /dev/null +++ b/queue-5.6/alsa-usb-audio-add-connector-notifier-delegation.patch @@ -0,0 +1,170 @@ +From 6919d2f508db45d14d398855dd2f6394694a7705 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 22 Apr 2020 13:33:20 +0200 +Subject: ALSA: usb-audio: Add connector notifier delegation + +From: Takashi Iwai + +[ Upstream commit fef66ae73a611e84c8b4b74ff6f805ec5f113477 ] + +It turned out that ALC1220-VB USB-audio device gives the interrupt +event to some PCM terminals while those don't allow the connector +state request but only the actual I/O terminals return the request. +The recent commit 7dc3c5a0172e ("ALSA: usb-audio: Don't create jack +controls for PCM terminals") excluded those phantom terminals, so +those events are ignored, too. + +My first thought was that this could be easily deduced from the +associated terminals, but some of them have even no associate terminal +ID, hence it's not too trivial to figure out. + +Since the number of such terminals are small and limited, this patch +implements another quirk table for the simple mapping of the +connectors. It's not really scalable, but let's hope that there will +be not many such funky devices in future. + +Fixes: 7dc3c5a0172e ("ALSA: usb-audio: Don't create jack controls for PCM terminals") +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=206873 +Link: https://lore.kernel.org/r/20200422113320.26664-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/usb/mixer.c | 25 +++++++++++++++++++++++++ + sound/usb/mixer.h | 10 ++++++++++ + sound/usb/mixer_maps.c | 13 +++++++++++++ + 3 files changed, 48 insertions(+) + +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 05f64fe0b0bbe..7a2961ad60de0 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -3096,6 +3096,7 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) + if (map->id == state.chip->usb_id) { + state.map = map->map; + state.selector_map = map->selector_map; ++ mixer->connector_map = map->connector_map; + mixer->ignore_ctl_error |= map->ignore_ctl_error; + break; + } +@@ -3177,10 +3178,32 @@ static int snd_usb_mixer_controls(struct usb_mixer_interface *mixer) + return 0; + } + ++static int delegate_notify(struct usb_mixer_interface *mixer, int unitid, ++ u8 *control, u8 *channel) ++{ ++ const struct usbmix_connector_map *map = mixer->connector_map; ++ ++ if (!map) ++ return unitid; ++ ++ for (; map->id; map++) { ++ if (map->id == unitid) { ++ if (control && map->control) ++ *control = map->control; ++ if (channel && map->channel) ++ *channel = map->channel; ++ return map->delegated_id; ++ } ++ } ++ return unitid; ++} ++ + void snd_usb_mixer_notify_id(struct usb_mixer_interface *mixer, int unitid) + { + struct usb_mixer_elem_list *list; + ++ unitid = delegate_notify(mixer, unitid, NULL, NULL); ++ + for_each_mixer_elem(list, mixer, unitid) { + struct usb_mixer_elem_info *info = + mixer_elem_list_to_info(list); +@@ -3250,6 +3273,8 @@ static void snd_usb_mixer_interrupt_v2(struct usb_mixer_interface *mixer, + return; + } + ++ unitid = delegate_notify(mixer, unitid, &control, &channel); ++ + for_each_mixer_elem(list, mixer, unitid) + count++; + +diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h +index 65d6d08c96f53..41ec9dc4139bb 100644 +--- a/sound/usb/mixer.h ++++ b/sound/usb/mixer.h +@@ -6,6 +6,13 @@ + + struct media_mixer_ctl; + ++struct usbmix_connector_map { ++ u8 id; ++ u8 delegated_id; ++ u8 control; ++ u8 channel; ++}; ++ + struct usb_mixer_interface { + struct snd_usb_audio *chip; + struct usb_host_interface *hostif; +@@ -18,6 +25,9 @@ struct usb_mixer_interface { + /* the usb audio specification version this interface complies to */ + int protocol; + ++ /* optional connector delegation map */ ++ const struct usbmix_connector_map *connector_map; ++ + /* Sound Blaster remote control stuff */ + const struct rc_config *rc_cfg; + u32 rc_code; +diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c +index fb2c4a992951b..0260c750e1569 100644 +--- a/sound/usb/mixer_maps.c ++++ b/sound/usb/mixer_maps.c +@@ -27,6 +27,7 @@ struct usbmix_ctl_map { + u32 id; + const struct usbmix_name_map *map; + const struct usbmix_selector_map *selector_map; ++ const struct usbmix_connector_map *connector_map; + int ignore_ctl_error; + }; + +@@ -387,6 +388,15 @@ static const struct usbmix_name_map trx40_mobo_map[] = { + {} + }; + ++static const struct usbmix_connector_map trx40_mobo_connector_map[] = { ++ { 10, 16 }, /* (Back) Speaker */ ++ { 11, 17 }, /* Front Headphone */ ++ { 13, 7 }, /* Line */ ++ { 14, 8 }, /* Mic */ ++ { 15, 9 }, /* Front Mic */ ++ {} ++}; ++ + /* + * Control map entries + */ +@@ -519,6 +529,7 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { + { /* Gigabyte TRX40 Aorus Pro WiFi */ + .id = USB_ID(0x0414, 0xa002), + .map = trx40_mobo_map, ++ .connector_map = trx40_mobo_connector_map, + }, + { /* ASUS ROG Zenith II */ + .id = USB_ID(0x0b05, 0x1916), +@@ -531,10 +542,12 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { + { /* MSI TRX40 Creator */ + .id = USB_ID(0x0db0, 0x0d64), + .map = trx40_mobo_map, ++ .connector_map = trx40_mobo_connector_map, + }, + { /* MSI TRX40 */ + .id = USB_ID(0x0db0, 0x543d), + .map = trx40_mobo_map, ++ .connector_map = trx40_mobo_connector_map, + }, + { 0 } /* terminator */ + }; +-- +2.20.1 + diff --git a/queue-5.6/alsa-usb-audio-add-static-mapping-table-for-alc1220-.patch b/queue-5.6/alsa-usb-audio-add-static-mapping-table-for-alc1220-.patch new file mode 100644 index 00000000000..98f64f10f24 --- /dev/null +++ b/queue-5.6/alsa-usb-audio-add-static-mapping-table-for-alc1220-.patch @@ -0,0 +1,139 @@ +From 54b2bfa1ef7a090f68114228890aed3e74c5a728 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 08:20:36 +0200 +Subject: ALSA: usb-audio: Add static mapping table for ALC1220-VB-based mobos + +From: Takashi Iwai + +[ Upstream commit a43c1c41bc5145971d06edc42a6b1e8faa0e2bc3 ] + +TRX40 mobos from MSI and others with ALC1220-VB USB-audio device need +yet more quirks for the proper control names. + +This patch provides the mapping table for those boards, correcting the +FU names for volume and mute controls as well as the terminal names +for jack controls. It also improves build_connector_control() not to +add the directional suffix blindly if the string is given from the +mapping table. + +With this patch applied, the new UCM profiles will be effective. + +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=206873 +Link: https://lore.kernel.org/r/20200420062036.28567-1-tiwai@suse.de +Signed-off-by: Takashi Iwai +Signed-off-by: Sasha Levin +--- + sound/usb/mixer.c | 12 +++++++++--- + sound/usb/mixer_maps.c | 24 +++++++++++++++++++++--- + sound/usb/quirks-table.h | 14 ++++++++++++++ + 3 files changed, 44 insertions(+), 6 deletions(-) + +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index 7e2e1fc5b9f09..05f64fe0b0bbe 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -1755,8 +1755,10 @@ static void build_connector_control(struct usb_mixer_interface *mixer, + { + struct snd_kcontrol *kctl; + struct usb_mixer_elem_info *cval; ++ const struct usbmix_name_map *map; + +- if (check_ignored_ctl(find_map(imap, term->id, 0))) ++ map = find_map(imap, term->id, 0); ++ if (check_ignored_ctl(map)) + return; + + cval = kzalloc(sizeof(*cval), GFP_KERNEL); +@@ -1788,8 +1790,12 @@ static void build_connector_control(struct usb_mixer_interface *mixer, + usb_mixer_elem_info_free(cval); + return; + } +- get_connector_control_name(mixer, term, is_input, kctl->id.name, +- sizeof(kctl->id.name)); ++ ++ if (check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name))) ++ strlcat(kctl->id.name, " Jack", sizeof(kctl->id.name)); ++ else ++ get_connector_control_name(mixer, term, is_input, kctl->id.name, ++ sizeof(kctl->id.name)); + kctl->private_free = snd_usb_mixer_elem_free; + snd_usb_mixer_add_control(&cval->head, kctl); + } +diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c +index b4e77000f441e..fb2c4a992951b 100644 +--- a/sound/usb/mixer_maps.c ++++ b/sound/usb/mixer_maps.c +@@ -369,6 +369,24 @@ static const struct usbmix_name_map asus_rog_map[] = { + {} + }; + ++/* TRX40 mobos with Realtek ALC1220-VB */ ++static const struct usbmix_name_map trx40_mobo_map[] = { ++ { 18, NULL }, /* OT, IEC958 - broken response, disabled */ ++ { 19, NULL, 12 }, /* FU, Input Gain Pad - broken response, disabled */ ++ { 16, "Speaker" }, /* OT */ ++ { 22, "Speaker Playback" }, /* FU */ ++ { 7, "Line" }, /* IT */ ++ { 19, "Line Capture" }, /* FU */ ++ { 17, "Front Headphone" }, /* OT */ ++ { 23, "Front Headphone Playback" }, /* FU */ ++ { 8, "Mic" }, /* IT */ ++ { 20, "Mic Capture" }, /* FU */ ++ { 9, "Front Mic" }, /* IT */ ++ { 21, "Front Mic Capture" }, /* FU */ ++ { 24, "IEC958 Playback" }, /* FU */ ++ {} ++}; ++ + /* + * Control map entries + */ +@@ -500,7 +518,7 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { + }, + { /* Gigabyte TRX40 Aorus Pro WiFi */ + .id = USB_ID(0x0414, 0xa002), +- .map = asus_rog_map, ++ .map = trx40_mobo_map, + }, + { /* ASUS ROG Zenith II */ + .id = USB_ID(0x0b05, 0x1916), +@@ -512,11 +530,11 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = { + }, + { /* MSI TRX40 Creator */ + .id = USB_ID(0x0db0, 0x0d64), +- .map = asus_rog_map, ++ .map = trx40_mobo_map, + }, + { /* MSI TRX40 */ + .id = USB_ID(0x0db0, 0x543d), +- .map = asus_rog_map, ++ .map = trx40_mobo_map, + }, + { 0 } /* terminator */ + }; +diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h +index dcaf9eed9a415..8c2f5c23e1b43 100644 +--- a/sound/usb/quirks-table.h ++++ b/sound/usb/quirks-table.h +@@ -3635,4 +3635,18 @@ AU0828_DEVICE(0x2040, 0x7270, "Hauppauge", "HVR-950Q"), + } + }, + ++#define ALC1220_VB_DESKTOP(vend, prod) { \ ++ USB_DEVICE(vend, prod), \ ++ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) { \ ++ .vendor_name = "Realtek", \ ++ .product_name = "ALC1220-VB-DT", \ ++ .profile_name = "Realtek-ALC1220-VB-Desktop", \ ++ .ifnum = QUIRK_NO_INTERFACE \ ++ } \ ++} ++ALC1220_VB_DESKTOP(0x0414, 0xa002), /* Gigabyte TRX40 Aorus Pro WiFi */ ++ALC1220_VB_DESKTOP(0x0db0, 0x0d64), /* MSI TRX40 Creator */ ++ALC1220_VB_DESKTOP(0x0db0, 0x543d), /* MSI TRX40 */ ++#undef ALC1220_VB_DESKTOP ++ + #undef USB_DEVICE_VENDOR_SPEC +-- +2.20.1 + diff --git a/queue-5.6/keys-avoid-false-positive-enomem-error-on-key-read.patch b/queue-5.6/keys-avoid-false-positive-enomem-error-on-key-read.patch new file mode 100644 index 00000000000..af0633bebe7 --- /dev/null +++ b/queue-5.6/keys-avoid-false-positive-enomem-error-on-key-read.patch @@ -0,0 +1,169 @@ +From 38d4636b4837c41dad34754c7b68137ca91d0a2f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 21 Mar 2020 21:11:25 -0400 +Subject: KEYS: Avoid false positive ENOMEM error on key read + +From: Waiman Long + +[ Upstream commit 4f0882491a148059a52480e753b7f07fc550e188 ] + +By allocating a kernel buffer with a user-supplied buffer length, it +is possible that a false positive ENOMEM error may be returned because +the user-supplied length is just too large even if the system do have +enough memory to hold the actual key data. + +Moreover, if the buffer length is larger than the maximum amount of +memory that can be returned by kmalloc() (2^(MAX_ORDER-1) number of +pages), a warning message will also be printed. + +To reduce this possibility, we set a threshold (PAGE_SIZE) over which we +do check the actual key length first before allocating a buffer of the +right size to hold it. The threshold is arbitrary, it is just used to +trigger a buffer length check. It does not limit the actual key length +as long as there is enough memory to satisfy the memory request. + +To further avoid large buffer allocation failure due to page +fragmentation, kvmalloc() is used to allocate the buffer so that vmapped +pages can be used when there is not a large enough contiguous set of +pages available for allocation. + +In the extremely unlikely scenario that the key keeps on being changed +and made longer (still <= buflen) in between 2 __keyctl_read_key() +calls, the __keyctl_read_key() calling loop in keyctl_read_key() may +have to be iterated a large number of times, but definitely not infinite. + +Signed-off-by: Waiman Long +Signed-off-by: David Howells +Signed-off-by: Sasha Levin +--- + security/keys/internal.h | 12 +++++++++ + security/keys/keyctl.c | 58 +++++++++++++++++++++++++++++----------- + 2 files changed, 55 insertions(+), 15 deletions(-) + +diff --git a/security/keys/internal.h b/security/keys/internal.h +index ba3e2da14ceff..6d0ca48ae9a50 100644 +--- a/security/keys/internal.h ++++ b/security/keys/internal.h +@@ -16,6 +16,8 @@ + #include + #include + #include ++#include ++#include + + struct iovec; + +@@ -349,4 +351,14 @@ static inline void key_check(const struct key *key) + + #endif + ++/* ++ * Helper function to clear and free a kvmalloc'ed memory object. ++ */ ++static inline void __kvzfree(const void *addr, size_t len) ++{ ++ if (addr) { ++ memset((void *)addr, 0, len); ++ kvfree(addr); ++ } ++} + #endif /* _INTERNAL_H */ +diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c +index 106e16f9006b4..5e01192e222a0 100644 +--- a/security/keys/keyctl.c ++++ b/security/keys/keyctl.c +@@ -339,7 +339,7 @@ long keyctl_update_key(key_serial_t id, + payload = NULL; + if (plen) { + ret = -ENOMEM; +- payload = kmalloc(plen, GFP_KERNEL); ++ payload = kvmalloc(plen, GFP_KERNEL); + if (!payload) + goto error; + +@@ -360,7 +360,7 @@ long keyctl_update_key(key_serial_t id, + + key_ref_put(key_ref); + error2: +- kzfree(payload); ++ __kvzfree(payload, plen); + error: + return ret; + } +@@ -827,7 +827,8 @@ long keyctl_read_key(key_serial_t keyid, char __user *buffer, size_t buflen) + struct key *key; + key_ref_t key_ref; + long ret; +- char *key_data; ++ char *key_data = NULL; ++ size_t key_data_len; + + /* find the key first */ + key_ref = lookup_user_key(keyid, 0, 0); +@@ -878,24 +879,51 @@ can_read_key: + * Allocating a temporary buffer to hold the keys before + * transferring them to user buffer to avoid potential + * deadlock involving page fault and mmap_sem. ++ * ++ * key_data_len = (buflen <= PAGE_SIZE) ++ * ? buflen : actual length of key data ++ * ++ * This prevents allocating arbitrary large buffer which can ++ * be much larger than the actual key length. In the latter case, ++ * at least 2 passes of this loop is required. + */ +- key_data = kmalloc(buflen, GFP_KERNEL); ++ key_data_len = (buflen <= PAGE_SIZE) ? buflen : 0; ++ for (;;) { ++ if (key_data_len) { ++ key_data = kvmalloc(key_data_len, GFP_KERNEL); ++ if (!key_data) { ++ ret = -ENOMEM; ++ goto key_put_out; ++ } ++ } + +- if (!key_data) { +- ret = -ENOMEM; +- goto key_put_out; +- } +- ret = __keyctl_read_key(key, key_data, buflen); ++ ret = __keyctl_read_key(key, key_data, key_data_len); ++ ++ /* ++ * Read methods will just return the required length without ++ * any copying if the provided length isn't large enough. ++ */ ++ if (ret <= 0 || ret > buflen) ++ break; ++ ++ /* ++ * The key may change (unlikely) in between 2 consecutive ++ * __keyctl_read_key() calls. In this case, we reallocate ++ * a larger buffer and redo the key read when ++ * key_data_len < ret <= buflen. ++ */ ++ if (ret > key_data_len) { ++ if (unlikely(key_data)) ++ __kvzfree(key_data, key_data_len); ++ key_data_len = ret; ++ continue; /* Allocate buffer */ ++ } + +- /* +- * Read methods will just return the required length without +- * any copying if the provided length isn't large enough. +- */ +- if (ret > 0 && ret <= buflen) { + if (copy_to_user(buffer, key_data, ret)) + ret = -EFAULT; ++ break; + } +- kzfree(key_data); ++ __kvzfree(key_data, key_data_len); + + key_put_out: + key_put(key); +-- +2.20.1 + diff --git a/queue-5.6/libbpf-only-check-mode-flags-in-get_xdp_id.patch b/queue-5.6/libbpf-only-check-mode-flags-in-get_xdp_id.patch new file mode 100644 index 00000000000..19f4a42c5fb --- /dev/null +++ b/queue-5.6/libbpf-only-check-mode-flags-in-get_xdp_id.patch @@ -0,0 +1,39 @@ +From 3b840f8320c475a3403a7fd84423313dc269bd65 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 20 Apr 2020 10:18:43 -0600 +Subject: libbpf: Only check mode flags in get_xdp_id + +From: David Ahern + +[ Upstream commit 257d7d4f0e69f5e8e3d38351bdcab896719dba04 ] + +The commit in the Fixes tag changed get_xdp_id to only return prog_id +if flags is 0, but there are other XDP flags than the modes - e.g., +XDP_FLAGS_UPDATE_IF_NOEXIST. Since the intention was only to look at +MODE flags, clear other ones before checking if flags is 0. + +Fixes: f07cbad29741 ("libbpf: Fix bpf_get_link_xdp_id flags handling") +Signed-off-by: David Ahern +Signed-off-by: Alexei Starovoitov +Acked-by: Andrey Ignatov +Signed-off-by: Sasha Levin +--- + tools/lib/bpf/netlink.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/tools/lib/bpf/netlink.c b/tools/lib/bpf/netlink.c +index 6d47345a310bd..c364e4be5e6eb 100644 +--- a/tools/lib/bpf/netlink.c ++++ b/tools/lib/bpf/netlink.c +@@ -289,6 +289,8 @@ int bpf_get_link_xdp_info(int ifindex, struct xdp_link_info *info, + + static __u32 get_xdp_id(struct xdp_link_info *info, __u32 flags) + { ++ flags &= XDP_FLAGS_MODES; ++ + if (info->attach_mode != XDP_ATTACHED_MULTI && !flags) + return info->prog_id; + if (flags & XDP_FLAGS_DRV_MODE) +-- +2.20.1 + diff --git a/queue-5.6/mac80211-populate-debugfs-only-after-cfg80211-init.patch b/queue-5.6/mac80211-populate-debugfs-only-after-cfg80211-init.patch new file mode 100644 index 00000000000..91cbc39cae8 --- /dev/null +++ b/queue-5.6/mac80211-populate-debugfs-only-after-cfg80211-init.patch @@ -0,0 +1,276 @@ +From 04c89094abf6398fb304dab147dce1d2ea2bc60a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 23 Apr 2020 11:13:49 +0200 +Subject: mac80211: populate debugfs only after cfg80211 init + +From: Johannes Berg + +[ Upstream commit 6cb5f3ea4654faf8c28b901266e960b1a4787b26 ] + +When fixing the initialization race, we neglected to account for +the fact that debugfs is initialized in wiphy_register(), and +some debugfs things went missing (or rather were rerooted to the +global debugfs root). + +Fix this by adding debugfs entries only after wiphy_register(). +This requires some changes in the rate control code since it +currently adds debugfs at alloc time, which can no longer be +done after the reordering. + +Reported-by: Jouni Malinen +Reported-by: kernel test robot +Reported-by: Hauke Mehrtens +Reported-by: Felix Fietkau +Cc: stable@vger.kernel.org +Fixes: 52e04b4ce5d0 ("mac80211: fix race in ieee80211_register_hw()") +Signed-off-by: Johannes Berg +Acked-by: Sumit Garg +Link: https://lore.kernel.org/r/20200423111344.0e00d3346f12.Iadc76a03a55093d94391fc672e996a458702875d@changeid +Signed-off-by: Johannes Berg +Signed-off-by: Sasha Levin +--- + drivers/net/wireless/intel/iwlegacy/3945-rs.c | 2 +- + drivers/net/wireless/intel/iwlegacy/4965-rs.c | 2 +- + drivers/net/wireless/intel/iwlwifi/dvm/rs.c | 2 +- + drivers/net/wireless/intel/iwlwifi/mvm/rs.c | 2 +- + drivers/net/wireless/realtek/rtlwifi/rc.c | 2 +- + include/net/mac80211.h | 4 +++- + net/mac80211/main.c | 5 ++-- + net/mac80211/rate.c | 15 ++++-------- + net/mac80211/rate.h | 23 +++++++++++++++++++ + net/mac80211/rc80211_minstrel_ht.c | 19 ++++++++++----- + 10 files changed, 51 insertions(+), 25 deletions(-) + +diff --git a/drivers/net/wireless/intel/iwlegacy/3945-rs.c b/drivers/net/wireless/intel/iwlegacy/3945-rs.c +index 6209f85a71ddb..0af9e997c9f67 100644 +--- a/drivers/net/wireless/intel/iwlegacy/3945-rs.c ++++ b/drivers/net/wireless/intel/iwlegacy/3945-rs.c +@@ -374,7 +374,7 @@ out: + } + + static void * +-il3945_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++il3945_rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +diff --git a/drivers/net/wireless/intel/iwlegacy/4965-rs.c b/drivers/net/wireless/intel/iwlegacy/4965-rs.c +index 7c6e2c8634974..0a02d8aca3206 100644 +--- a/drivers/net/wireless/intel/iwlegacy/4965-rs.c ++++ b/drivers/net/wireless/intel/iwlegacy/4965-rs.c +@@ -2474,7 +2474,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta, + } + + static void * +-il4965_rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++il4965_rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c +index 226165db7dfd5..dac809df7f1dd 100644 +--- a/drivers/net/wireless/intel/iwlwifi/dvm/rs.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/rs.c +@@ -3019,7 +3019,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv, + cpu_to_le16(priv->lib->bt_params->agg_time_limit); + } + +-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +index 1a990ed9c3ca6..08bef33a1d7e2 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/rs.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/rs.c +@@ -3665,7 +3665,7 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm, + cpu_to_le16(iwl_mvm_coex_agg_time_limit(mvm, sta)); + } + +-static void *rs_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rs_alloc(struct ieee80211_hw *hw) + { + return hw->priv; + } +diff --git a/drivers/net/wireless/realtek/rtlwifi/rc.c b/drivers/net/wireless/realtek/rtlwifi/rc.c +index 0c7d74902d33b..4b5ea0ec91093 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/rc.c ++++ b/drivers/net/wireless/realtek/rtlwifi/rc.c +@@ -261,7 +261,7 @@ static void rtl_rate_update(void *ppriv, + { + } + +-static void *rtl_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++static void *rtl_rate_alloc(struct ieee80211_hw *hw) + { + struct rtl_priv *rtlpriv = rtl_priv(hw); + return rtlpriv; +diff --git a/include/net/mac80211.h b/include/net/mac80211.h +index 77e6b5a83b065..eec6d0a6ae610 100644 +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -5969,7 +5969,9 @@ enum rate_control_capabilities { + struct rate_control_ops { + unsigned long capa; + const char *name; +- void *(*alloc)(struct ieee80211_hw *hw, struct dentry *debugfsdir); ++ void *(*alloc)(struct ieee80211_hw *hw); ++ void (*add_debugfs)(struct ieee80211_hw *hw, void *priv, ++ struct dentry *debugfsdir); + void (*free)(void *priv); + + void *(*alloc_sta)(void *priv, struct ieee80211_sta *sta, gfp_t gfp); +diff --git a/net/mac80211/main.c b/net/mac80211/main.c +index a14aef11ffb82..4945d6e6d1334 100644 +--- a/net/mac80211/main.c ++++ b/net/mac80211/main.c +@@ -1161,8 +1161,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) + local->tx_headroom = max_t(unsigned int , local->hw.extra_tx_headroom, + IEEE80211_TX_STATUS_HEADROOM); + +- debugfs_hw_add(local); +- + /* + * if the driver doesn't specify a max listen interval we + * use 5 which should be a safe default +@@ -1254,6 +1252,9 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) + if (result < 0) + goto fail_wiphy_register; + ++ debugfs_hw_add(local); ++ rate_control_add_debugfs(local); ++ + rtnl_lock(); + + /* add one default STA interface if supported */ +diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c +index a1e9fc7878aa3..b051f125d3af2 100644 +--- a/net/mac80211/rate.c ++++ b/net/mac80211/rate.c +@@ -214,17 +214,16 @@ static ssize_t rcname_read(struct file *file, char __user *userbuf, + ref->ops->name, len); + } + +-static const struct file_operations rcname_ops = { ++const struct file_operations rcname_ops = { + .read = rcname_read, + .open = simple_open, + .llseek = default_llseek, + }; + #endif + +-static struct rate_control_ref *rate_control_alloc(const char *name, +- struct ieee80211_local *local) ++static struct rate_control_ref * ++rate_control_alloc(const char *name, struct ieee80211_local *local) + { +- struct dentry *debugfsdir = NULL; + struct rate_control_ref *ref; + + ref = kmalloc(sizeof(struct rate_control_ref), GFP_KERNEL); +@@ -234,13 +233,7 @@ static struct rate_control_ref *rate_control_alloc(const char *name, + if (!ref->ops) + goto free; + +-#ifdef CONFIG_MAC80211_DEBUGFS +- debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); +- local->debugfs.rcdir = debugfsdir; +- debugfs_create_file("name", 0400, debugfsdir, ref, &rcname_ops); +-#endif +- +- ref->priv = ref->ops->alloc(&local->hw, debugfsdir); ++ ref->priv = ref->ops->alloc(&local->hw); + if (!ref->priv) + goto free; + return ref; +diff --git a/net/mac80211/rate.h b/net/mac80211/rate.h +index 5397c6dad0561..79b44d3db171e 100644 +--- a/net/mac80211/rate.h ++++ b/net/mac80211/rate.h +@@ -60,6 +60,29 @@ static inline void rate_control_add_sta_debugfs(struct sta_info *sta) + #endif + } + ++extern const struct file_operations rcname_ops; ++ ++static inline void rate_control_add_debugfs(struct ieee80211_local *local) ++{ ++#ifdef CONFIG_MAC80211_DEBUGFS ++ struct dentry *debugfsdir; ++ ++ if (!local->rate_ctrl) ++ return; ++ ++ if (!local->rate_ctrl->ops->add_debugfs) ++ return; ++ ++ debugfsdir = debugfs_create_dir("rc", local->hw.wiphy->debugfsdir); ++ local->debugfs.rcdir = debugfsdir; ++ debugfs_create_file("name", 0400, debugfsdir, ++ local->rate_ctrl, &rcname_ops); ++ ++ local->rate_ctrl->ops->add_debugfs(&local->hw, local->rate_ctrl->priv, ++ debugfsdir); ++#endif ++} ++ + void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata); + + /* Get a reference to the rate control algorithm. If `name' is NULL, get the +diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c +index 694a31978a044..5dc3e5bc4e642 100644 +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -1635,7 +1635,7 @@ minstrel_ht_init_cck_rates(struct minstrel_priv *mp) + } + + static void * +-minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) ++minstrel_ht_alloc(struct ieee80211_hw *hw) + { + struct minstrel_priv *mp; + +@@ -1673,7 +1673,17 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) + mp->update_interval = HZ / 10; + mp->new_avg = true; + ++ minstrel_ht_init_cck_rates(mp); ++ ++ return mp; ++} ++ + #ifdef CONFIG_MAC80211_DEBUGFS ++static void minstrel_ht_add_debugfs(struct ieee80211_hw *hw, void *priv, ++ struct dentry *debugfsdir) ++{ ++ struct minstrel_priv *mp = priv; ++ + mp->fixed_rate_idx = (u32) -1; + debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir, + &mp->fixed_rate_idx); +@@ -1681,12 +1691,8 @@ minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir) + &mp->sample_switch); + debugfs_create_bool("new_avg", S_IRUGO | S_IWUSR, debugfsdir, + &mp->new_avg); +-#endif +- +- minstrel_ht_init_cck_rates(mp); +- +- return mp; + } ++#endif + + static void + minstrel_ht_free(void *priv) +@@ -1725,6 +1731,7 @@ static const struct rate_control_ops mac80211_minstrel_ht = { + .alloc = minstrel_ht_alloc, + .free = minstrel_ht_free, + #ifdef CONFIG_MAC80211_DEBUGFS ++ .add_debugfs = minstrel_ht_add_debugfs, + .add_sta_debugfs = minstrel_ht_add_sta_debugfs, + #endif + .get_expected_throughput = minstrel_ht_get_expected_throughput, +-- +2.20.1 + diff --git a/queue-5.6/series b/queue-5.6/series index 35c9552e072..583ce6a9529 100644 --- a/queue-5.6/series +++ b/queue-5.6/series @@ -72,3 +72,9 @@ geneve-use-the-correct-nlattr-array-in-nl_set_err_msg_attr.patch xfrm-always-set-xfrm_transformed-in-xfrm-4-6-_output_finish.patch vrf-check-skb-for-xfrm_transformed-flag.patch net-ethernet-ixp4xx-add-error-handling-in-ixp4xx_eth_probe.patch +keys-avoid-false-positive-enomem-error-on-key-read.patch +alsa-hda-remove-asus-rog-zenith-from-the-blacklist.patch +alsa-usb-audio-add-static-mapping-table-for-alc1220-.patch +alsa-usb-audio-add-connector-notifier-delegation.patch +mac80211-populate-debugfs-only-after-cfg80211-init.patch +libbpf-only-check-mode-flags-in-get_xdp_id.patch