LINUX.ORG.RU

Загрузка стопорится на register_framebuffer()


0

1

Добрый день,

Имеется плата с АРМом, к ней по SPI подключен LCD. При включенном CONFIG_FRAMEBUFFER_CONSOLE загрузка стопорится при вызове функции register_framebuffer(), которая, в свою очередь, виснет на console_lock(). При отключенном CONFIG_FRAMEBUFFER_CONSOLE всё работает нормально. Подскажите, куда копать? Ядро 3.10.0.


Ответ на: комментарий от slapin

На весь драйвер ЛОР ругается, что большой,

static int __init dogxl160fb_probe (struct spi_device *spi)
{
	int chip = spi_get_device_id(spi)->driver_data; 
	struct dogxl160fb_platform_data *pdata = spi->dev.platform_data; 
	int vmem_size_in = WIDTH * HEIGHT * BPP_INPUT/8;  
	int vmem_size_out = WIDTH * HEIGHT * BPP_OUTPUT/8;  
	u8 *vmem; 
	struct fb_info *info;  
	struct dogxl160fb_par *par;
/*	struct dogxl160fb_configuration *driver_configuration; */
	int retval = -ENOMEM;

	printk(KERN_INFO "%s: enter dogxl160fb_probe (struct spi_device *spi) \n",DRVNAME );

	if (chip != DOGXL160_DISPLAY) 
	{
		pr_err("%s: only the %s device is supported\n", DRVNAME, to_spi_driver(spi->dev.driver)->id_table->name);
		return -EINVAL;
	}

	printk(KERN_INFO "%s: valloc vmem_size=%d \n",DRVNAME , vmem_size_in);
	vmem = vzalloc(vmem_size_in);  
	if (!vmem) return retval; 

	info = framebuffer_alloc(sizeof(struct dogxl160fb_par), &spi->dev);
	if (!info) goto fballoc_fail;

	info->screen_base = (u8 __force __iomem *)vmem;
	info->fbops = &dogxl160fb_ops;
	info->fix = dogxl160fb_fix;
	info->fix.smem_len = vmem_size_in;
	info->var = dogxl160fb_var;

	/* Choose any packed pixel format as long as it's RGB565 */
	info->var.red.offset = 11;
	info->var.red.length = 5;
	info->var.green.offset = 5;
	info->var.green.length = 6;
	info->var.blue.offset = 0;
	info->var.blue.length = 5;
	info->var.transp.offset = 0;
	info->var.transp.length = 0; 
	#if 0
	info->flags = FBINFO_FLAG_DEFAULT | FBINFO_VIRTFB; 
	#else
	info->flags = FBINFO_FLAG_DEFAULT;  // AlexM
	#endif
	info->fbdefio = &dogxl160fb_defio;
	printk(KERN_INFO "%s:fb_deferred_io_init(info); \n", DRVNAME );
	fb_deferred_io_init(info);

	printk(KERN_INFO "%s: par = info->par;\n", DRVNAME);
	par = info->par;
	par->info = info;
	par->spi = spi;
	printk(KERN_INFO "%s: pdata->rst_gpio, pdata=%p\n", DRVNAME, pdata);
	par->rst = 65;                                     /* ARRRGGG WORKAROUND ! pdata->rst_gpio; if driver is second time loaded */ 
	printk(KERN_INFO "%s: pdata->dc_gpio\n", DRVNAME ); /* this reference created in device_to_bus is gone since it is not initialized again */ 
	par->dc =  66;                                      /* FIXME ! pdata->dc_gpio;  */

/*	driver_configuration = kmalloc(sizeof(struct dogxl160fb_configuration),GFP_KERNEL);  
	if (!driver_configuration) goto configalloc_fail;  */
/*	pdata->driver_configuration = driver_configuration; */

	vmem = kmalloc(vmem_size_out, GFP_KERNEL); 
	if (!vmem) goto ssbufalloc_fail;
	par->ssbuf = vmem;

	printk(KERN_INFO"%s: register_framebuffer()\n", DRVNAME);
	retval = register_framebuffer(info);
	if (retval < 0) goto fbreg_fail;

	printk(KERN_INFO"%s: spi_set_drvdata()\n", DRVNAME);
	spi_set_drvdata(spi, info);

	retval = dogxl160fb_init_display(par);
	if (retval < 0) goto init_fail;
	printk(KERN_INFO"%s: fb%d: %s frame buffer device, using %d KiB of video memory\n",DRVNAME, info->node, info->fix.id, vmem_size_in);

	dogxl160fb_setupSysFS(info->dev, &dogxl160fb_driver_configuration);

	printk(KERN_INFO "%s: spi probe end\n", DRVNAME );
	return 0;

	/* TODO: release gpios on fail */
init_fail: 
	//printk(KERN_ALERT "%s: probe init_fail\n", DRVNAME);
	printk(KERN_INFO "%s: probe init_fail\n", DRVNAME);
	spi_set_drvdata(spi, NULL); 
fbreg_fail: 
	//printk(KERN_ALERT "%s: probe fbreg_fail\n", DRVNAME);
	printk(KERN_INFO "%s: probe fbreg_fail\n", DRVNAME);
	framebuffer_release(info);  

ssbufalloc_fail: 
	printk(KERN_ALERT "%s: probe ssbuf alloc fail\n", DRVNAME);
	kfree(par->ssbuf); 
/*
configalloc_fail: 
	printk(KERN_ALERT "%s: probe config  alloc fail\n", DRVNAME);
	kfree(driver_configuration); */
fballoc_fail: 
	printk(KERN_ALERT "%s: probe fballoc_fail\n", DRVNAME);
	vfree(vmem);   /* FIXME - need to check whic memory needs to be freed */
	return retval; 
}

