[ppc] Fix kernel panic when using BOOTP_NFSROOT
On PowerPC (and possibly other architectures), that doesn't use EARLY_AP_STARTUP, the config task queue may be used initialized. This was observed while trying to mount the root fs from NFS, as reported here: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230168. This patch has 2 main changes: 1- Perform a basic initialization of qgroup_config, similar to what is done in taskqgroup_adjust, but simpler. This makes qgroup_config ready to be used during NFS root mount. 2- When EARLY_AP_STARTUP is not used, call inm_init() and in6m_init() right before SI_SUB_ROOT_CONF, because bootp needs to send multicast packages to request an IP. PR: Bug 230168 Reported by: sbruno Reviewed by: jhibbits, mmacy, sbruno Approved by: jhibbits Differential Revision: D16633
This commit is contained in:
parent
b8314a3b24
commit
2f30606f2f
@ -857,6 +857,24 @@ taskqgroup_bind(struct taskqgroup *qgroup)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
taskqgroup_config_init(void *arg)
|
||||
{
|
||||
struct taskqgroup *qgroup = qgroup_config;
|
||||
LIST_HEAD(, grouptask) gtask_head = LIST_HEAD_INITIALIZER(NULL);
|
||||
|
||||
LIST_SWAP(>ask_head, &qgroup->tqg_queue[0].tgc_tasks,
|
||||
grouptask, gt_list);
|
||||
qgroup->tqg_queue[0].tgc_cnt = 0;
|
||||
taskqgroup_cpu_create(qgroup, 0, 0);
|
||||
|
||||
qgroup->tqg_cnt = 1;
|
||||
qgroup->tqg_stride = 1;
|
||||
}
|
||||
|
||||
SYSINIT(taskqgroup_config_init, SI_SUB_TASKQ, SI_ORDER_SECOND,
|
||||
taskqgroup_config_init, NULL);
|
||||
|
||||
static int
|
||||
_taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride)
|
||||
{
|
||||
|
@ -231,8 +231,13 @@ static void inm_init(void)
|
||||
taskqgroup_config_gtask_init(NULL, &free_gtask, inm_release_task, "inm release task");
|
||||
}
|
||||
|
||||
#ifdef EARLY_AP_STARTUP
|
||||
SYSINIT(inm_init, SI_SUB_SMP + 1, SI_ORDER_FIRST,
|
||||
inm_init, NULL);
|
||||
#else
|
||||
SYSINIT(inm_init, SI_SUB_ROOT_CONF - 1, SI_ORDER_FIRST,
|
||||
inm_init, NULL);
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
|
@ -562,8 +562,13 @@ static void in6m_init(void)
|
||||
taskqgroup_config_gtask_init(NULL, &free_gtask, in6m_release_task, "in6m release task");
|
||||
}
|
||||
|
||||
#ifdef EARLY_AP_STARTUP
|
||||
SYSINIT(in6m_init, SI_SUB_SMP + 1, SI_ORDER_FIRST,
|
||||
in6m_init, NULL);
|
||||
#else
|
||||
SYSINIT(in6m_init, SI_SUB_ROOT_CONF - 1, SI_ORDER_SECOND,
|
||||
in6m_init, NULL);
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user