Skip to content

Commit 8497324

Browse files
johnkeepingtiwai
authored andcommitted
ALSA: serial-generic: remove shared static buffer
If multiple instances of this driver are instantiated and try to send concurrently then the single static buffer snd_serial_generic_tx_work() will cause corruption in the data output. Move the buffer into the per-instance driver data to avoid this. Signed-off-by: John Keeping <jkeeping@inmusicbrands.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent c29287b commit 8497324

1 file changed

Lines changed: 7 additions & 5 deletions

File tree

sound/drivers/serial-generic.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ MODULE_LICENSE("GPL");
3737
#define SERIAL_TX_STATE_ACTIVE 1
3838
#define SERIAL_TX_STATE_WAKEUP 2
3939

40+
#define INTERNAL_BUF_SIZE 256
41+
4042
struct snd_serial_generic {
4143
struct serdev_device *serdev;
4244

@@ -51,6 +53,7 @@ struct snd_serial_generic {
5153
struct work_struct tx_work;
5254
unsigned long tx_state;
5355

56+
char tx_buf[INTERNAL_BUF_SIZE];
5457
};
5558

5659
static void snd_serial_generic_tx_wakeup(struct snd_serial_generic *drvdata)
@@ -61,11 +64,8 @@ static void snd_serial_generic_tx_wakeup(struct snd_serial_generic *drvdata)
6164
schedule_work(&drvdata->tx_work);
6265
}
6366

64-
#define INTERNAL_BUF_SIZE 256
65-
6667
static void snd_serial_generic_tx_work(struct work_struct *work)
6768
{
68-
static char buf[INTERNAL_BUF_SIZE];
6969
int num_bytes;
7070
struct snd_serial_generic *drvdata = container_of(work, struct snd_serial_generic,
7171
tx_work);
@@ -78,8 +78,10 @@ static void snd_serial_generic_tx_work(struct work_struct *work)
7878
if (!test_bit(SERIAL_MODE_OUTPUT_OPEN, &drvdata->filemode))
7979
break;
8080

81-
num_bytes = snd_rawmidi_transmit_peek(substream, buf, INTERNAL_BUF_SIZE);
82-
num_bytes = serdev_device_write_buf(drvdata->serdev, buf, num_bytes);
81+
num_bytes = snd_rawmidi_transmit_peek(substream, drvdata->tx_buf,
82+
INTERNAL_BUF_SIZE);
83+
num_bytes = serdev_device_write_buf(drvdata->serdev, drvdata->tx_buf,
84+
num_bytes);
8385

8486
if (!num_bytes)
8587
break;

0 commit comments

Comments
 (0)