#include <linux/qrtr.h>
#include <linux/net.h>
#include <linux/completion.h>
-#include <linux/idr.h>
#include <linux/string.h>
#include <net/sock.h>
#include <linux/workqueue.h>
txn->ei = ei;
txn->dest = c_struct;
- mutex_lock(&qmi->txn_lock);
- ret = idr_alloc_cyclic(&qmi->txns, txn, 0, U16_MAX, GFP_KERNEL);
- if (ret < 0)
+ ret = xa_alloc_cyclic(&qmi->txns, &txn->id, txn, XA_LIMIT(0, U16_MAX),
+ &qmi->txn_next, GFP_KERNEL);
+ if (ret < 0) {
pr_err("failed to allocate transaction id\n");
+ return ret;
+ }
- txn->id = ret;
- mutex_unlock(&qmi->txn_lock);
-
- return ret;
+ return txn->id;
}
EXPORT_SYMBOL(qmi_txn_init);
ret = wait_for_completion_timeout(&txn->completion, timeout);
- mutex_lock(&qmi->txn_lock);
mutex_lock(&txn->lock);
- idr_remove(&qmi->txns, txn->id);
+ xa_erase(&qmi->txns, txn->id);
mutex_unlock(&txn->lock);
- mutex_unlock(&qmi->txn_lock);
if (ret == 0)
return -ETIMEDOUT;
{
struct qmi_handle *qmi = txn->qmi;
- mutex_lock(&qmi->txn_lock);
mutex_lock(&txn->lock);
- idr_remove(&qmi->txns, txn->id);
+ xa_erase(&qmi->txns, txn->id);
mutex_unlock(&txn->lock);
- mutex_unlock(&qmi->txn_lock);
}
EXPORT_SYMBOL(qmi_txn_cancel);
/* If this is a response, find the matching transaction handle */
if (hdr->type == QMI_RESPONSE) {
- mutex_lock(&qmi->txn_lock);
- txn = idr_find(&qmi->txns, hdr->txn_id);
+ txn = xa_load(&qmi->txns, hdr->txn_id);
/* Ignore unexpected responses */
- if (!txn) {
- mutex_unlock(&qmi->txn_lock);
+ if (!txn)
return;
- }
mutex_lock(&txn->lock);
- mutex_unlock(&qmi->txn_lock);
if (txn->dest && txn->ei) {
ret = qmi_decode_message(buf, len, txn->ei, txn->dest);
{
int ret;
- mutex_init(&qmi->txn_lock);
mutex_init(&qmi->sock_lock);
- idr_init(&qmi->txns);
+ xa_init_flags(&qmi->txns, XA_FLAGS_ALLOC);
+ qmi->txn_next = 0;
INIT_LIST_HEAD(&qmi->lookups);
INIT_LIST_HEAD(&qmi->lookup_results);
destroy_workqueue(qmi->wq);
- idr_destroy(&qmi->txns);
-
kfree(qmi->recv_buf);
/* Free registered lookup requests */
#define __QMI_HELPERS_H__
#include <linux/completion.h>
-#include <linux/idr.h>
#include <linux/list.h>
#include <linux/qrtr.h>
#include <linux/types.h>
#include <linux/workqueue.h>
+#include <linux/xarray.h>
struct socket;
struct qmi_txn {
struct qmi_handle *qmi;
- u16 id;
+ u32 id;
+ int result;
struct mutex lock;
struct completion completion;
- int result;
struct qmi_elem_info *ei;
void *dest;
* @services: list of registered services (by this client)
* @ops: reference to callbacks
* @txns: outstanding transactions
- * @txn_lock: lock for modifications of @txns
+ * @txn_next: next transaction number
* @handlers: list of handlers for incoming messages
*/
struct qmi_handle {
struct qmi_ops ops;
- struct idr txns;
- struct mutex txn_lock;
+ struct xarray txns;
+ u32 txn_next;
const struct qmi_msg_handler *handlers;
};