Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xen-netfront: update num_queues to real created

Sometimes xennet_create_queues() may failed to created all requested
queues, we need to update num_queues to real created to avoid NULL
pointer dereference.

Signed-off-by: Joe Jin <joe.jin@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Wei Liu <wei.liu2@citrix.com>
Cc: Ian Campbell <ian.campbell@citrix.com>
Cc: David S. Miller <davem@davemloft.net>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Joe Jin and committed by
David S. Miller
ca88ea12 f6a835bb

+7 -7
+7 -7
drivers/net/xen-netfront.c
··· 1706 1706 } 1707 1707 1708 1708 static int xennet_create_queues(struct netfront_info *info, 1709 - unsigned int num_queues) 1709 + unsigned int *num_queues) 1710 1710 { 1711 1711 unsigned int i; 1712 1712 int ret; 1713 1713 1714 - info->queues = kcalloc(num_queues, sizeof(struct netfront_queue), 1714 + info->queues = kcalloc(*num_queues, sizeof(struct netfront_queue), 1715 1715 GFP_KERNEL); 1716 1716 if (!info->queues) 1717 1717 return -ENOMEM; 1718 1718 1719 1719 rtnl_lock(); 1720 1720 1721 - for (i = 0; i < num_queues; i++) { 1721 + for (i = 0; i < *num_queues; i++) { 1722 1722 struct netfront_queue *queue = &info->queues[i]; 1723 1723 1724 1724 queue->id = i; ··· 1728 1728 if (ret < 0) { 1729 1729 dev_warn(&info->netdev->dev, 1730 1730 "only created %d queues\n", i); 1731 - num_queues = i; 1731 + *num_queues = i; 1732 1732 break; 1733 1733 } 1734 1734 ··· 1738 1738 napi_enable(&queue->napi); 1739 1739 } 1740 1740 1741 - netif_set_real_num_tx_queues(info->netdev, num_queues); 1741 + netif_set_real_num_tx_queues(info->netdev, *num_queues); 1742 1742 1743 1743 rtnl_unlock(); 1744 1744 1745 - if (num_queues == 0) { 1745 + if (*num_queues == 0) { 1746 1746 dev_err(&info->netdev->dev, "no queues\n"); 1747 1747 return -EINVAL; 1748 1748 } ··· 1788 1788 if (info->queues) 1789 1789 xennet_destroy_queues(info); 1790 1790 1791 - err = xennet_create_queues(info, num_queues); 1791 + err = xennet_create_queues(info, &num_queues); 1792 1792 if (err < 0) 1793 1793 goto destroy_ring; 1794 1794