diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2011-08-19 09:47:11 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-08-24 14:41:44 -0400 |
commit | e8753043f9fbabffbf087c7f4b514c50ef89541e (patch) | |
tree | 2c4b382a21500c228005a43e48134d39fdcccbe8 /net/nfc | |
parent | 4e0d8cc1006b889909a87f824943bad9a56358e8 (diff) |
NFC: Reserve tx head and tail room
We can have the NFC core layer allocating the tx head and tail
room for the drivers and avoid 1 or more SKBs copy on write on
the Tx path.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/nfc')
-rw-r--r-- | net/nfc/core.c | 6 | ||||
-rw-r--r-- | net/nfc/rawsock.c | 13 |
2 files changed, 11 insertions, 8 deletions
diff --git a/net/nfc/core.c b/net/nfc/core.c index b6fd4e1f2057..284e2f6a14ff 100644 --- a/net/nfc/core.c +++ b/net/nfc/core.c | |||
@@ -322,7 +322,9 @@ struct nfc_dev *nfc_get_device(unsigned idx) | |||
322 | * @supported_protocols: NFC protocols supported by the device | 322 | * @supported_protocols: NFC protocols supported by the device |
323 | */ | 323 | */ |
324 | struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops, | 324 | struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops, |
325 | u32 supported_protocols) | 325 | u32 supported_protocols, |
326 | int tx_headroom, | ||
327 | int tx_tailroom) | ||
326 | { | 328 | { |
327 | static atomic_t dev_no = ATOMIC_INIT(0); | 329 | static atomic_t dev_no = ATOMIC_INIT(0); |
328 | struct nfc_dev *dev; | 330 | struct nfc_dev *dev; |
@@ -345,6 +347,8 @@ struct nfc_dev *nfc_allocate_device(struct nfc_ops *ops, | |||
345 | 347 | ||
346 | dev->ops = ops; | 348 | dev->ops = ops; |
347 | dev->supported_protocols = supported_protocols; | 349 | dev->supported_protocols = supported_protocols; |
350 | dev->tx_headroom = tx_headroom; | ||
351 | dev->tx_tailroom = tx_tailroom; | ||
348 | 352 | ||
349 | spin_lock_init(&dev->targets_lock); | 353 | spin_lock_init(&dev->targets_lock); |
350 | nfc_genl_data_init(&dev->genl_data); | 354 | nfc_genl_data_init(&dev->genl_data); |
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index 52de84a55115..9fd652a51424 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
@@ -123,11 +123,7 @@ error: | |||
123 | 123 | ||
124 | static int rawsock_add_header(struct sk_buff *skb) | 124 | static int rawsock_add_header(struct sk_buff *skb) |
125 | { | 125 | { |
126 | 126 | *skb_push(skb, NFC_HEADER_SIZE) = 0; | |
127 | if (skb_cow_head(skb, 1)) | ||
128 | return -ENOMEM; | ||
129 | |||
130 | *skb_push(skb, 1) = 0; | ||
131 | 127 | ||
132 | return 0; | 128 | return 0; |
133 | } | 129 | } |
@@ -197,6 +193,7 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
197 | struct msghdr *msg, size_t len) | 193 | struct msghdr *msg, size_t len) |
198 | { | 194 | { |
199 | struct sock *sk = sock->sk; | 195 | struct sock *sk = sock->sk; |
196 | struct nfc_dev *dev = nfc_rawsock(sk)->dev; | ||
200 | struct sk_buff *skb; | 197 | struct sk_buff *skb; |
201 | int rc; | 198 | int rc; |
202 | 199 | ||
@@ -208,11 +205,13 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
208 | if (sock->state != SS_CONNECTED) | 205 | if (sock->state != SS_CONNECTED) |
209 | return -ENOTCONN; | 206 | return -ENOTCONN; |
210 | 207 | ||
211 | skb = sock_alloc_send_skb(sk, len, msg->msg_flags & MSG_DONTWAIT, | 208 | skb = sock_alloc_send_skb(sk, len + dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE, |
212 | &rc); | 209 | msg->msg_flags & MSG_DONTWAIT, &rc); |
213 | if (!skb) | 210 | if (!skb) |
214 | return rc; | 211 | return rc; |
215 | 212 | ||
213 | skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE); | ||
214 | |||
216 | rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); | 215 | rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); |
217 | if (rc < 0) { | 216 | if (rc < 0) { |
218 | kfree_skb(skb); | 217 | kfree_skb(skb); |