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

staging: vc04_services: Move global variables tracking allocated pages

The variables tracking allocated pages fragments in vchiq_arm.c
can be easily moved to struct vchiq_drv_mgmt instead of being global.
This helps us to drop the non-essential global variables in the vchiq
interface.

No functional changes intended in this patch.

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20240412075743.60712-7-umang.jain@ideasonboard.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Umang Jain and committed by
Greg Kroah-Hartman
39fbff9d f875976e

+30 -29
+24 -29
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
··· 130 130 }; 131 131 132 132 static void __iomem *g_regs; 133 - static unsigned int g_fragments_size; 134 - static char *g_fragments_base; 135 - static char *g_free_fragments; 136 - static struct semaphore g_free_fragments_sema; 137 - 138 - static DEFINE_SEMAPHORE(g_free_fragments_mutex, 1); 139 133 140 134 static int 141 135 vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *data, ··· 408 414 (drv_mgmt->info->cache_line_size - 1)))) { 409 415 char *fragments; 410 416 411 - if (down_interruptible(&g_free_fragments_sema)) { 417 + if (down_interruptible(&drv_mgmt->free_fragments_sema)) { 412 418 cleanup_pagelistinfo(instance, pagelistinfo); 413 419 return NULL; 414 420 } 415 421 416 - WARN_ON(!g_free_fragments); 422 + WARN_ON(!drv_mgmt->free_fragments); 417 423 418 - down(&g_free_fragments_mutex); 419 - fragments = g_free_fragments; 424 + down(&drv_mgmt->free_fragments_mutex); 425 + fragments = drv_mgmt->free_fragments; 420 426 WARN_ON(!fragments); 421 - g_free_fragments = *(char **)g_free_fragments; 422 - up(&g_free_fragments_mutex); 427 + drv_mgmt->free_fragments = *(char **)drv_mgmt->free_fragments; 428 + up(&drv_mgmt->free_fragments_mutex); 423 429 pagelist->type = PAGELIST_READ_WITH_FRAGMENTS + 424 - (fragments - g_fragments_base) / g_fragments_size; 430 + (fragments - drv_mgmt->fragments_base) / drv_mgmt->fragments_size; 425 431 } 426 432 427 433 return pagelistinfo; ··· 449 455 pagelistinfo->scatterlist_mapped = 0; 450 456 451 457 /* Deal with any partial cache lines (fragments) */ 452 - if (pagelist->type >= PAGELIST_READ_WITH_FRAGMENTS && g_fragments_base) { 453 - char *fragments = g_fragments_base + 458 + if (pagelist->type >= PAGELIST_READ_WITH_FRAGMENTS && drv_mgmt->fragments_base) { 459 + char *fragments = drv_mgmt->fragments_base + 454 460 (pagelist->type - PAGELIST_READ_WITH_FRAGMENTS) * 455 - g_fragments_size; 461 + drv_mgmt->fragments_size; 456 462 int head_bytes, tail_bytes; 457 463 458 464 head_bytes = (drv_mgmt->info->cache_line_size - pagelist->offset) & ··· 477 483 fragments + drv_mgmt->info->cache_line_size, 478 484 tail_bytes); 479 485 480 - down(&g_free_fragments_mutex); 481 - *(char **)fragments = g_free_fragments; 482 - g_free_fragments = fragments; 483 - up(&g_free_fragments_mutex); 484 - up(&g_free_fragments_sema); 486 + down(&drv_mgmt->free_fragments_mutex); 487 + *(char **)fragments = drv_mgmt->free_fragments; 488 + drv_mgmt->free_fragments = fragments; 489 + up(&drv_mgmt->free_fragments_mutex); 490 + up(&drv_mgmt->free_fragments_sema); 485 491 } 486 492 487 493 /* Need to mark all the pages dirty. */ ··· 517 523 if (err < 0) 518 524 return err; 519 525 520 - g_fragments_size = 2 * drv_mgmt->info->cache_line_size; 526 + drv_mgmt->fragments_size = 2 * drv_mgmt->info->cache_line_size; 521 527 522 528 /* Allocate space for the channels in coherent memory */ 523 529 slot_mem_size = PAGE_ALIGN(TOTAL_SLOTS * VCHIQ_SLOT_SIZE); 524 - frag_mem_size = PAGE_ALIGN(g_fragments_size * MAX_FRAGMENTS); 530 + frag_mem_size = PAGE_ALIGN(drv_mgmt->fragments_size * MAX_FRAGMENTS); 525 531 526 532 slot_mem = dmam_alloc_coherent(dev, slot_mem_size + frag_mem_size, 527 533 &slot_phys, GFP_KERNEL); ··· 541 547 vchiq_slot_zero->platform_data[VCHIQ_PLATFORM_FRAGMENTS_COUNT_IDX] = 542 548 MAX_FRAGMENTS; 543 549 544 - g_fragments_base = (char *)slot_mem + slot_mem_size; 550 + drv_mgmt->fragments_base = (char *)slot_mem + slot_mem_size; 545 551 546 - g_free_fragments = g_fragments_base; 552 + drv_mgmt->free_fragments = drv_mgmt->fragments_base; 547 553 for (i = 0; i < (MAX_FRAGMENTS - 1); i++) { 548 - *(char **)&g_fragments_base[i * g_fragments_size] = 549 - &g_fragments_base[(i + 1) * g_fragments_size]; 554 + *(char **)&drv_mgmt->fragments_base[i * drv_mgmt->fragments_size] = 555 + &drv_mgmt->fragments_base[(i + 1) * drv_mgmt->fragments_size]; 550 556 } 551 - *(char **)&g_fragments_base[i * g_fragments_size] = NULL; 552 - sema_init(&g_free_fragments_sema, MAX_FRAGMENTS); 557 + *(char **)&drv_mgmt->fragments_base[i * drv_mgmt->fragments_size] = NULL; 558 + sema_init(&drv_mgmt->free_fragments_sema, MAX_FRAGMENTS); 559 + sema_init(&drv_mgmt->free_fragments_mutex, 1); 553 560 554 561 err = vchiq_init_state(state, vchiq_slot_zero, dev); 555 562 if (err)
+6
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.h
··· 44 44 struct mutex connected_mutex; 45 45 46 46 void (*deferred_callback[VCHIQ_DRV_MAX_CALLBACKS])(void); 47 + 48 + struct semaphore free_fragments_sema; 49 + struct semaphore free_fragments_mutex; 50 + char *fragments_base; 51 + char *free_fragments; 52 + unsigned int fragments_size; 47 53 }; 48 54 49 55 struct user_service {