@@ -1491,16 +1491,50 @@ static __init void boot_init_possible_blades(struct uv_hub_info_s *hub_info)
1491
1491
pr_info ("UV: number nodes/possible blades %d\n" , uv_pb );
1492
1492
}
1493
1493
1494
+ static int __init alloc_conv_table (int num_elem , unsigned short * * table )
1495
+ {
1496
+ int i ;
1497
+ size_t bytes ;
1498
+
1499
+ bytes = num_elem * sizeof (* table [0 ]);
1500
+ * table = kmalloc (bytes , GFP_KERNEL );
1501
+ if (WARN_ON_ONCE (!* table ))
1502
+ return - ENOMEM ;
1503
+ for (i = 0 ; i < num_elem ; i ++ )
1504
+ ((unsigned short * )* table )[i ] = SOCK_EMPTY ;
1505
+ return 0 ;
1506
+ }
1507
+
1508
+ /* Remove conversion table if it's 1:1 */
1509
+ #define FREE_1_TO_1_TABLE (tbl , min , max , max2 ) free_1_to_1_table(&tbl, #tbl, min, max, max2)
1510
+
1511
+ static void __init free_1_to_1_table (unsigned short * * tp , char * tname , int min , int max , int max2 )
1512
+ {
1513
+ int i ;
1514
+ unsigned short * table = * tp ;
1515
+
1516
+ if (table == NULL )
1517
+ return ;
1518
+ if (max != max2 )
1519
+ return ;
1520
+ for (i = 0 ; i < max ; i ++ ) {
1521
+ if (i != table [i ])
1522
+ return ;
1523
+ }
1524
+ kfree (table );
1525
+ * tp = NULL ;
1526
+ pr_info ("UV: %s is 1:1, conversion table removed\n" , tname );
1527
+ }
1528
+
1494
1529
static void __init build_socket_tables (void )
1495
1530
{
1496
1531
struct uv_gam_range_entry * gre = uv_gre_table ;
1497
- int num , nump ;
1532
+ int nums , numn , nump ;
1498
1533
int cpu , i , lnid ;
1499
1534
int minsock = _min_socket ;
1500
1535
int maxsock = _max_socket ;
1501
1536
int minpnode = _min_pnode ;
1502
1537
int maxpnode = _max_pnode ;
1503
- size_t bytes ;
1504
1538
1505
1539
if (!gre ) {
1506
1540
if (is_uv2_hub () || is_uv3_hub ()) {
@@ -1511,22 +1545,20 @@ static void __init build_socket_tables(void)
1511
1545
BUG ();
1512
1546
}
1513
1547
1514
- /* Build socket id -> node id, pnode */
1515
- num = maxsock - minsock + 1 ;
1516
- bytes = num * sizeof (_socket_to_node [0 ]);
1517
- _socket_to_node = kmalloc (bytes , GFP_KERNEL );
1518
- _socket_to_pnode = kmalloc (bytes , GFP_KERNEL );
1519
-
1548
+ numn = num_possible_nodes ();
1520
1549
nump = maxpnode - minpnode + 1 ;
1521
- bytes = nump * sizeof (_pnode_to_socket [0 ]);
1522
- _pnode_to_socket = kmalloc (bytes , GFP_KERNEL );
1523
- BUG_ON (!_socket_to_node || !_socket_to_pnode || !_pnode_to_socket );
1524
-
1525
- for (i = 0 ; i < num ; i ++ )
1526
- _socket_to_node [i ] = _socket_to_pnode [i ] = SOCK_EMPTY ;
1527
-
1528
- for (i = 0 ; i < nump ; i ++ )
1529
- _pnode_to_socket [i ] = SOCK_EMPTY ;
1550
+ nums = maxsock - minsock + 1 ;
1551
+
1552
+ /* Allocate and clear tables */
1553
+ if ((alloc_conv_table (nump , & _pnode_to_socket ) < 0 )
1554
+ || (alloc_conv_table (nums , & _socket_to_pnode ) < 0 )
1555
+ || (alloc_conv_table (numn , & _node_to_pnode ) < 0 )
1556
+ || (alloc_conv_table (nums , & _socket_to_node ) < 0 )) {
1557
+ kfree (_pnode_to_socket );
1558
+ kfree (_socket_to_pnode );
1559
+ kfree (_node_to_pnode );
1560
+ return ;
1561
+ }
1530
1562
1531
1563
/* Fill in pnode/node/addr conversion list values: */
1532
1564
pr_info ("UV: GAM Building socket/pnode conversion tables\n" );
@@ -1565,10 +1597,6 @@ static void __init build_socket_tables(void)
1565
1597
}
1566
1598
1567
1599
/* Set up physical blade to pnode translation from GAM Range Table: */
1568
- bytes = num_possible_nodes () * sizeof (_node_to_pnode [0 ]);
1569
- _node_to_pnode = kmalloc (bytes , GFP_KERNEL );
1570
- BUG_ON (!_node_to_pnode );
1571
-
1572
1600
for (lnid = 0 ; lnid < num_possible_nodes (); lnid ++ ) {
1573
1601
unsigned short sockid ;
1574
1602
@@ -1585,31 +1613,12 @@ static void __init build_socket_tables(void)
1585
1613
}
1586
1614
1587
1615
/*
1588
- * If socket id == pnode or socket id == node for all nodes ,
1616
+ * If e.g. socket id == pnode for all pnodes ,
1589
1617
* system runs faster by removing corresponding conversion table.
1590
1618
*/
1591
- pr_info ("UV: Checking socket->node/pnode for identity maps\n" );
1592
- if (minsock == 0 ) {
1593
- for (i = 0 ; i < num ; i ++ )
1594
- if (_socket_to_node [i ] == SOCK_EMPTY || i != _socket_to_node [i ])
1595
- break ;
1596
- if (i >= num ) {
1597
- kfree (_socket_to_node );
1598
- _socket_to_node = NULL ;
1599
- pr_info ("UV: 1:1 socket_to_node table removed\n" );
1600
- }
1601
- }
1602
- if (minsock == minpnode ) {
1603
- for (i = 0 ; i < num ; i ++ )
1604
- if (_socket_to_pnode [i ] != SOCK_EMPTY &&
1605
- _socket_to_pnode [i ] != i + minpnode )
1606
- break ;
1607
- if (i >= num ) {
1608
- kfree (_socket_to_pnode );
1609
- _socket_to_pnode = NULL ;
1610
- pr_info ("UV: 1:1 socket_to_pnode table removed\n" );
1611
- }
1612
- }
1619
+ FREE_1_TO_1_TABLE (_socket_to_node , _min_socket , nums , numn );
1620
+ FREE_1_TO_1_TABLE (_socket_to_pnode , _min_pnode , nums , nump );
1621
+ FREE_1_TO_1_TABLE (_pnode_to_socket , _min_pnode , nums , nump );
1613
1622
}
1614
1623
1615
1624
/* Check which reboot to use */
0 commit comments