alexvm
() автор топика
Ответ на: комментарий от alexvm

А. Включи отладку локов и кидай дамп от register_framebuffer вместе с бактрейсом. Есть подозрение, что это то, что пофиксили в октябре. Пьян был, не помню сейчас подробностей.

slapin ★★★★★
()
Ответ на: комментарий от slapin

Включил отладку локов, но она ничего не выводит - только мои принты.

[    2.754889] dogxl160fb: --------- init BUILD Dec 25 2013, 14:18:45 -----------
[    2.762317] dogxl160fb: adding device to bus
[    2.766538] dogxl160fb: buff=spi1.0
[    2.770077] dogxl160fb: ACTUAL PDATA reference=c084cf84
[    2.775219] dogxl160fb: device already configured, reusing it (carefull it might be changed during devleopment)
[    2.785541] dogxl160fb: configure again
[    2.789375] dogxl160fb: add_dogxl160fb_device_to_bus(void) status=0
[    2.795919] dogxl160fb: enter dogxl160fb_probe (struct spi_device *spi) 
[    2.802646] dogxl160fb: valloc vmem_size=33280 
[    2.807181] dogxl160fb:fb_deferred_io_init(info); 
[    2.811973] dogxl160fb: par = info->par;
[    2.815825] dogxl160fb: pdata->rst_gpio, pdata=  (null)
[    2.821115] dogxl160fb: pdata->dc_gpio
[    2.824783] dogxl160fb: register_framebuffer()
[    2.828783] usb 1-1: new low-speed USB device number 2 using xusbps-ehci
[    2.836543] >>> register_framebuffer() 
[    2.840543] >>> do_register_framebuffer()
[    2.844543] >>> do_remove_conflicting_framebuffers()
[    2.849501] >>> num_registered_fb = 1
[    2.853077] >>> mutex_init()
[    2.858496] >>> console_lock()

alexvm
() автор топика
Ответ на: комментарий от alexvm

конфиг ядра

