Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ALSA: usb-audio: Use guard() for spin locks

Clean up the code using guard() for spin locks.

Merely code refactoring, and no behavior change.

Signed-off-by: Takashi Iwai <tiwai@suse.de>

+99 -107
+99 -107
sound/usb/pcm.c
··· 1528 1528 int counts; 1529 1529 unsigned int transfer_done, frame_limit, avail = 0; 1530 1530 int i, stride, period_elapsed = 0; 1531 - unsigned long flags; 1532 - int err = 0; 1533 1531 1534 1532 stride = ep->stride; 1535 1533 ··· 1535 1537 ctx->queued = 0; 1536 1538 urb->number_of_packets = 0; 1537 1539 1538 - spin_lock_irqsave(&subs->lock, flags); 1539 - frame_limit = subs->frame_limit + ep->max_urb_frames; 1540 - transfer_done = subs->transfer_done; 1540 + scoped_guard(spinlock_irqsave, &subs->lock) { 1541 + frame_limit = subs->frame_limit + ep->max_urb_frames; 1542 + transfer_done = subs->transfer_done; 1541 1543 1542 - if (subs->lowlatency_playback && 1543 - runtime->state != SNDRV_PCM_STATE_DRAINING) { 1544 - unsigned int hwptr = subs->hwptr_done / stride; 1544 + if (subs->lowlatency_playback && 1545 + runtime->state != SNDRV_PCM_STATE_DRAINING) { 1546 + unsigned int hwptr = subs->hwptr_done / stride; 1545 1547 1546 - /* calculate the byte offset-in-buffer of the appl_ptr */ 1547 - avail = (runtime->control->appl_ptr - runtime->hw_ptr_base) 1548 - % runtime->buffer_size; 1549 - if (avail <= hwptr) 1550 - avail += runtime->buffer_size; 1551 - avail -= hwptr; 1552 - } 1553 - 1554 - for (i = 0; i < ctx->packets; i++) { 1555 - counts = snd_usb_endpoint_next_packet_size(ep, ctx, i, avail); 1556 - if (counts < 0) 1557 - break; 1558 - /* set up descriptor */ 1559 - urb->iso_frame_desc[i].offset = frames * stride; 1560 - urb->iso_frame_desc[i].length = counts * stride; 1561 - frames += counts; 1562 - avail -= counts; 1563 - urb->number_of_packets++; 1564 - transfer_done += counts; 1565 - if (transfer_done >= runtime->period_size) { 1566 - transfer_done -= runtime->period_size; 1567 - frame_limit = 0; 1568 - period_elapsed = 1; 1569 - if (subs->fmt_type == UAC_FORMAT_TYPE_II) { 1570 - if (transfer_done > 0) { 1571 - /* FIXME: fill-max mode is not 1572 - * supported yet */ 1573 - frames -= transfer_done; 1574 - counts -= transfer_done; 1575 - urb->iso_frame_desc[i].length = 1576 - counts * stride; 1577 - transfer_done = 0; 1578 - } 1579 - i++; 1580 - if (i < ctx->packets) { 1581 - /* add a transfer delimiter */ 1582 - urb->iso_frame_desc[i].offset = 1583 - frames * stride; 1584 - urb->iso_frame_desc[i].length = 0; 1585 - urb->number_of_packets++; 1586 - } 1587 - break; 1588 - } 1548 + /* calculate the byte offset-in-buffer of the appl_ptr */ 1549 + avail = (runtime->control->appl_ptr - runtime->hw_ptr_base) 1550 + % runtime->buffer_size; 1551 + if (avail <= hwptr) 1552 + avail += runtime->buffer_size; 1553 + avail -= hwptr; 1589 1554 } 1590 - /* finish at the period boundary or after enough frames */ 1591 - if ((period_elapsed || transfer_done >= frame_limit) && 1592 - !snd_usb_endpoint_implicit_feedback_sink(ep)) 1593 - break; 1594 - } 1595 1555 1596 - if (!frames) { 1597 - err = -EAGAIN; 1598 - goto unlock; 1599 - } 1556 + for (i = 0; i < ctx->packets; i++) { 1557 + counts = snd_usb_endpoint_next_packet_size(ep, ctx, i, avail); 1558 + if (counts < 0) 1559 + break; 1560 + /* set up descriptor */ 1561 + urb->iso_frame_desc[i].offset = frames * stride; 1562 + urb->iso_frame_desc[i].length = counts * stride; 1563 + frames += counts; 1564 + avail -= counts; 1565 + urb->number_of_packets++; 1566 + transfer_done += counts; 1567 + if (transfer_done >= runtime->period_size) { 1568 + transfer_done -= runtime->period_size; 1569 + frame_limit = 0; 1570 + period_elapsed = 1; 1571 + if (subs->fmt_type == UAC_FORMAT_TYPE_II) { 1572 + if (transfer_done > 0) { 1573 + /* FIXME: fill-max mode is not 1574 + * supported yet */ 1575 + frames -= transfer_done; 1576 + counts -= transfer_done; 1577 + urb->iso_frame_desc[i].length = 1578 + counts * stride; 1579 + transfer_done = 0; 1580 + } 1581 + i++; 1582 + if (i < ctx->packets) { 1583 + /* add a transfer delimiter */ 1584 + urb->iso_frame_desc[i].offset = 1585 + frames * stride; 1586 + urb->iso_frame_desc[i].length = 0; 1587 + urb->number_of_packets++; 1588 + } 1589 + break; 1590 + } 1591 + } 1592 + /* finish at the period boundary or after enough frames */ 1593 + if ((period_elapsed || transfer_done >= frame_limit) && 1594 + !snd_usb_endpoint_implicit_feedback_sink(ep)) 1595 + break; 1596 + } 1600 1597 1601 - bytes = frames * stride; 1602 - subs->transfer_done = transfer_done; 1603 - subs->frame_limit = frame_limit; 1604 - if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE && 1605 - subs->cur_audiofmt->dsd_dop)) { 1606 - fill_playback_urb_dsd_dop(subs, urb, bytes); 1607 - } else if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U8 && 1608 - subs->cur_audiofmt->dsd_bitrev)) { 1609 - fill_playback_urb_dsd_bitrev(subs, urb, bytes); 1610 - } else { 1611 - /* usual PCM */ 1612 - if (!subs->tx_length_quirk) 1613 - copy_to_urb(subs, urb, 0, stride, bytes); 1614 - else 1615 - bytes = copy_to_urb_quirk(subs, urb, stride, bytes); 1598 + if (!frames) 1599 + return -EAGAIN; 1600 + 1601 + bytes = frames * stride; 1602 + subs->transfer_done = transfer_done; 1603 + subs->frame_limit = frame_limit; 1604 + if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U16_LE && 1605 + subs->cur_audiofmt->dsd_dop)) { 1606 + fill_playback_urb_dsd_dop(subs, urb, bytes); 1607 + } else if (unlikely(ep->cur_format == SNDRV_PCM_FORMAT_DSD_U8 && 1608 + subs->cur_audiofmt->dsd_bitrev)) { 1609 + fill_playback_urb_dsd_bitrev(subs, urb, bytes); 1610 + } else { 1611 + /* usual PCM */ 1612 + if (!subs->tx_length_quirk) 1613 + copy_to_urb(subs, urb, 0, stride, bytes); 1614 + else 1615 + bytes = copy_to_urb_quirk(subs, urb, stride, bytes); 1616 1616 /* bytes is now amount of outgoing data */ 1617 + } 1618 + 1619 + subs->last_frame_number = usb_get_current_frame_number(subs->dev); 1620 + 1621 + if (subs->trigger_tstamp_pending_update) { 1622 + /* this is the first actual URB submitted, 1623 + * update trigger timestamp to reflect actual start time 1624 + */ 1625 + snd_pcm_gettime(runtime, &runtime->trigger_tstamp); 1626 + subs->trigger_tstamp_pending_update = false; 1627 + } 1628 + 1629 + if (period_elapsed && !subs->running && subs->lowlatency_playback) { 1630 + subs->period_elapsed_pending = 1; 1631 + period_elapsed = 0; 1632 + } 1617 1633 } 1618 1634 1619 - subs->last_frame_number = usb_get_current_frame_number(subs->dev); 1620 - 1621 - if (subs->trigger_tstamp_pending_update) { 1622 - /* this is the first actual URB submitted, 1623 - * update trigger timestamp to reflect actual start time 1624 - */ 1625 - snd_pcm_gettime(runtime, &runtime->trigger_tstamp); 1626 - subs->trigger_tstamp_pending_update = false; 1627 - } 1628 - 1629 - if (period_elapsed && !subs->running && subs->lowlatency_playback) { 1630 - subs->period_elapsed_pending = 1; 1631 - period_elapsed = 0; 1632 - } 1633 - 1634 - unlock: 1635 - spin_unlock_irqrestore(&subs->lock, flags); 1636 - if (err < 0) 1637 - return err; 1638 1635 urb->transfer_buffer_length = bytes; 1639 1636 if (period_elapsed) { 1640 1637 if (in_stream_lock) ··· 1647 1654 static void retire_playback_urb(struct snd_usb_substream *subs, 1648 1655 struct urb *urb) 1649 1656 { 1650 - unsigned long flags; 1651 1657 struct snd_urb_ctx *ctx = urb->context; 1652 1658 bool period_elapsed = false; 1653 1659 1654 - spin_lock_irqsave(&subs->lock, flags); 1655 - if (ctx->queued) { 1656 - if (subs->inflight_bytes >= ctx->queued) 1657 - subs->inflight_bytes -= ctx->queued; 1658 - else 1659 - subs->inflight_bytes = 0; 1660 - } 1660 + scoped_guard(spinlock_irqsave, &subs->lock) { 1661 + if (ctx->queued) { 1662 + if (subs->inflight_bytes >= ctx->queued) 1663 + subs->inflight_bytes -= ctx->queued; 1664 + else 1665 + subs->inflight_bytes = 0; 1666 + } 1661 1667 1662 - subs->last_frame_number = usb_get_current_frame_number(subs->dev); 1663 - if (subs->running) { 1664 - period_elapsed = subs->period_elapsed_pending; 1665 - subs->period_elapsed_pending = 0; 1668 + subs->last_frame_number = usb_get_current_frame_number(subs->dev); 1669 + if (subs->running) { 1670 + period_elapsed = subs->period_elapsed_pending; 1671 + subs->period_elapsed_pending = 0; 1672 + } 1666 1673 } 1667 - spin_unlock_irqrestore(&subs->lock, flags); 1668 1674 if (period_elapsed) 1669 1675 snd_pcm_period_elapsed(subs->pcm_substream); 1670 1676 }