diff options
| author | Sudip Mukherjee <sudipm.mukherjee@gmail.com> | 2015-10-13 13:06:24 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-10-18 00:42:29 -0400 |
| commit | a2a47d00c08e2306185945dabaafd11447641077 (patch) | |
| tree | 914dd706efe4ebe52972b5a6a52e6d88c4d2119d /drivers/misc | |
| parent | 82ff3ac7641a645b55f3bee4acceabf6f17e62f4 (diff) | |
misc: mic: fix memory leak
In scif_node_connect() we were returning if the initialization of p2p_ji
fails. But at that time p2p_ij has already been initialized and
resources allocated for it. And since p2p_ij is not added to the list
till now so we will have a leak.
Lets deinitialize and release the resources connected to p2p_ij.
Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org>
Reviewed-by: Sudeep Dutt <sudeep.dutt@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc')
| -rw-r--r-- | drivers/misc/mic/scif/scif_nodeqp.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/misc/mic/scif/scif_nodeqp.c b/drivers/misc/mic/scif/scif_nodeqp.c index 7180d566c74b..c66ca1a5814e 100644 --- a/drivers/misc/mic/scif/scif_nodeqp.c +++ b/drivers/misc/mic/scif/scif_nodeqp.c | |||
| @@ -435,6 +435,21 @@ free_p2p: | |||
| 435 | return NULL; | 435 | return NULL; |
| 436 | } | 436 | } |
| 437 | 437 | ||
| 438 | /* Uninitialize and release resources from a p2p mapping */ | ||
| 439 | static void scif_deinit_p2p_info(struct scif_dev *scifdev, | ||
| 440 | struct scif_p2p_info *p2p) | ||
| 441 | { | ||
| 442 | struct scif_hw_dev *sdev = scifdev->sdev; | ||
| 443 | |||
| 444 | dma_unmap_sg(&sdev->dev, p2p->ppi_sg[SCIF_PPI_MMIO], | ||
| 445 | p2p->sg_nentries[SCIF_PPI_MMIO], DMA_BIDIRECTIONAL); | ||
| 446 | dma_unmap_sg(&sdev->dev, p2p->ppi_sg[SCIF_PPI_APER], | ||
| 447 | p2p->sg_nentries[SCIF_PPI_APER], DMA_BIDIRECTIONAL); | ||
| 448 | scif_p2p_freesg(p2p->ppi_sg[SCIF_PPI_MMIO]); | ||
| 449 | scif_p2p_freesg(p2p->ppi_sg[SCIF_PPI_APER]); | ||
| 450 | kfree(p2p); | ||
| 451 | } | ||
| 452 | |||
| 438 | /** | 453 | /** |
| 439 | * scif_node_connect: Respond to SCIF_NODE_CONNECT interrupt message | 454 | * scif_node_connect: Respond to SCIF_NODE_CONNECT interrupt message |
| 440 | * @dst: Destination node | 455 | * @dst: Destination node |
| @@ -477,8 +492,10 @@ static void scif_node_connect(struct scif_dev *scifdev, int dst) | |||
| 477 | if (!p2p_ij) | 492 | if (!p2p_ij) |
| 478 | return; | 493 | return; |
| 479 | p2p_ji = scif_init_p2p_info(dev_j, dev_i); | 494 | p2p_ji = scif_init_p2p_info(dev_j, dev_i); |
| 480 | if (!p2p_ji) | 495 | if (!p2p_ji) { |
| 496 | scif_deinit_p2p_info(dev_i, p2p_ij); | ||
| 481 | return; | 497 | return; |
| 498 | } | ||
| 482 | list_add_tail(&p2p_ij->ppi_list, &dev_i->p2p); | 499 | list_add_tail(&p2p_ij->ppi_list, &dev_i->p2p); |
| 483 | list_add_tail(&p2p_ji->ppi_list, &dev_j->p2p); | 500 | list_add_tail(&p2p_ji->ppi_list, &dev_j->p2p); |
| 484 | 501 | ||