#
# Kernel hacking
#
CONFIG_PRINTK_TIME=y
CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4
# CONFIG_ENABLE_WARN_DEPRECATED is not set
# CONFIG_ENABLE_MUST_CHECK is not set
CONFIG_FRAME_WARN=1024
# CONFIG_MAGIC_SYSRQ is not set
# CONFIG_STRIP_ASM_SYMS is not set
# CONFIG_READABLE_ASM is not set
# CONFIG_UNUSED_SYMBOLS is not set
CONFIG_DEBUG_FS=y
# CONFIG_HEADERS_CHECK is not set
# CONFIG_DEBUG_SECTION_MISMATCH is not set
CONFIG_DEBUG_KERNEL=y
# CONFIG_DEBUG_SHIRQ is not set
CONFIG_LOCKUP_DETECTOR=y
# CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
# CONFIG_PANIC_ON_OOPS is not set
CONFIG_PANIC_ON_OOPS_VALUE=0
CONFIG_DETECT_HUNG_TASK=y
CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=120
# CONFIG_BOOTPARAM_HUNG_TASK_PANIC is not set
CONFIG_BOOTPARAM_HUNG_TASK_PANIC_VALUE=0
CONFIG_SCHED_DEBUG=y
# CONFIG_SCHEDSTATS is not set
# CONFIG_TIMER_STATS is not set
CONFIG_DEBUG_OBJECTS=y
# CONFIG_DEBUG_OBJECTS_SELFTEST is not set
# CONFIG_DEBUG_OBJECTS_FREE is not set
CONFIG_DEBUG_OBJECTS_TIMERS=y
# CONFIG_DEBUG_OBJECTS_WORK is not set
# CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set
# CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER is not set
CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
# CONFIG_DEBUG_SLAB is not set
CONFIG_HAVE_DEBUG_KMEMLEAK=y
# CONFIG_DEBUG_KMEMLEAK is not set
# CONFIG_DEBUG_PREEMPT is not set
# CONFIG_DEBUG_RT_MUTEXES is not set
# CONFIG_RT_MUTEX_TESTER is not set
CONFIG_DEBUG_SPINLOCK=y
CONFIG_DEBUG_MUTEXES=y
CONFIG_DEBUG_LOCK_ALLOC=y
CONFIG_PROVE_LOCKING=y
CONFIG_LOCKDEP=y
CONFIG_LOCK_STAT=y
CONFIG_DEBUG_LOCKDEP=y
CONFIG_TRACE_IRQFLAGS=y
# CONFIG_DEBUG_ATOMIC_SLEEP is not set
CONFIG_DEBUG_LOCKING_API_SELFTESTS=y
CONFIG_STACKTRACE=y
# CONFIG_DEBUG_STACK_USAGE is not set
CONFIG_DEBUG_KOBJECT=y
CONFIG_DEBUG_HIGHMEM=y
# CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y
# CONFIG_DEBUG_INFO_REDUCED is not set
CONFIG_DEBUG_VM=y
# CONFIG_DEBUG_VM_RB is not set
# CONFIG_DEBUG_WRITECOUNT is not set
# CONFIG_DEBUG_MEMORY_INIT is not set
# CONFIG_DEBUG_LIST is not set
# CONFIG_TEST_LIST_SORT is not set
# CONFIG_DEBUG_SG is not set
CONFIG_DEBUG_NOTIFIERS=y
# CONFIG_DEBUG_CREDENTIALS is not set
CONFIG_FRAME_POINTER=y
# CONFIG_BOOT_PRINTK_DELAY is not set

alexvm
() автор топика
Ответ на: комментарий от alexvm

Короче, там были в этом районе баги, и их фиксили в октябре, глянь или в LKML или в git, ща не могу поглядеть, сегодня позже гляну или уже завтра. Там порядок локов был кривой. Оставшиеся сообщения выдерни из буфера в памяти, скорее всего оно просто не успевает их вывести. Ну и DEBUG_LL в таких ситуациях помогает (когда __init в кишках ядра дохнут). А, еще попробуй его того, модулем - возможно отладка будет получше.

slapin ★★★★★
()
Ответ на: комментарий от slapin

Попробуй вот этот коммит черри-пикнуть, но лучше еще погугли вокруг него:

commit 3a41c5dbe8bc396a7fb16ca8739e945bb003342e
Author: Gu Zheng <guz.fnst@cn.fujitsu.com>
Date:   Tue Nov 5 18:00:57 2013 +0800

    fb: reorder the lock sequence to fix potential dead lock
    
    Following commits:
    
    50e244cc79 fb: rework locking to fix lock ordering on takeover
    e93a9a8687 fb: Yet another band-aid for fixing lockdep mess
    054430e773 fbcon: fix locking harder
    
    reworked locking to fix related lock ordering on takeover, and introduced console_lock
    into fbmem, but it seems that the new lock sequence(fb_info->lock ---> console_lock)
    is against with the one in console_callback(console_lock ---> fb_info->lock), and leads to
    a potential dead lock as following:

slapin ★★★★★
()
Последнее исправление: slapin (всего исправлений: 1)
Ответ на: комментарий от alexvm

Ну тады ищи где у тебя дедлок нарисовался

slapin ★★★★★
()
Ответ на: комментарий от slapin

Пока не очень, если честно. Смущает, что с выключенной CONFIG_FRAMEBUFFER_CONSOLE все работает. Да, и встроенная в ядро проверка дедлоков говорит, что всё ок. Сейчас читаю, как их ещё можно отловить...

alexvm
() автор топика
Ответ на: комментарий от slapin

Попробовал ядро 3.12.6 - та же проблема.

alexvm
() автор топика
Ответ на: комментарий от slapin

Промежуточный игот - клинит на вызове ф-ции do_bind_con_driver()

[   15.243507] >>>  bind_con_driver()
[   15.246954] >>>> console_lock()
[   15.250234] >>>> down() 
Segmentation fault

Дело совсем не в функции register_framebuffer().

alexvm
() автор топика
Ответ на: комментарий от alexvm

Где-то получается двойной вызов console_lock() Надо найти виноватых. Кстати, дохнет оно в семафоре.

slapin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.