* [PATCH] rt2x00: Remove duplicate deinitialization
@ 2008-06-20 20:10 Ivo van Doorn
2008-06-20 21:48 ` Gertjan van Wingerde
0 siblings, 1 reply; 3+ messages in thread
From: Ivo van Doorn @ 2008-06-20 20:10 UTC (permalink / raw)
To: John W. Linville; +Cc: linux-wireless, rt2400-devel
When rt2x00queue_alloc_rxskbs() fails rt2x00queue_unitialize()
will be called which will free all rxskb. So we don't need
to do this in the rt2x00queue_alloc_rxskb() function as well.
rt2x00queue_free_skb() unmaps the DMA but doesn't clear the
allocation flag. Since the code is copied from rt2x00queue_unmap_skb()
anyway (and that function does clear the flag) we might as well
use that function directly.
Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
---
This patch depends on patches from the pull request of June 16
drivers/net/wireless/rt2x00/rt2x00queue.c | 20 ++------------------
1 files changed, 2 insertions(+), 18 deletions(-)
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 49d3bb8..8e86611 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -107,18 +107,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
{
- struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
-
- if (skbdesc->flags & SKBDESC_DMA_MAPPED_RX) {
- dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, skb->len,
- DMA_FROM_DEVICE);
- }
-
- if (skbdesc->flags & SKBDESC_DMA_MAPPED_TX) {
- dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, skb->len,
- DMA_TO_DEVICE);
- }
-
+ rt2x00queue_unmap_skb(rt2x00dev, skb);
dev_kfree_skb_any(skb);
}
@@ -509,16 +498,11 @@ static int rt2x00queue_alloc_rxskbs(struct rt2x00_dev *rt2x00dev,
for (i = 0; i < queue->limit; i++) {
skb = rt2x00queue_alloc_rxskb(rt2x00dev, &queue->entries[i]);
if (!skb)
- goto exit;
+ return -ENOMEM;
queue->entries[i].skb = skb;
}
return 0;
-
-exit:
- rt2x00queue_free_skbs(rt2x00dev, queue);
-
- return -ENOMEM;
}
int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)
--
1.5.5.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] rt2x00: Remove duplicate deinitialization
2008-06-20 20:10 [PATCH] rt2x00: Remove duplicate deinitialization Ivo van Doorn
@ 2008-06-20 21:48 ` Gertjan van Wingerde
2008-06-21 10:04 ` Ivo van Doorn
0 siblings, 1 reply; 3+ messages in thread
From: Gertjan van Wingerde @ 2008-06-20 21:48 UTC (permalink / raw)
To: Ivo van Doorn; +Cc: John W. Linville, linux-wireless, rt2400-devel
Hi Ivo,
Ivo van Doorn wrote:
> When rt2x00queue_alloc_rxskbs() fails rt2x00queue_unitialize()
> will be called which will free all rxskb. So we don't need
> to do this in the rt2x00queue_alloc_rxskb() function as well.
>
> rt2x00queue_free_skb() unmaps the DMA but doesn't clear the
> allocation flag. Since the code is copied from rt2x00queue_unmap_skb()
> anyway (and that function does clear the flag) we might as well
> use that function directly.
>
> Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com>
> ---
>
> This patch depends on patches from the pull request of June 16
>
> drivers/net/wireless/rt2x00/rt2x00queue.c | 20 ++------------------
> 1 files changed, 2 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
> index 49d3bb8..8e86611 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
> +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
> @@ -107,18 +107,7 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
>
> void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb)
> {
> - struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb);
> -
> - if (skbdesc->flags & SKBDESC_DMA_MAPPED_RX) {
> - dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, skb->len,
> - DMA_FROM_DEVICE);
> - }
> -
> - if (skbdesc->flags & SKBDESC_DMA_MAPPED_TX) {
> - dma_unmap_single(rt2x00dev->dev, skbdesc->skb_dma, skb->len,
> - DMA_TO_DEVICE);
> - }
> -
> + rt2x00queue_unmap_skb(rt2x00dev, skb);
> dev_kfree_skb_any(skb);
> }
>
> @@ -509,16 +498,11 @@ static int rt2x00queue_alloc_rxskbs(struct rt2x00_dev *rt2x00dev,
> for (i = 0; i < queue->limit; i++) {
> skb = rt2x00queue_alloc_rxskb(rt2x00dev, &queue->entries[i]);
> if (!skb)
> - goto exit;
> + return -ENOMEM;
> queue->entries[i].skb = skb;
> }
>
> return 0;
> -
> -exit:
> - rt2x00queue_free_skbs(rt2x00dev, queue);
> -
> - return -ENOMEM;
> }
>
> int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)
>
I find this last hunk of the patch a bit dubious. IMHO a function should
never rely on letting his caller do the right thing and clean up for it,
in case of failures; it should always clean up after itself. It is true
that in this case the caller will also attempt to clean up these
structures, but that doesn't mean that any potential future users of
such a function should be bothered with doing the same thing.
---
Gertjan
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] rt2x00: Remove duplicate deinitialization
2008-06-20 21:48 ` Gertjan van Wingerde
@ 2008-06-21 10:04 ` Ivo van Doorn
0 siblings, 0 replies; 3+ messages in thread
From: Ivo van Doorn @ 2008-06-21 10:04 UTC (permalink / raw)
To: Gertjan van Wingerde; +Cc: John W. Linville, linux-wireless, rt2400-devel
Hi
> > @@ -509,16 +498,11 @@ static int rt2x00queue_alloc_rxskbs(struct rt2x00_dev *rt2x00dev,
> > for (i = 0; i < queue->limit; i++) {
> > skb = rt2x00queue_alloc_rxskb(rt2x00dev, &queue->entries[i]);
> > if (!skb)
> > - goto exit;
> > + return -ENOMEM;
> > queue->entries[i].skb = skb;
> > }
> >
> > return 0;
> > -
> > -exit:
> > - rt2x00queue_free_skbs(rt2x00dev, queue);
> > -
> > - return -ENOMEM;
> > }
> >
> > int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev)
> >
>
>
> I find this last hunk of the patch a bit dubious. IMHO a function should
> never rely on letting his caller do the right thing and clean up for it,
> in case of failures; it should always clean up after itself. It is true
> that in this case the caller will also attempt to clean up these
> structures, but that doesn't mean that any potential future users of
> such a function should be bothered with doing the same thing.
True but rt2x00queue_alloc_rxskbs and rt2x00queue_free_rxskbs are only
called once. And there isn't any reason why they should be called anywhere
else other then initialize() and uninitialize().
And this approach is the same as other allocation/free paths like in rt2x00pci/usb
and rt2x00lib.
Ivo
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-06-21 9:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-20 20:10 [PATCH] rt2x00: Remove duplicate deinitialization Ivo van Doorn
2008-06-20 21:48 ` Gertjan van Wingerde
2008-06-21 10:04 ` Ivo van Doorn
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).