Skip to content

Commit

Permalink
net: ipa: refactor status buffer parsing
Browse files Browse the repository at this point in the history
The packet length encoded in an IPA packet status buffer is computed
more than once in ipa_endpoint_status_parse().  It is also checked
again in ipa_endpoint_status_skip(), which that function calls.

Compute the length once, and use that computed value later rather
than recomputing it.  Check for it being zero in the parse function
rather than in ipa_endpoint_status_skip().

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Alex Elder authored and David S. Miller committed Jan 27, 2023
1 parent c800551 commit 63a560b
Showing 1 changed file with 6 additions and 8 deletions.
14 changes: 6 additions & 8 deletions drivers/net/ipa/ipa_endpoint.c
Original file line number Diff line number Diff line change
Expand Up @@ -1325,8 +1325,7 @@ static bool ipa_endpoint_status_skip(struct ipa_endpoint *endpoint,

if (!ipa_status_format_packet(status->opcode))
return true;
if (!status->pkt_len)
return true;

endpoint_id = u8_get_bits(status->endp_dst_idx,
IPA_STATUS_DST_IDX_FMASK);
if (endpoint_id != endpoint->endpoint_id)
Expand Down Expand Up @@ -1394,6 +1393,7 @@ static void ipa_endpoint_status_parse(struct ipa_endpoint *endpoint,

while (resid) {
const struct ipa_status *status = data;
u32 length;
u32 align;
u32 len;

Expand All @@ -1405,7 +1405,8 @@ static void ipa_endpoint_status_parse(struct ipa_endpoint *endpoint,
}

/* Skip over status packets that lack packet data */
if (ipa_endpoint_status_skip(endpoint, status)) {
length = le16_to_cpu(status->pkt_len);
if (!length || ipa_endpoint_status_skip(endpoint, status)) {
data += sizeof(*status);
resid -= sizeof(*status);
continue;
Expand All @@ -1418,27 +1419,24 @@ static void ipa_endpoint_status_parse(struct ipa_endpoint *endpoint,
* computed checksum information will be appended.
*/
align = endpoint->config.rx.pad_align ? : 1;
len = le16_to_cpu(status->pkt_len);
len = sizeof(*status) + ALIGN(len, align);
len = sizeof(*status) + ALIGN(length, align);
if (endpoint->config.checksum)
len += sizeof(struct rmnet_map_dl_csum_trailer);

if (!ipa_endpoint_status_drop(endpoint, status)) {
void *data2;
u32 extra;
u32 len2;

/* Client receives only packet data (no status) */
data2 = data + sizeof(*status);
len2 = le16_to_cpu(status->pkt_len);

/* Have the true size reflect the extra unused space in
* the original receive buffer. Distribute the "cost"
* proportionately across all aggregated packets in the
* buffer.
*/
extra = DIV_ROUND_CLOSEST(unused * len, total_len);
ipa_endpoint_skb_copy(endpoint, data2, len2, extra);
ipa_endpoint_skb_copy(endpoint, data2, length, extra);
}

/* Consume status and the full packet it describes */
Expand Down

0 comments on commit 63a560b

Please sign in to comment.