提交 ec24751a 编写于 作者: T Tejun Heo 提交者: Jens Axboe

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: NTejun Heo <tj@kernel.org>
Cc: Russell King <rmk@arm.linux.org.uk>
上级 f06d9a2b
...@@ -147,24 +147,40 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg) ...@@ -147,24 +147,40 @@ static int __mbox_msg_send(struct omap_mbox *mbox, mbox_msg_t msg, void *arg)
return ret; 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) 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 *rq;
struct request_queue *q = mbox->txq->queue; 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); rq = blk_get_request(q, WRITE, GFP_ATOMIC);
if (unlikely(!rq)) { if (unlikely(!rq)) {
ret = -ENOMEM; kfree(tx_data);
goto fail; return -ENOMEM;
} }
rq->data = (void *)msg; tx_data->msg = msg;
blk_insert_request(q, rq, 0, arg); 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); schedule_work(&mbox->txq->work);
fail: return 0;
return ret;
} }
EXPORT_SYMBOL(omap_mbox_msg_send); EXPORT_SYMBOL(omap_mbox_msg_send);
...@@ -178,6 +194,8 @@ static void mbox_tx_work(struct work_struct *work) ...@@ -178,6 +194,8 @@ static void mbox_tx_work(struct work_struct *work)
struct request_queue *q = mbox->txq->queue; struct request_queue *q = mbox->txq->queue;
while (1) { while (1) {
struct omap_msg_tx_data *tx_data;
spin_lock(q->queue_lock); spin_lock(q->queue_lock);
rq = elv_next_request(q); rq = elv_next_request(q);
spin_unlock(q->queue_lock); spin_unlock(q->queue_lock);
...@@ -185,7 +203,9 @@ static void mbox_tx_work(struct work_struct *work) ...@@ -185,7 +203,9 @@ static void mbox_tx_work(struct work_struct *work)
if (!rq) if (!rq)
break; 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) { if (ret) {
enable_mbox_irq(mbox, IRQ_TX); enable_mbox_irq(mbox, IRQ_TX);
return; return;
...@@ -222,7 +242,7 @@ static void mbox_rx_work(struct work_struct *work) ...@@ -222,7 +242,7 @@ static void mbox_rx_work(struct work_struct *work)
if (!rq) if (!rq)
break; break;
msg = (mbox_msg_t) rq->data; msg = (mbox_msg_t)rq->special;
blk_end_request_all(rq, 0); blk_end_request_all(rq, 0);
mbox->rxq->callback((void *)msg); mbox->rxq->callback((void *)msg);
} }
...@@ -260,7 +280,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox) ...@@ -260,7 +280,6 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
goto nomem; goto nomem;
msg = mbox_fifo_read(mbox); msg = mbox_fifo_read(mbox);
rq->data = (void *)msg;
if (unlikely(mbox_seq_test(mbox, msg))) { if (unlikely(mbox_seq_test(mbox, msg))) {
pr_info("mbox: Illegal seq bit!(%08x)\n", msg); pr_info("mbox: Illegal seq bit!(%08x)\n", msg);
...@@ -268,7 +287,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox) ...@@ -268,7 +287,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
mbox->err_notify(); 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) if (mbox->ops->type == OMAP_MBOX_TYPE1)
break; break;
} }
...@@ -331,7 +350,7 @@ omap_mbox_read(struct device *dev, struct device_attribute *attr, char *buf) ...@@ -331,7 +350,7 @@ omap_mbox_read(struct device *dev, struct device_attribute *attr, char *buf)
if (!rq) if (!rq)
break; break;
*p = (mbox_msg_t) rq->data; *p = (mbox_msg_t)rq->special;
blk_end_request_all(rq, 0); blk_end_request_all(rq, 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册