Skip to content

Commit b773378

Browse files
breakerttjohnousterhout
authored andcommitted
Fix double handoff for unloaded small messages
Resolves #84.
1 parent cd69759 commit b773378

2 files changed

Lines changed: 32 additions & 32 deletions

File tree

homa_incoming.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ void homa_data_pkt(struct sk_buff *skb, struct homa_rpc *rpc)
741741

742742
homa_add_packet(rpc, skb);
743743

744-
/* Note: skb is no longer valid: homa_add_packet may have freed id. */
744+
/* Note: skb is no longer valid: homa_add_packet may have freed it. */
745745

746746
if (skb_queue_len(&rpc->msgin.packets) != 0 &&
747747
!test_bit(RPC_PKTS_READY, &rpc->flags)) {

test/unit_homa_incoming.c

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1517,37 +1517,6 @@ TEST_F(homa_incoming, homa_data_pkt__update_delta)
15171517
homa_data_pkt(mock_skb_alloc(self->server_ip, &self->data.common,
15181518
1400, 2800), crpc);
15191519
}
1520-
TEST_F(homa_incoming, homa_data_pkt__handoff)
1521-
{
1522-
struct homa_rpc *crpc = unit_client_rpc(&self->hsk,
1523-
UNIT_OUTGOING, self->client_ip, self->server_ip,
1524-
self->server_port, self->client_id, 1000, 3000);
1525-
1526-
ASSERT_NE(NULL, crpc);
1527-
unit_log_clear();
1528-
crpc->msgout.next_xmit_offset = crpc->msgout.length;
1529-
1530-
/* First packet triggers handoff. */
1531-
self->data.message_length = htonl(3000);
1532-
self->data.seg.offset = htonl(1400);
1533-
homa_data_pkt(mock_skb_alloc(self->server_ip, &self->data.common,
1534-
1400, 0), crpc);
1535-
EXPECT_EQ(1, unit_list_length(&self->hsk.ready_rpcs));
1536-
EXPECT_TRUE(test_bit(RPC_PKTS_READY, &crpc->flags));
1537-
EXPECT_EQ(1600, crpc->msgin.bytes_remaining);
1538-
EXPECT_EQ(1, skb_queue_len(&crpc->msgin.packets));
1539-
EXPECT_STREQ("sk->sk_data_ready invoked", unit_log_get());
1540-
1541-
/* Second packet doesn't trigger a handoff because one is
1542-
* already pending.
1543-
*/
1544-
self->data.message_length = htonl(3000);
1545-
self->data.seg.offset = htonl(2800);
1546-
unit_log_clear();
1547-
homa_data_pkt(mock_skb_alloc(self->server_ip, &self->data.common,
1548-
200, 0), crpc);
1549-
EXPECT_STREQ("", unit_log_get());
1550-
}
15511520
#ifndef __STRIP__ /* See strip.py */
15521521
TEST_F(homa_incoming, homa_data_pkt__send_cutoffs)
15531522
{
@@ -1585,6 +1554,37 @@ TEST_F(homa_incoming, homa_data_pkt__cutoffs_up_to_date)
15851554
1400, 0));
15861555
EXPECT_STREQ("sk->sk_data_ready invoked", unit_log_get());
15871556
}
1557+
TEST_F(homa_incoming, homa_data_pkt__handoff)
1558+
{
1559+
struct homa_rpc *crpc = unit_client_rpc(&self->hsk,
1560+
UNIT_OUTGOING, self->client_ip, self->server_ip,
1561+
self->server_port, self->client_id, 1000, 3000);
1562+
1563+
ASSERT_NE(NULL, crpc);
1564+
unit_log_clear();
1565+
crpc->msgout.next_xmit_offset = crpc->msgout.length;
1566+
1567+
/* First packet triggers handoff. */
1568+
self->data.message_length = htonl(3000);
1569+
self->data.seg.offset = htonl(1400);
1570+
homa_data_pkt(mock_skb_alloc(self->server_ip, &self->data.common,
1571+
1400, 0), crpc);
1572+
EXPECT_EQ(1, unit_list_length(&self->hsk.ready_rpcs));
1573+
EXPECT_TRUE(test_bit(RPC_PKTS_READY, &crpc->flags));
1574+
EXPECT_EQ(1600, crpc->msgin.bytes_remaining);
1575+
EXPECT_EQ(1, skb_queue_len(&crpc->msgin.packets));
1576+
EXPECT_STREQ("sk->sk_data_ready invoked", unit_log_get());
1577+
1578+
/* Second packet doesn't trigger a handoff because one is
1579+
* already pending.
1580+
*/
1581+
self->data.message_length = htonl(3000);
1582+
self->data.seg.offset = htonl(2800);
1583+
unit_log_clear();
1584+
homa_data_pkt(mock_skb_alloc(self->server_ip, &self->data.common,
1585+
200, 0), crpc);
1586+
EXPECT_STREQ("", unit_log_get());
1587+
}
15881588
TEST_F(homa_incoming, homa_data_pkt__handle_ack)
15891589
{
15901590
struct homa_rpc *srpc1 = unit_server_rpc(&self->hsk, UNIT_OUTGOING,

0 commit comments

Comments
 (0)