Skip to content

Commit 291759a

Browse files
Eugene Crosserdavem330
authored andcommitted
af_iucv: remove fragment_skb() to use paged SKBs
Before introducing paged skbs in the receive path, get rid of the function `iucv_fragment_skb()` that replaces one large linear skb with several smaller linear skbs. Signed-off-by: Eugene Crosser <[email protected]> Signed-off-by: Ursula Braun <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e537439 commit 291759a

File tree

1 file changed

+3
-56
lines changed

1 file changed

+3
-56
lines changed

net/iucv/af_iucv.c

Lines changed: 3 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,44 +1231,6 @@ static int iucv_sock_sendmsg(struct socket *sock, struct msghdr *msg,
12311231
return err;
12321232
}
12331233

1234-
/* iucv_fragment_skb() - Fragment a single IUCV message into multiple skb's
1235-
*
1236-
* Locking: must be called with message_q.lock held
1237-
*/
1238-
static int iucv_fragment_skb(struct sock *sk, struct sk_buff *skb, int len)
1239-
{
1240-
int dataleft, size, copied = 0;
1241-
struct sk_buff *nskb;
1242-
1243-
dataleft = len;
1244-
while (dataleft) {
1245-
if (dataleft >= sk->sk_rcvbuf / 4)
1246-
size = sk->sk_rcvbuf / 4;
1247-
else
1248-
size = dataleft;
1249-
1250-
nskb = alloc_skb(size, GFP_ATOMIC | GFP_DMA);
1251-
if (!nskb)
1252-
return -ENOMEM;
1253-
1254-
/* copy target class to control buffer of new skb */
1255-
IUCV_SKB_CB(nskb)->class = IUCV_SKB_CB(skb)->class;
1256-
1257-
/* copy data fragment */
1258-
memcpy(nskb->data, skb->data + copied, size);
1259-
copied += size;
1260-
dataleft -= size;
1261-
1262-
skb_reset_transport_header(nskb);
1263-
skb_reset_network_header(nskb);
1264-
nskb->len = size;
1265-
1266-
skb_queue_tail(&iucv_sk(sk)->backlog_skb_q, nskb);
1267-
}
1268-
1269-
return 0;
1270-
}
1271-
12721234
/* iucv_process_message() - Receive a single outstanding IUCV message
12731235
*
12741236
* Locking: must be called with message_q.lock held
@@ -1300,24 +1262,9 @@ static void iucv_process_message(struct sock *sk, struct sk_buff *skb,
13001262
kfree_skb(skb);
13011263
return;
13021264
}
1303-
/* we need to fragment iucv messages for SOCK_STREAM only;
1304-
* for SOCK_SEQPACKET, it is only relevant if we support
1305-
* record segmentation using MSG_EOR (see also recvmsg()) */
1306-
if (sk->sk_type == SOCK_STREAM &&
1307-
skb->truesize >= sk->sk_rcvbuf / 4) {
1308-
rc = iucv_fragment_skb(sk, skb, len);
1309-
kfree_skb(skb);
1310-
skb = NULL;
1311-
if (rc) {
1312-
pr_iucv->path_sever(path, NULL);
1313-
return;
1314-
}
1315-
skb = skb_dequeue(&iucv_sk(sk)->backlog_skb_q);
1316-
} else {
1317-
skb_reset_transport_header(skb);
1318-
skb_reset_network_header(skb);
1319-
skb->len = len;
1320-
}
1265+
skb_reset_transport_header(skb);
1266+
skb_reset_network_header(skb);
1267+
skb->len = len;
13211268
}
13221269

13231270
IUCV_SKB_CB(skb)->offset = 0;

0 commit comments

Comments
 (0)