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

Commit ec24751a authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

arm-omap: don't abuse rq->data



omap mailbox uses rq->data as the second opaque pointer to carry
mbox_msg_t and rq->special message argument which is needed only for
tx.  Add and use omap_msg_tx_data struct for tx and use rq->special
for mbox_msg_t for rx such that only rq->special is used as opaque
pointer.

[ Impact: cleanup rq->data usage, extra kmalloc in msg_send ]

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Russell King <rmk@arm.linux.org.uk>
parent f06d9a2b
Loading
Loading
Loading
Loading
+31 −12
Original line number Diff line number Diff line
@@ -147,24 +147,40 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg)
	return ret;
}

struct omap_msg_tx_data {
	mbox_msg_t	msg;
	void		*arg;
};

static void omap_msg_tx_end_io(struct request *rq, int error)
{
	kfree(rq->special);
	__blk_put_request(rq->q, rq);
}

int omap_mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void* arg)
{
	struct omap_msg_tx_data *tx_data;
	struct request *rq;
	struct request_queue *q = mbox->txq->queue;
	int ret = 0;

	tx_data = kmalloc(sizeof(*tx_data), GFP_ATOMIC);
	if (unlikely(!tx_data))
		return -ENOMEM;

	rq = blk_get_request(q, WRITE, GFP_ATOMIC);
	if (unlikely(!rq)) {
		ret = -ENOMEM;
		goto fail;
		kfree(tx_data);
		return -ENOMEM;
	}

	rq->data = (void *)msg;
	blk_insert_request(q, rq, 0, arg);
	tx_data->msg = msg;
	tx_data->arg = arg;
	rq->end_io = omap_msg_tx_end_io;
	blk_insert_request(q, rq, 0, tx_data);

	schedule_work(&mbox->txq->work);
 fail:
	return ret;
	return 0;
}
EXPORT_SYMBOL(omap_mbox_msg_send);

@@ -178,6 +194,8 @@ static void mbox_tx_work(struct work_struct *work)
	struct request_queue *q = mbox->txq->queue;

	while (1) {
		struct omap_msg_tx_data *tx_data;

		spin_lock(q->queue_lock);
		rq = elv_next_request(q);
		spin_unlock(q->queue_lock);
@@ -185,7 +203,9 @@ static void mbox_tx_work(struct work_struct *work)
		if (!rq)
			break;

		ret = __mbox_msg_send(mbox, (mbox_msg_t) rq->data, rq->special);
		tx_data = rq->special;

		ret = __mbox_msg_send(mbox, tx_data->msg, tx_data->arg);
		if (ret) {
			enable_mbox_irq(mbox, IRQ_TX);
			return;
@@ -222,7 +242,7 @@ static void mbox_rx_work(struct work_struct *work)
		if (!rq)
			break;

		msg = (mbox_msg_t) rq->data;
		msg = (mbox_msg_t)rq->special;
		blk_end_request_all(rq, 0);
		mbox->rxq->callback((void *)msg);
	}
@@ -260,7 +280,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
			goto nomem;

		msg = mbox_fifo_read(mbox);
		rq->data = (void *)msg;

		if (unlikely(mbox_seq_test(mbox, msg))) {
			pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
@@ -268,7 +287,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
				mbox->err_notify();
		}

		blk_insert_request(q, rq, 0, NULL);
		blk_insert_request(q, rq, 0, (void *)msg);
		if (mbox->ops->type == OMAP_MBOX_TYPE1)
			break;
	}
@@ -331,7 +350,7 @@ omap_mbox_read(struct device *dev, struct device_attribute *attr, char *buf)
		if (!rq)
			break;

		*p = (mbox_msg_t) rq->data;
		*p = (mbox_msg_t)rq->special;

		blk_end_request_all(rq, 0);