Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5394a3d2 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge changes If1c86979,I96faf1e5,Id83afbd4,I0ca6c44c,I5d8ce65e,I39fa4657,I359f8def into msm-next

* changes:
  ARM: dts: msm: Add rcu_nocbs kernel parameter to chosen node
  defconfig: sdm855: Use RCU_NOCB for RCU subsystem
  firmware_class: Avoid pending list corruption
  firmware: Initialize firmware_buf list when we create a new firmware buf
  firmware: Reword error messages when kernel is unable to find firmware
  firmware: Avoid caching firmware when FW_OPT_NOCACHE is set
  Revert "firmware_class: Add an additional path to fw_path list"
parents e45ea4d9 1d486138
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@
	};

	chosen {
		bootargs = "rcupdate.rcu_expedited=1";
		bootargs = "rcupdate.rcu_expedited=1 rcu_nocbs=0-7";
	};

	soc: soc { };
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_RCU_EXPERT=y
CONFIG_RCU_FAST_NO_HZ=y
CONFIG_RCU_NOCB_CPU=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
+1 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ CONFIG_TASKSTATS=y
CONFIG_TASK_XACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_RCU_EXPERT=y
CONFIG_RCU_NOCB_CPU=y
CONFIG_IKCONFIG=y
CONFIG_IKCONFIG_PROC=y
CONFIG_LOG_CPU_MAX_BUF_SHIFT=17
+24 −16
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ static struct firmware_buf *__allocate_fw_buf(const char *fw_name,
	buf->data = dbuf;
	buf->allocated_size = size;
	fw_state_init(&buf->fw_st);
	INIT_LIST_HEAD(&buf->list);
#ifdef CONFIG_FW_LOADER_USER_HELPER
	INIT_LIST_HEAD(&buf->pending_list);
#endif
@@ -334,11 +335,12 @@ static struct firmware_buf *__fw_lookup_buf(const char *fw_name)
static int fw_lookup_and_allocate_buf(const char *fw_name,
				      struct firmware_cache *fwc,
				      struct firmware_buf **buf, void *dbuf,
				      size_t size)
				      size_t size, unsigned int opt_flags)
{
	struct firmware_buf *tmp;

	spin_lock(&fwc->lock);
	if (!(opt_flags & FW_OPT_NOCACHE)) {
		tmp = __fw_lookup_buf(fw_name);
		if (tmp) {
			kref_get(&tmp->ref);
@@ -346,8 +348,9 @@ static int fw_lookup_and_allocate_buf(const char *fw_name,
			*buf = tmp;
			return 1;
		}
	}
	tmp = __allocate_fw_buf(fw_name, fwc, dbuf, size);
	if (tmp)
	if (tmp && !(opt_flags & FW_OPT_NOCACHE))
		list_add(&tmp->list, &fwc->head);
	spin_unlock(&fwc->lock);

@@ -367,6 +370,9 @@ static void __fw_free_buf(struct kref *ref)
		 (unsigned int)buf->size);

	list_del(&buf->list);
#ifdef CONFIG_FW_LOADER_USER_HELPER
	list_del(&buf->pending_list);
#endif
	spin_unlock(&fwc->lock);

#ifdef CONFIG_FW_LOADER_USER_HELPER
@@ -399,8 +405,7 @@ static const char * const fw_path[] = {
	"/lib/firmware/updates/" UTS_RELEASE,
	"/lib/firmware/updates",
	"/lib/firmware/" UTS_RELEASE,
	"/lib/firmware",
	"/firmware/image"
	"/lib/firmware"
};

/*
@@ -1158,7 +1163,8 @@ static inline void kill_pending_fw_fallback_reqs(bool only_kill_custom) { }
 */
static int
_request_firmware_prepare(struct firmware **firmware_p, const char *name,
			  struct device *device, void *dbuf, size_t size)
			  struct device *device, void *dbuf, size_t size,
			  unsigned int opt_flags)
{
	struct firmware *firmware;
	struct firmware_buf *buf;
@@ -1176,7 +1182,8 @@ _request_firmware_prepare(struct firmware **firmware_p, const char *name,
		return 0; /* assigned */
	}

	ret = fw_lookup_and_allocate_buf(name, &fw_cache, &buf, dbuf, size);
	ret = fw_lookup_and_allocate_buf(name, &fw_cache, &buf, dbuf, size,
					opt_flags);

	/*
	 * bind with 'buf' now to avoid warning in failure path
@@ -1236,7 +1243,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
		goto out;
	}

	ret = _request_firmware_prepare(&fw, name, device, buf, size);
	ret = _request_firmware_prepare(&fw, name, device, buf, size,
					opt_flags);
	if (ret <= 0) /* error or already assigned */
		goto out;

@@ -1249,11 +1257,11 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
	ret = fw_get_filesystem_firmware(device, fw->priv);
	if (ret) {
		if (!(opt_flags & FW_OPT_NO_WARN))
			dev_warn(device,
				 "Direct firmware load for %s failed with error %d\n",
			dev_dbg(device,
				 "Firmware %s was not found in kernel paths. rc:%d\n",
				 name, ret);
		if (opt_flags & FW_OPT_USERHELPER) {
			dev_warn(device, "Falling back to user helper\n");
			dev_dbg(device, "Falling back to user helper\n");
			ret = fw_load_from_user_helper(fw, name, device,
						       opt_flags);
		}