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

Commit dafb5587 authored by Faisal Latif's avatar Faisal Latif Committed by Doug Ledford
Browse files

iwpm: crash fix for large connections test



During large connection test, there is a crash at wake_up() in the callback as waitq is
not yet initialized. Callback can happen before iwpm_wait_complete_req() is called to
initialize waitq.
To resolve, using signaling semaphore instead of waitq.

Signed-off-by: default avatarMustafa Ismail <mustafa.ismail@intel.com>
Reviewed-by: default avatarTatyana E Nikolova <tatyana.e.nikolova@intel.com>
Signed-off-by: default avatarFaisal Latif <faisal.latif@intel.com>
Reviewed-by: default avatarSteve Wise <swise@opengridcomputing.com>
Tested-by: default avatarSteve Wise <swise@opengridcomputing.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent c1340e8a
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -394,7 +394,7 @@ int iwpm_register_pid_cb(struct sk_buff *skb, struct netlink_callback *cb)
	/* always for found nlmsg_request */
	kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request);
	barrier();
	wake_up(&nlmsg_request->waitq);
	up(&nlmsg_request->sem);
	return 0;
}
EXPORT_SYMBOL(iwpm_register_pid_cb);
@@ -463,7 +463,7 @@ int iwpm_add_mapping_cb(struct sk_buff *skb, struct netlink_callback *cb)
	/* always for found request */
	kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request);
	barrier();
	wake_up(&nlmsg_request->waitq);
	up(&nlmsg_request->sem);
	return 0;
}
EXPORT_SYMBOL(iwpm_add_mapping_cb);
@@ -555,7 +555,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb,
	/* always for found request */
	kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request);
	barrier();
	wake_up(&nlmsg_request->waitq);
	up(&nlmsg_request->sem);
	return 0;
}
EXPORT_SYMBOL(iwpm_add_and_query_mapping_cb);
@@ -749,7 +749,7 @@ int iwpm_mapping_error_cb(struct sk_buff *skb, struct netlink_callback *cb)
	/* always for found request */
	kref_put(&nlmsg_request->kref, iwpm_free_nlmsg_request);
	barrier();
	wake_up(&nlmsg_request->waitq);
	up(&nlmsg_request->sem);
	return 0;
}
EXPORT_SYMBOL(iwpm_mapping_error_cb);
+7 −7
Original line number Diff line number Diff line
@@ -322,6 +322,8 @@ struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq,
	nlmsg_request->nl_client = nl_client;
	nlmsg_request->request_done = 0;
	nlmsg_request->err_code = 0;
	sema_init(&nlmsg_request->sem, 1);
	down(&nlmsg_request->sem);
	return nlmsg_request;
}

@@ -364,11 +366,9 @@ struct iwpm_nlmsg_request *iwpm_find_nlmsg_request(__u32 echo_seq)
int iwpm_wait_complete_req(struct iwpm_nlmsg_request *nlmsg_request)
{
	int ret;
	init_waitqueue_head(&nlmsg_request->waitq);

	ret = wait_event_timeout(nlmsg_request->waitq,
			(nlmsg_request->request_done != 0), IWPM_NL_TIMEOUT);
	if (!ret) {
	ret = down_timeout(&nlmsg_request->sem, IWPM_NL_TIMEOUT);
	if (ret) {
		ret = -EINVAL;
		pr_info("%s: Timeout %d sec for netlink request (seq = %u)\n",
			__func__, (IWPM_NL_TIMEOUT/HZ), nlmsg_request->nlmsg_seq);
+1 −1
Original line number Diff line number Diff line
@@ -69,7 +69,7 @@ struct iwpm_nlmsg_request {
	u8	            nl_client;
	u8                  request_done;
	u16                 err_code;
	wait_queue_head_t   waitq;
	struct semaphore    sem;
	struct kref         kref;
};