Commit b16b4351 authored by Peter Hurley's avatar Peter Hurley Committed by Marcel Holtmann

Bluetooth: Refactor write_room() calculation

Compute the amount of space available for a single write()
within rfcomm_room(); clamp to 0 for negative values. Note
this patch does not change the result of the computation.

Report the amount of room returned in the debug printk.
Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Tested-By: default avatarAlexander Holler <holler@ahsoftware.de>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 72e5108c
...@@ -348,11 +348,18 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) ...@@ -348,11 +348,18 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
} }
/* ---- Send buffer ---- */ /* ---- Send buffer ---- */
static inline unsigned int rfcomm_room(struct rfcomm_dlc *dlc) static inline unsigned int rfcomm_room(struct rfcomm_dev *dev)
{ {
/* We can't let it be zero, because we don't get a callback struct rfcomm_dlc *dlc = dev->dlc;
when tx_credits becomes nonzero, hence we'd never wake up */
return dlc->mtu * (dlc->tx_credits?:1); /* The limit is bogus; the number of packets which can
* currently be sent by the krfcommd thread has no relevance
* to the number of packets which can be queued on the dlc's
* tx queue.
*/
int limit = dlc->mtu * (dlc->tx_credits?:1);
return max(0, limit - atomic_read(&dev->wmem_alloc));
} }
static void rfcomm_wfree(struct sk_buff *skb) static void rfcomm_wfree(struct sk_buff *skb)
...@@ -809,16 +816,12 @@ static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, in ...@@ -809,16 +816,12 @@ static int rfcomm_tty_write(struct tty_struct *tty, const unsigned char *buf, in
static int rfcomm_tty_write_room(struct tty_struct *tty) static int rfcomm_tty_write_room(struct tty_struct *tty)
{ {
struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data; struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
int room; int room = 0;
BT_DBG("tty %p", tty); if (dev && dev->dlc)
room = rfcomm_room(dev);
if (!dev || !dev->dlc)
return 0;
room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc); BT_DBG("tty %p room %d", tty, room);
if (room < 0)
room = 0;
return room; return room;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment