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

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

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
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -348,11 +348,18 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
}

/* ---- 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
	   when tx_credits becomes nonzero, hence we'd never wake up */
	return dlc->mtu * (dlc->tx_credits?:1);
	struct rfcomm_dlc *dlc = dev->dlc;

	/* 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)
@@ -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)
{
	struct rfcomm_dev *dev = (struct rfcomm_dev *) tty->driver_data;
	int room;
	int room = 0;

	BT_DBG("tty %p", tty);

	if (!dev || !dev->dlc)
		return 0;
	if (dev && dev->dlc)
		room = rfcomm_room(dev);

	room = rfcomm_room(dev->dlc) - atomic_read(&dev->wmem_alloc);
	if (room < 0)
		room = 0;
	BT_DBG("tty %p room %d", tty, room);

	return room;
}