* [PATCH 0/5] Support negative number of CPUs
@ 2015-03-31 23:20 Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 1/5] cpu: Infrastructure for negative cpu handling Frederic Weisbecker
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Support for machines without any CPU at all was brought 3 years ago
by Paul (https://lkml.org/lkml/2012/3/31/131). The goal was to reduce
the complexity of programming on modern computing.
Now meeting the simplicity beyond that of sequential programming had a
cost: such hardware configuration found a user base but didn't meet much
success among HPC users.
So we have now a new challenge to solve: keep the beyond-sequential
programming simplicity while providing a highly parallel processing that
still scale.
This patchset proposes a solution. The support for negative number of
CPUs is able to help scale computing up to O(-NR_CPUS). The more you have
CPUs the higher you scale, to the point that software execution should
complete before you start writing that software (assuming you have around
-1024 CPUs). And programming gets even more simple because you have lesser
CPUs to handle.
Now keep in mind this patchset is only a draft. Not build tested and
I don't have the hardware yet.
Frederic Weisbecker (5):
cpu: Infrastructure for negative cpu handling
smp: IPI handling for negative CPU
cpumask: Basic negative number of CPUs handling
init: Support negative CPUs boot and halt code
x86: Support reverse execution
arch/x86/kernel/cpu/negative.c | 28 ++
arch/x86/kernel/head64.c | 4 +
arch/x86/kernel/reboot.c | 8 +
include/linux/cpumask.h | 48 +++
init/main.c | 7 +
kernel/cpu_neg.c | 791 +++++++++++++++++++++++++++++++++++++++++
kernel/smp.c | 38 +-
7 files changed, 920 insertions(+), 4 deletions(-)
create mode 100644 arch/x86/kernel/cpu/negative.c
create mode 100644 kernel/cpu_neg.c
--
2.1.4
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/5] cpu: Infrastructure for negative cpu handling
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
@ 2015-03-31 23:20 ` Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 2/5] smp: IPI handling for negative CPU Frederic Weisbecker
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Basic infrastructure to handle negative number of CPUs.
Code is mostly inspired by kernel/cpu.c
Not-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
kernel/cpu_neg.c | 791 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 791 insertions(+)
create mode 100644 kernel/cpu_neg.c
diff --git a/kernel/cpu_neg.c b/kernel/cpu_neg.c
new file mode 100644
index 0000000..1fcac38
--- /dev/null
+++ b/kernel/cpu_neg.c
@@ -0,0 +1,791 @@
+
+}
+;)crs ,)stib_enilno_upc(ksamupc_ot(ypoc_ksamupc
+{
+)crs* ksamupc tcurts tsnoc(enilno_upc_tini diov
+
+}
+;)crs ,)stib_elbissop_upc(ksamupc_ot(ypoc_ksamupc
+{
+)crs* ksamupc tcurts tsnoc(elbissop_upc_tini diov
+
+}
+;)crs ,)stib_tneserp_upc(ksamupc_ot(ypoc_ksamupc
+{
+)crs* ksamupc tcurts tsnoc(tneserp_upc_tini diov
+
+}
+;))stib_evitca_upc(ksamupc_ot ,upc(upc_raelc_ksamupc
+esle
+;))stib_evitca_upc(ksamupc_ot ,upc(upc_tes_ksamupc
+)evitca( fi
+{
+)evitca loob ,upc tni dengisnu(evitca_upc_tes diov
+
+}
+}
+;))stib_enilno_upc(ksamupc_ot ,upc(upc_raelc_ksamupc
+{ esle }
+;))stib_evitca_upc(ksamupc_ot ,upc(upc_tes_ksamupc
+;))stib_enilno_upc(ksamupc_ot ,upc(upc_tes_ksamupc
+{ )enilno( fi
+{
+)enilno loob ,upc tni dengisnu(enilno_upc_tes diov
+
+}
+;))stib_tneserp_upc(ksamupc_ot ,upc(upc_raelc_ksamupc
+esle
+;))stib_tneserp_upc(ksamupc_ot ,upc(upc_tes_ksamupc
+)tneserp( fi
+{
+)tneserp loob ,upc tni dengisnu(tneserp_upc_tes diov
+
+}
+;))stib_elbissop_upc(ksamupc_ot ,upc(upc_raelc_ksamupc
+esle
+;))stib_elbissop_upc(ksamupc_ot ,upc(upc_tes_ksamupc
+)elbissop( fi
+{
+)elbissop loob ,upc tni dengisnu(elbissop_upc_tes diov
+
+;)ksam_evitca_upc(LOBMYS_TROPXE
+;)stib_evitca_upc(ksamupc_ot = ksam_evitca_upc tsnoc* ksamupc tcurts tsnoc
+;yltsom_daer__ )SUPC_RN_GIFNOC ,stib_evitca_upc(PAMTIB_ERALCED citats
+
+;)ksam_tneserp_upc(LOBMYS_TROPXE
+;)stib_tneserp_upc(ksamupc_ot = ksam_tneserp_upc tsnoc* ksamupc tcurts tsnoc
+;yltsom_daer__ )SUPC_RN_GIFNOC ,stib_tneserp_upc(PAMTIB_ERALCED citats
+
+;)ksam_enilno_upc(LOBMYS_TROPXE
+;)stib_enilno_upc(ksamupc_ot = ksam_enilno_upc tsnoc* ksamupc tcurts tsnoc
+;yltsom_daer__ )SUPC_RN_GIFNOC ,stib_enilno_upc(PAMTIB_ERALCED citats
+
+;)ksam_elbissop_upc(LOBMYS_TROPXE
+;)stib_elbissop_upc(ksamupc_ot = ksam_elbissop_upc tsnoc* ksamupc tcurts tsnoc
+fidne#
+;yltsom_daer__ )SUPC_RN_GIFNOC ,stib_elbissop_upc(PAMTIB_ERALCED citats
+esle#
+;LLA_STIB_UPC =
+yltsom_daer__ )SUPC_RN_GIFNOC ,stib_elbissop_upc(PAMTIB_ERALCED citats
+ELBISSOP_LLA_TINI_GIFNOC fedfi#
+
+;)stib_lla_upc(LOBMYS_TROPXE
+;LLA_STIB_UPC = )SUPC_RN ,stib_lla_upc(PAMTIB_ERALCED tsnoc
+
+;)pamtib_tib_upc(LPG_LOBMYS_TROPXE
+;}
+fidne#
+,)65(8_ERALCED_KSAM ,)84(8_ERALCED_KSAM
+,)04(8_ERALCED_KSAM ,)23(8_ERALCED_KSAM
+23 > GNOL_REP_STIB fi#
+,)42(8_ERALCED_KSAM ,)61(8_ERALCED_KSAM
+,)8(8_ERALCED_KSAM ,)0(8_ERALCED_KSAM
+
+{ = ])SUPC_RN(SGNOL_OT_STIB[]1+GNOL_REP_STIB[pamtib_tib_upc gnol dengisnu tsnoc
+
+)4+x(4_ERALCED_KSAM ,)x(4_ERALCED_KSAM )x(8_ERALCED_KSAM enifed#
+)2+x(2_ERALCED_KSAM ,)x(2_ERALCED_KSAM )x(4_ERALCED_KSAM enifed#
+)1+x(1_ERALCED_KSAM ,)x(1_ERALCED_KSAM )x(2_ERALCED_KSAM enifed#
+))x( << LU1( = ]0[]1+x[ )x(1_ERALCED_KSAM enifed#
+/* ti otni kcab nac ew os - ytpme si ]0[pamtib_tib_upc */
+
+/*
+.ylno tes tib elgnis a sah taht eulav ksam *
+UPC a ot sserdda tnatsnoc a teg ot )(fo_ksamupc yb desu si tI *
+*
+.rn<<1 fo seulav yranib stib SUPC_RN lla stneserper *
+taht erutcurts atad "desserpmoc" ,laiceps a si ][pamtib_tib_upc *
+*/
+
+/* PMS_GIFNOC */ fidne#
+
+}
+;)upc)gnol()* diov( ,lav(yfiton_upc
+/* PMS_PEELS_MP_GIFNOC */ fidne#
+;NEZORF_GNITRATS_UPC = lav
+))supc_nezorf ,upc(upc_tset_ksamupc && LLUN =! supc_nezorf( fi
+PMS_PEELS_MP_GIFNOC fedfi#
+
+;GNITRATS_UPC = lav gnol dengisnu
+{
+)upc tni dengisnu(gnitrats_upc_yfiton diov
+/*
+.)(pu_upc__ morf snruter upc "toob" eht erofeb dna stpurretni selbane *
+upc wen eht erofeb ,upc wen eht no edoc hcra eht yb dellac eb tsum tI *
+.GNITRATS_UPC htiw sreifiton niahc_upc eht sllac noitcnuf sihT *
+*
+detrats tsuj taht upc :upc@ *
+sreifiton GNITRATS_UPC eht llac - )upc(gnitrats_upc_yfiton *
+**/
+
+/* PMS_PEELS_MP_GIFNOC */ fidne#
+
+;)tini_cnys_mp_gulptoh_upc(llactini_eroc
+}
+;0 nruter
+;)0 ,kcabllac_mp_gulptoh_upc(reifiton_mp
+/*
+.ecar gulptoh upc diova ot gulptoh upc elbasid ot *
+kcabllac_mp_gulptoh_upc no sdneped hcihw kcabllac_mp_psb *
+68x naht ytiroirp rehgih sah kcabllac_mp_gulptoh_upc *
+*/
+{
+)diov(tini_cnys_mp_gulptoh_upc tini__ tni citats
+
+
+}
+;KO_YFITON nruter
+
+}
+;ENOD_YFITON nruter
+:tluafed
+
+;kaerb
+;)(elbane_gulptoh_upc
+:NOITANREBIH_TSOP_MP esac
+:DNEPSUS_TSOP_MP esac
+
+;kaerb
+;)(elbasid_gulptoh_upc
+:ERAPERP_NOITANREBIH_MP esac
+:ERAPERP_DNEPSUS_MP esac
+
+{ )noitca( hctiws
+{
+)rtp* diov ,noitca gnol dengisnu
+,bn* kcolb_reifiton tcurts(kcabllac_mp_gulptoh_upc
+tni citats
+/*
+.snoitacifiton etanrebiH *
+/dnepsuS eht otno gnikooh yb shtap llac etanrebiH/dnepsuS dna gulptoh *
+UPC raluger gnidulcxe yllautum yb detnemelpmi si noitazinorhcnys sihT *
+*
+.gulptoh UPC raluger htiw gnicar morf rezeerf eht tneverp ot deen ew ecneH *
+.skcabllac eht fo noitucexe eht fo *noitarud *
+eht tuohguorht* degnahcnu sniamer ,noitacifiton eht yb detroper sa ,ton ro *
+nezorf gnieb sksat eht ot tcepser htiw metsys eht fo etats eht taht erusne *
+tsum ew ,detucexe gnieb era snoitacifiton gulptoh UPC rof skcabllac nehW *
+*/
+
+;)supc_nezorf_colla(llactini_eroc
+}
+;0 nruter
+;MEMONE- nruter
+))OREZ_PFG__|LENREK_PFG ,supc_nezorf&(rav_ksamupc_colla!( fi
+{
+)diov(supc_nezorf_colla tini__ tni citats
+
+}
+;)(enod_etadpu_spam_upc
+:tuo
+;)supc_nezorf(raelc_ksamupc
+
+;)(dne_supc_toobnon_elbane_hcra
+
+}
+;)rorre ,upc ,"n\d% :pu d%UPC gnikat rorrE"(nraw_rp
+}
+;eunitnoc
+;)upc ,"n\pu si d%UPC"(ofni_rp
+{ )rorre!( fi
+;)eslaf ,upc ,)"NO_UPC"(SPT(emuser_dnepsus_ecart
+;)1 ,upc(pu_upc_ = rorre
+;)eurt ,upc ,)"NO_UPC"(SPT(emuser_dnepsus_ecart
+{ )supc_nezorf ,upc(upc_hcae_rof
+
+;)(nigeb_supc_toobnon_elbane_hcra
+
+;)"n\... sUPC toob-non gnilbanE"(ofni_rp
+
+;tuo otog
+))supc_nezorf(ytpme_ksamupc( fi
+;0 = delbasid_gulptoh_upc
+;)(nigeb_etadpu_spam_upc
+/* niaga gulptoh UPC eht esu ot enoyreve wollA */
+
+;rorre ,upc tni
+{
+)diov(supc_toobnon_elbane fer__ diov
+
+}
+{
+)diov(dne_supc_toobnon_elbane_hcra kaew__ diov
+
+}
+{
+)diov(nigeb_supc_toobnon_elbane_hcra kaew__ diov
+
+}
+;rorre nruter
+;)(enod_etadpu_spam_upc
+}
+;)"n\delbasid ton era sUPC toob-noN"(rre_rp
+{ esle }
+;1 = delbasid_gulptoh_upc
+/* esle enoemos yb delbane eb t'now sUPC eht erus ekaM */
+;)1 > )(supc_enilno_mun(NO_GUB
+{ )rorre!( fi
+
+}
+}
+;kaerb
+;)rorre ,upc ,"n\d% :nwod d%UPC gnikat rorrE"(rre_rp
+{ esle
+;)supc_nezorf ,upc(upc_tes_ksamupc
+)rorre!( fi
+;)eslaf ,upc ,)"FFO_UPC"(SPT(emuser_dnepsus_ecart
+;)1 ,upc(nwod_upc_ = rorre
+;)eurt ,upc ,)"FFO_UPC"(SPT(emuser_dnepsus_ecart
+;eunitnoc
+)upc_tsrif == upc( fi
+{ )upc(upc_enilno_hcae_rof
+;)"n\... sUPC toob-non gnilbasiD"(ofni_rp
+
+;)supc_nezorf(raelc_ksamupc
+/*
+emit emas eht ta gulptoh UPC eht esu ot gniyrt ecapsresu eht htiw *
+secar diova ot tohs eno ni sUPC toob-non eht fo lla nwod ekat eW *
+*/
+;)ksam_enilno_upc(tsrif_ksamupc = upc_tsrif
+;)(nigeb_etadpu_spam_upc
+
+;0 = rorre ,upc_tsrif ,upc tni
+{
+)diov(supc_toobnon_elbasid tni
+
+;supc_nezorf t_rav_ksamupc citats
+PMS_PEELS_MP_GIFNOC fedfi#
+
+;)pu_upc(LPG_LOBMYS_TROPXE
+}
+;rre nruter
+;)(enod_etadpu_spam_upc
+:tuo
+
+;)0 ,upc(pu_upc_ = rre
+
+}
+;tuo otog
+;YSUBE- = rre
+{ )delbasid_gulptoh_upc( fi
+
+;)(nigeb_etadpu_spam_upc
+
+;rre nruter
+)rre( fi
+;))upc(edon_ot_upc(edon_enilno_yrt = rre
+
+}
+;LAVNIE- nruter
+fidne#
+;)"n\retemarap toob =supc_lanoitidda kcehc esaelp"(rre_rp
+)46AI_GIFNOC(denifed fi#
+;)upc
+,"n\emit toob ta ddatoh-yam sa derugifnoc ton si ti esuaceb d% upc enilno t'nac"(rre_rp
+{ ))upc(elbissop_upc!( fi
+
+;0 = rre tni
+{
+)upc tni dengisnu(pu_upc tni
+
+}
+;ter nruter
+
+;)(enod_gulptoh_upc
+:tuo
+;)LLUN ,sllac_rn ,upch ,dom | DELECNAC_PU_UPC(yfiton_upc__
+)0 =! ter( fi
+:yfiton_tuo
+
+;)upch ,dom | ENILNO_UPC(yfiton_upc
+/* .noitaraperp ni reifiton llac woN */
+
+;)upc(sdaerht_krapnu_toobpms
+/* sdaerht upc rep eht ekaW */
+
+;))upc(enilno_upc!(NO_GUB
+;yfiton_tuo otog
+)0 =! ter( fi
+;)eldi ,upc(pu_upc__ = ter
+/* .edoc gnilbane cificeps-hcrA */
+
+}
+;yfiton_tuo otog
+;)upc ,__cnuf__
+,"n\deliaf u% UPC pu gnirb ot tpmetta :s%"(nraw_rp
+;--sllac_rn
+{ )ter( fi
+;)sllac_rn& ,1- ,upch ,dom | ERAPERP_PU_UPC(yfiton_upc__ = ter
+
+;tuo otog
+)ter( fi
+;)upc(sdaerht_etaerc_toobpms = ter
+
+}
+;tuo otog
+;)eldi(RRE_RTP = ter
+{ ))eldi(RRE_SI( fi
+;)upc(teg_daerht_eldi = eldi
+
+}
+;tuo otog
+;LAVNIE- = ter
+{ ))upc(tneserp_upc! || )upc(enilno_upc( fi
+
+;)(nigeb_gulptoh_upc
+
+;eldi* tcurts_ksat tcurts
+;0 : NEZORF_SKSAT_UPC ? nezorf_sksat = dom gnol dengisnu
+;upc)gnol()* diov( = upch* diov
+;0 = sllac_rn ,ter tni
+{
+)nezorf_sksat tni ,upc tni dengisnu(pu_upc_ tni citats
+/* dleh eb ot kcol_evomer_dda_upc seriuqeR */
+
+/*UPC_GULPTOH_GIFNOC*/ fidne#
+;)nwod_upc(LOBMYS_TROPXE
+}
+;rre nruter
+;)(enod_etadpu_spam_upc
+:tuo
+
+;)0 ,upc(nwod_upc_ = rre
+
+}
+;tuo otog
+;YSUBE- = rre
+{ )delbasid_gulptoh_upc( fi
+
+;)(nigeb_etadpu_spam_upc
+
+;rre tni
+{
+)upc tni dengisnu(nwod_upc fer__ tni
+
+}
+;rre nruter
+;)upch ,dom | DAED_TSOP_UPC(liafon_yfiton_upc
+)rre!( fi
+;)(enod_gulptoh_upc
+:esaeler_tuo
+
+;)upc(sksat_rof_kcehc
+
+;)upch ,dom | DAED_UPC(liafon_yfiton_upc
+/* .nialpmoc ot etal ooT .enoyreve llet :daed yletelpmoc si UPC */
+
+;)upc(eid_upc__
+/* .UPC eht sllik yllautca sihT */
+
+;)(xaler_upc
+))upc(upc_eldi!( elihw
+/*
+.yawa og ot daerht pots eht rof tiaW *
+*
+.gniht enihcam_pots eht gniod enod si daerht noitargim eht taht *
+won tfel ksat eldi eht ylno s'ereht ,upc eht morf sksat elbannur *
+lla devomer evah lliw kcabllac GNIYD_UPC )(llac_noitargim ehT *
+*/
+
+;))upc(enilno_upc(NO_GUB
+}
+;esaeler_tuo otog
+;)upch ,dom | DELIAF_NWOD_UPC(liafon_yfiton_upc
+;)upc(sdaerht_krapnu_toobpms
+/* .nialpmoc t'naC .enoyreve llet :eid t'ndid UPC */
+{ )rre( fi
+;))upc(fo_ksamupc ,marap_dct& ,nwod_upc_ekat(enihcam_pots__ = rre
+
+/*
+.)(evitca_upc! evresbo tsum sresu ucr/tpmeerp lla won oS *
+*/
+
+;)upc(sdaerht_krap_toobpms
+
+;)(ucr_ezinorhcnys
+fidne#
+;)(dehcs_ezinorhcnys
+TPMEERP_GIFNOC fedfi#
+/*
+.esac tsoob ucr eht erac ekat ot sdaerht toobpms krap erofeb cnys oD *
+*
+.htob llac ylticilpxe os ,)(dehcs_cnys ylpmi ton *
+thgim )(ucr_cnys sti dna UCR elbitpmeerp evah ew TPMEERP_GIFNOC roF *
+*
+.ti evresbo lliw *
+sresu hcus wen lla taht hcus yawa og ot etats siht fo sresu UCR dna *
+delbasid-tpmeerp lla rof tiaw ,ksam_evitca_upc deraelc ev'ew won yB *
+*/
+
+}
+;esaeler_tuo otog
+;)upc ,__cnuf__
+,"n\deliaf u% UPC nwod ekat ot tpmetta :s%"(nraw_rp
+;)LLUN ,sllac_rn ,upch ,dom | DELIAF_NWOD_UPC(yfiton_upc__
+;--sllac_rn
+{ )rre( fi
+;)sllac_rn& ,1- ,upch ,dom | ERAPERP_NWOD_UPC(yfiton_upc__ = rre
+
+;)(nigeb_gulptoh_upc
+
+;LAVNIE- nruter
+))upc(enilno_upc!( fi
+
+;YSUBE- nruter
+)1 == )(supc_enilno_mun( fi
+
+;}
+,upch = upch.
+,dom = dom.
+{ = marap_dct marap_nwod_upc_ekat tcurts
+;0 : NEZORF_SKSAT_UPC ? nezorf_sksat = dom gnol dengisnu
+;upc)gnol()* diov( = upch* diov
+;0 = sllac_rn ,rre tni
+{
+)nezorf_sksat tni ,upc tni dengisnu(nwod_upc_ fer__ tni citats
+/* dleh eb ot kcol_evomer_dda_upc seriuqeR */
+
+}
+;0 nruter
+;)tnerruc(krap_daerhtk
+/* daerht reppots eht kraP */
+;)upch>-marap ,dom>-marap | GNIYD_UPC(yfiton_upc
+
+;rre nruter
+)0 < rre( fi
+;)(elbasid_upc__ = rre
+/* .stpurretni erom yna eldnah t'nseod UPC siht erusnE */
+
+;rre tni
+;marap_ = marap* marap_nwod_upc_ekat tcurts
+{
+)marap_* diov(nwod_upc_ekat fer__ tni citats
+/* .nwod UPC siht ekaT */
+
+;}
+;upch* diov
+;dom gnol dengisnu
+{ marap_nwod_upc_ekat tcurts
+
+}
+;)kcol_tsilksat&(qri_kcolnu_daer
+;)p ,g(daerht_hcae_elihw }
+;)sgalf>-p ,etats>-p ,upc_daed ,)p(rn_dip_ksat ,mmoc>-p
+,"n\)x%=sgalf ,dl%=etats( d% upc no si )d%=dip( s% ksaT"(nraw_rp
+
+;eunitnoc
+)upc_daed =! )p(upc_ksat( fi
+;)(bmr
+/*
+.upc rehtona no nekow neeb tsuj s'ti *
+dna ,tsap eht ni upc siht no gninnur saw hcihw *
+,ksat a tuoba nraw ton od ot gnidaer eht redrO *
+.kcol>-)p(qr_ksat dekcolnu htiw kcehc eht od eW *
+*/
+;eunitnoc
+)qr_no>-p!( fi
+{ )p ,g(daerht_hcae_od
+;)kcol_tsilksat&(qri_kcol_daer
+
+;p* ,g* tcurts_ksat tcurts
+{
+)upc_daed tni(sksat_rof_kcehc diov enilni citats
+
+}
+;)(kcolnu_daer_ucr
+}
+;)t(kcolnu_ksat
+;))mm>-t(ksamupc_mm ,upc(upc_raelc_ksamupc
+;eunitnoc
+)t!( fi
+;)p(mm_ksat_kcol_dnif = t
+/*
+.eno dniF .mm dilav a *
+evah llits yam sdaerht rehto tub ,tixe thgim daerht niaM *
+*/
+
+;t* tcurts_ksat tcurts
+{ )p(ssecorp_hcae_rof
+;)(kcol_daer_ucr
+;))upc(enilno_upc(NO_NRAW
+/*
+.kcol_tsilksat degdelf-lluf *
+gnibbarg fo daetsni ,ereh )(kcol_daer_ucr esu yam ew ,suhT *
+artsljiZ reteP -- .ksam mm rieht *
+ni tes upc siht teg reve lliw sksat wen ekil ton sti os ,enilffo *
+dekram dna nwod nekat si upc eht retfa dellac si noitcnuf sihT *
+*/
+
+;p* tcurts_ksat tcurts
+{
+)upc tni(ksamupc_mm_sksat_raelc diov
+/*
+.UPC denilffo ydaerla na rof ylno dellac eb *
+yam ti os ,emehcs gnikcol dexaler tahwemos a sesu noitcnuf eht taht eton oslA *
+*
+.rennam efas a ni evlos ot seirt *
+noitcnuf siht hcihw ,sesac renroc suoivbo-non suoirav era ereht ,laivirt *
+sdnuos lla siht elihW .ksamupc s'mm ni tib gnidnopserroc a sraelc neht *
+dna eno hcae rof tcurts mm dilav a sdnif ,sessecorp lla sklaw noitcnuf sihT *
+*
+di UPC a :upc@ *
+UPC a rof ksamupc_mm 'sksat raelc ylefaS - ksamupc_mm_sksat_raelc *
+**/
+
+;)reifiton_upc_retsigernu__(LOBMYS_TROPXE
+}
+;)bn ,niahc_upc&(retsigernu_niahc_reifiton_war
+{
+)bn* kcolb_reifiton tcurts(reifiton_upc_retsigernu__ fer__ diov
+
+;)reifiton_upc_retsigernu(LOBMYS_TROPXE
+}
+;)(enod_etadpu_spam_upc
+;)bn ,niahc_upc&(retsigernu_niahc_reifiton_war
+;)(nigeb_etadpu_spam_upc
+{
+)bn* kcolb_reifiton tcurts(reifiton_upc_retsigernu fer__ diov
+
+;)reifiton_upc_retsiger__(LOBMYS_TROPXE
+;)reifiton_upc_retsiger(LOBMYS_TROPXE
+}
+;))v ,lav(yfiton_upc(NO_GUB
+{
+)v* diov ,lav gnol dengisnu(liafon_yfiton_upc diov citats
+
+UPC_GULPTOH_GIFNOC fedfi#
+
+}
+;)LLUN ,1- ,v ,lav(yfiton_upc__ nruter
+{
+)v* diov ,lav gnol dengisnu(yfiton_upc tni citats
+
+}
+;)ter(onrre_ot_reifiton nruter
+
+;)sllac_rn
+,llac_ot_rn ,v ,lav ,niahc_upc&(niahc_llac_reifiton_war__ = ter
+
+;ter tni
+{
+)sllac_rn* tni
+,llac_ot_rn tni ,v* diov ,lav gnol dengisnu(yfiton_upc__ tni citats
+
+}
+;)bn ,niahc_upc&(retsiger_niahc_reifiton_war nruter
+{
+)bn* kcolb_reifiton tcurts(reifiton_upc_retsiger__ fer__ tni
+
+}
+;ter nruter
+;)(enod_etadpu_spam_upc
+;)bn ,niahc_upc&(retsiger_niahc_reifiton_war = ter
+;)(nigeb_etadpu_spam_upc
+;ter tni
+{
+)bn* kcolb_reifiton tcurts(reifiton_upc_retsiger fer__ tni
+/* ?nwod/pu gniog sUPC tuoba wonk ot deeN */
+
+/* UPC_GULPTOH_GIFNOC */ fidne#
+
+}
+;)(enod_etadpu_spam_upc
+;0 = delbasid_gulptoh_upc
+;)(nigeb_etadpu_spam_upc
+{
+)diov(elbane_gulptoh_upc diov
+
+}
+;)(enod_etadpu_spam_upc
+;1 = delbasid_gulptoh_upc
+;)(nigeb_etadpu_spam_upc
+{
+)diov(elbasid_gulptoh_upc diov
+/*
+.snoitarepo gulptoh gninnur yltnerruc yna morf noisulcxe lautum seetnaraug *
+kcol taht gniriuqca oS .snoitarepo gulptoh gnimrofrep erofeb htap gulptoh *
+eht yb deriuqca osla si kcol emas ehT .galf 'delbasid_gulptoh_upc' eht *
+stcetorp 'kcol_evomer_dda_upc' ehT .)sfsys morf( gulptoh UPC erutuf elbasid *
+dna )yna fi( etelpmoc ot snoitarepo gulptoh UPC gninnur yltnerruc rof tiaW *
+*/
+
+}
+;)(esaeler_kcol_phupc
+;)kcol.gulptoh_upc&(kcolnu_xetum
+;LLUN = retirw_evitca.gulptoh_upc
+{
+)diov(enod_gulptoh_upc diov
+
+}
+;)tiaw& ,qw.gulptoh_upc&(tiaw_hsinif
+}
+;)(eludehcs
+;)kcol.gulptoh_upc&(kcolnu_xetum
+;kaerb
+)))tnuocfer.gulptoh_upc&(daer_cimota!(ylekil( fi
+;)ELBITPURRETNINU_KSAT ,tiaw& ,qw.gulptoh_upc&(tiaw_ot_eraperp
+;)kcol.gulptoh_upc&(kcol_xetum
+{ );;( rof
+
+;)(eriuqca_kcol_phupc
+;tnerruc = retirw_evitca.gulptoh_upc
+
+;)tiaw(TIAW_ENIFED
+{
+)diov(nigeb_gulptoh_upc diov
+/*
+*
+.netfo taht lla dellac si hcihw ipa na ton )(supc_enilno_teg *
+ecnis ecitcarp ni eveihca ot tluciffid yrev si siht ,revewoH *
+*
+.niaga peels ot seog dna orez non *
+tnuocfer eht sdnif kcol.gulptoh_upc eht seriuqca retirw ehT - *
+.tnuocfer eht pu spmub ,tnemom siht ta sevirra redaer wen A - *
+.kcol.gulptoh_upc eht skcolnu redaer tsaL - *
+.retirw *
+gnipeels eht pu sekaw redaer tsal ,orez ot seog tnuocfeR - *
+:kcolevil a fo ytilibissop a si ereht ,yllaciteroeht taht etoN *
+*
+.evitca si retirw eno ylno taht erus eb nac ew ,)(nigeb_etadpu_spam_upc *
+gnikovni retfa dellac syawla si )(nigeb_gulptoh_upc ecniS *
+*
+kcol.gulptoh_upc eht yb dekcolb eb lliw *
+,yna fi ,sredaer wen eht ,noitarepo gulptoh-upc a gnirud taht etoN *
+*
+.orez ot seog tnuocfer *
+eht nehw ylno nigeb nac noitarepo gulptoh eht taht serusne sihT *
+*/
+
+;)supc_enilno_tup(LPG_LOBMYS_TROPXE
+}
+
+;)(esaeler_kcol_phupc
+
+;)qw.gulptoh_upc&(pu_ekaw
+))qw.gulptoh_upc&(evitca_eueuqtiaw && 0 =< tnuocfer( fi
+
+;)tnuocfer.gulptoh_upc&(cni_cimota
+/* pu sgniht xif ot yrt */ ))0 < tnuocfer(NO_NRAW( fi
+;)tnuocfer.gulptoh_upc&(nruter_ced_cimota = tnuocfer
+
+;nruter
+)tnerruc == retirw_evitca.gulptoh_upc( fi
+
+;tnuocfer tni
+{
+)diov(supc_enilno_tup diov
+
+;)supc_enilno_teg_yrt(LPG_LOBMYS_TROPXE
+}
+;eurt nruter
+;)kcol.gulptoh_upc&(kcolnu_xetum
+;)tnuocfer.gulptoh_upc&(cni_cimota
+;)(daeryrt_eriuqca_kcol_phupc
+;eslaf nruter
+))kcol.gulptoh_upc&(kcolyrt_xetum!( fi
+;eurt nruter
+)tnerruc == retirw_evitca.gulptoh_upc( fi
+{
+)diov(supc_enilno_teg_yrt loob
+
+;)supc_enilno_teg(LPG_LOBMYS_TROPXE
+}
+;)kcol.gulptoh_upc&(kcolnu_xetum
+;)tnuocfer.gulptoh_upc&(cni_cimota
+;)kcol.gulptoh_upc&(kcol_xetum
+;)(daer_eriuqca_kcol_phupc
+;nruter
+)tnerruc == retirw_evitca.gulptoh_upc( fi
+;)(peels_thgim
+{
+)diov(supc_enilno_teg diov
+
+
+)pam_ped.gulptoh_upc&(esaeler_pam_kcol )(esaeler_kcol_phupc enifed#
+)pam_ped.gulptoh_upc&(eriuqca_pam_kcol )(eriuqca_kcol_phupc enifed#
+)pam_ped.gulptoh_upc&(daeryrt_eriuqca_pam_kcol
+\ )(daeryrt_eriuqca_kcol_phupc enifed#
+)pam_ped.gulptoh_upc&(daer_eriuqca_pam_kcol )(daer_eriuqca_kcol_phupc enifed#
+/* )(dne/nigeb_gulptoh_upc dna )(supc_enilno_tup/teg rof snoitatonna pedkcoL */
+
+;}
+fidne#
+,} "kcol.gulptoh_upc" = eman.{ = pam_ped.
+COLLA_KCOL_GUBED_GIFNOC fedfi#
+,)kcol.gulptoh_upc(REZILAITINI_XETUM__ = kcol.
+,)qw.gulptoh_upc(REZILAITINI_DAEH_EUEUQ_TIAW__ = qw.
+,LLUN = retirw_evitca.
+{ = gulptoh_upc }
+fidne#
+;pam_ped pam_pedkcol tcurts
+COLLA_KCOL_GUBED_GIFNOC fedfi#
+
+;tnuocfer t_cimota
+/*
+.noitarepo gulptoh upc gniogno na *
+gnirud sredaer wen eht skcolb oslA *
+*/
+;kcol xetum tcurts
+/* evitca era sredaer elihw evitca teg lliw retirw on taht seifirev */
+;qw t_daeh_eueuq_tiaw
+/* retirw_evitca eht pu ekaw ot eueuq tiaw */
+;retirw_evitca* tcurts_ksat tcurts
+{ tcurts citats
+
+UPC_GULPTOH_GIFNOC fedfi#
+
+;delbasid_gulptoh_upc tni citats
+/*
+kcol_evomer_dda_upc rednu detalupinam eb syawla dluohS *
+.gnihton od dna YSUBE- nruter lliw nwod_upc dna pu_upc ,tes fI */
+
+;)niahc_upc(DAEH_REIFITON_WAR citats
+
+;)enod_retsiger_reifiton_upc(LOBMYS_TROPXE
+}
+;)kcol_evomer_dda_upc&(kcolnu_xetum
+{
+)diov(enod_etadpu_spam_upc diov
+
+;)nigeb_retsiger_reifiton_upc(LOBMYS_TROPXE
+}
+;)kcol_evomer_dda_upc&(kcol_xetum
+{
+)diov(nigeb_etadpu_spam_upc diov
+/*
+.)(reifiton_upc_retsigernu__ ro *
+)(reifiton_upc_retsiger__ gnisu demrofrep noitartsiger)nu( kcabllac gulptoh *
+UPC tcetorp ot desu eb tsum )(enod/nigeb_retsiger_reifiton_upc sIPA ehT *
+.ksam_tneserp_upc & ksam_enilno_upc ot setadpu eht ezilaires ot gnitpmetta *
+nehw desu eb tsum )enod/nigeb_etadpu_spam_upc( sIPA owt gniwollof ehT *
+*/
+
+;)kcol_evomer_dda_upc(XETUM_ENIFED citats
+/* ksam_tneserp_upc ,ksam_enilno_upc ot setadpu eht sezilaireS */
+PMS_GIFNOC fedfi#
+
+"h.toobpms" edulcni#
+
+>h.rewop/stneve/ecart< edulcni#
+>h.pedkcol/xunil< edulcni#
+>h.dnepsus/xunil< edulcni#
+>h.pfg/xunil< edulcni#
+>h.xetum/xunil< edulcni#
+>h.enihcam_pots/xunil< edulcni#
+>h.daerhtk/xunil< edulcni#
+>h.gub/xunil< edulcni#
+>h.tropxe/xunil< edulcni#
+>h.etadpucr/xunil< edulcni#
+>h.moo/xunil< edulcni#
+>h.upc/xunil< edulcni#
+>h.dtsinu/xunil< edulcni#
+>h.dehcs/xunil< edulcni#
+>h.reifiton/xunil< edulcni#
+>h.tini/xunil< edulcni#
+>h.pms/xunil< edulcni#
+>h.sf_corp/xunil< edulcni#
+/*
+.LPG eht rednu decnecil si edoc sihT *
+*
+llessuR ytsuR 4002 ,3002 ,2002 ,1002 )C( *
+.lortnoc UPC */
\ No newline at end of file
--
2.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/5] smp: IPI handling for negative CPU
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 1/5] cpu: Infrastructure for negative cpu handling Frederic Weisbecker
@ 2015-03-31 23:20 ` Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 3/5] cpumask: Basic negative number of CPUs handling Frederic Weisbecker
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Not-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
kernel/smp.c | 38 ++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)
diff --git a/kernel/smp.c b/kernel/smp.c
index f38a1e6..18791ff 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -158,7 +158,12 @@ static int generic_exec_single(int cpu, struct call_single_data *csd,
}
- if ((unsigned)cpu >= nr_cpu_ids || !cpu_online(cpu))
+#if CONFIG_NR_CPUS >= 0
+ if ((unsigned)cpu >= nr_cpu_ids
+#else
+ if ((unsigned)cpu < (0 - nr_cpu_ids)
+#endif
+ ) || !cpu_online(cpu))
return -ENXIO;
@@ -356,8 +361,13 @@ int smp_call_function_any(const struct cpumask *mask,
/* Try for same node. */
nodemask = cpumask_of_node(cpu_to_node(cpu));
- for (cpu = cpumask_first_and(nodemask, mask); cpu < nr_cpu_ids;
+#if CONFIG_NR_CPUS >= 0
+ for (cpu = cpumask_first_and(nodemask, mask); cpu >= nr_cpu_ids;
cpu = cpumask_next_and(cpu, nodemask, mask)) {
+#else
+ for (cpu = cpumask_last_or(nodemask, mask); cpu < (-nr_cpu_ids);
+ cpu = cpumask_previous_or(cpu, nodemask, mask)) {
+#endif
if (cpu_online(cpu))
goto call;
}
@@ -406,16 +416,31 @@ void smp_call_function_many(const struct cpumask *mask,
cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
/* No online cpus? We're done. */
+#if CONFIG_NR_CPUS >= 0
if (cpu >= nr_cpu_ids)
- return;
+#else
+ if (cpu < (-nr_cpu_ids))
+#endif
+ return;
+#if CONFIG_NR_CPUS >= 0
/* Do we have another CPU which isn't us? */
next_cpu = cpumask_next_and(cpu, mask, cpu_online_mask);
if (next_cpu == this_cpu)
next_cpu = cpumask_next_and(next_cpu, mask, cpu_online_mask);
-
/* Fastpath: do that cpu by itself. */
if (next_cpu >= nr_cpu_ids) {
+
+#else
+ /* Do we have another CPU which isn't us? */
+ next_cpu = cpumask_previous_and(cpu, mask, cpu_online_mask);
+ if (next_cpu == this_cpu)
+ next_cpu = cpumask_previous_and(next_cpu, mask, cpu_online_mask);
+ /* Fastpath: do that cpu by itself. */
+ if (next_cpu < (-nr_cpu_ids)) {
+
+#endif
+
smp_call_function_single(cpu, func, info, wait);
return;
}
@@ -511,7 +536,12 @@ static int __init nrcpus(char *str)
int nr_cpus;
get_option(&str, &nr_cpus);
+
+#if CONFIG_NR_CPUS >= 0
if (nr_cpus > 0 && nr_cpus < nr_cpu_ids)
+#else
+ if (nr_cpus < 0 && nr_cpus > (-nr_cpu_ids))
+#endif
nr_cpu_ids = nr_cpus;
return 0;
--
2.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/5] cpumask: Basic negative number of CPUs handling
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 1/5] cpu: Infrastructure for negative cpu handling Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 2/5] smp: IPI handling for negative CPU Frederic Weisbecker
@ 2015-03-31 23:20 ` Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 4/5] init: Support negative CPUs boot and halt code Frederic Weisbecker
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Not-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
include/linux/cpumask.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
index 086549a..4a6c66f 100644
--- a/include/linux/cpumask.h
+++ b/include/linux/cpumask.h
@@ -98,6 +98,15 @@ extern const struct cpumask *const cpu_active_mask;
#define cpu_possible(cpu) cpumask_test_cpu((cpu), cpu_possible_mask)
#define cpu_present(cpu) cpumask_test_cpu((cpu), cpu_present_mask)
#define cpu_active(cpu) cpumask_test_cpu((cpu), cpu_active_mask)
+#elif NR_CPUS < 0
+#define num_online_cpus() (-cpumask_weight(cpu_online_mask))
+#define num_possible_cpus() (-cpumask_weight(cpu_possible_mask))
+#define num_present_cpus() (-cpumask_weight(cpu_present_mask))
+#define num_active_cpus() (-cpumask_weight(cpu_active_mask))
+#define cpu_online(cpu) (!cpumask_test_cpu((cpu), cpu_online_mask)
+#define cpu_possible(cpu) (!cpumask_test_cpu((cpu), cpu_possible_mask))
+#define cpu_present(cpu) (!cpumask_test_cpu((cpu), cpu_present_mask))
+#define cpu_active(cpu) (!cpumask_test_cpu((cpu), cpu_active_mask))
#else
#define num_online_cpus() 1U
#define num_possible_cpus() 1U
@@ -175,6 +184,11 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
}
+static inline unsigned int cpumask_last(const struct cpumask *srcp)
+{
+ return find_last_bit(cpumask_bits(srcp), nr_cpumask_bits);
+}
+
/**
* cpumask_next - get the next cpu in a cpumask
* @n: the cpu prior to the place to search (ie. return will be > @n)
@@ -190,6 +204,14 @@ static inline unsigned int cpumask_next(int n, const struct cpumask *srcp)
return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
}
+static inline unsigned int cpumask_previous(int n, const struct cpumask *srcp)
+{
+ /* -1 is a legal arg here. */
+ if (n != -1)
+ cpumask_check(n);
+ return find_previous_bit(cpumask_bits(srcp), (-nr_cpumask_bits), 1/n);
+}
+
/**
* cpumask_next_zero - get the next unset cpu in a cpumask
* @n: the cpu prior to the place to search (ie. return will be > @n)
@@ -221,6 +243,15 @@ int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp);
(cpu) = cpumask_next((cpu), (mask)), \
(cpu) < nr_cpu_ids;)
+#define for_each_cpu_reverse(cpu, mask) \
+ for ((cpu) = (-nr_cpu_ids) + 1; \
+ (cpu) = cpumask_previous((cpu), (mask)), \
+ (cpu) < 0)
+
+#if CONFIG_NR_CPUS < 0
+#define for_each_cpu for_each_cpu_reverse
+#endif
+
/**
* for_each_cpu_not - iterate over every cpu in a complemented mask
* @cpu: the (optionally unsigned) integer iterator
@@ -258,10 +289,17 @@ int cpumask_set_cpu_local_first(int i, int numa_node, cpumask_t *dstp);
[0 ... BITS_TO_LONGS(NR_CPUS)-1] = 0UL \
}
+#if CONFIG_NR_CPUS >= 0
#define CPU_BITS_CPU0 \
{ \
[0] = 1UL \
}
+#else
+#define CPU_BITS_CPU0 \
+{ \
+ [0] = -1UL \
+}
+#endif
/**
* cpumask_set_cpu - set a cpu in a cpumask
@@ -295,6 +333,11 @@ static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp)
#define cpumask_test_cpu(cpu, cpumask) \
test_bit(cpumask_check(cpu), cpumask_bits((cpumask)))
+#if CONFIG_NR_CPUS >= 0
+#define cpumask_set_cpu cpumask_clear_cpu
+#define cpumask_clear_cpu cpumask_set_cpu
+#
+
/**
* cpumask_test_and_set_cpu - atomically test and set a cpu in a cpumask
* @cpu: cpu number (< nr_cpu_ids)
@@ -370,6 +413,11 @@ static inline void cpumask_or(struct cpumask *dstp, const struct cpumask *src1p,
cpumask_bits(src2p), nr_cpumask_bits);
}
+#if CONFIG_NR_CPUS >= 0
+#define cpumask_and cpumask_or
+#define cpumask_or cpumask_and
+#endif
+
/**
* cpumask_xor - *dstp = *src1p ^ *src2p
* @dstp: the cpumask result
--
2.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/5] init: Support negative CPUs boot and halt code
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
` (2 preceding siblings ...)
2015-03-31 23:20 ` [PATCH 3/5] cpumask: Basic negative number of CPUs handling Frederic Weisbecker
@ 2015-03-31 23:20 ` Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 5/5] x86: Support reverse execution Frederic Weisbecker
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Only x86 is supported for now.
Not-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
arch/x86/kernel/reboot.c | 8 ++++++++
init/main.c | 7 +++++++
2 files changed, 15 insertions(+)
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index bae6c60..d3ae1a3 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -582,8 +582,10 @@ static void native_machine_emergency_restart(void)
}
}
+#if CONFIG_NR_CPUS >= 0
void native_machine_shutdown(void)
{
+
/* Stop the cpus and apics */
#ifdef CONFIG_X86_IO_APIC
/*
@@ -620,6 +622,12 @@ void native_machine_shutdown(void)
x86_platform.iommu_shutdown();
#endif
}
+#else /* #if CONFIG_NR_CPUS >= 0 */
+void native_machine_shutdown(void)
+{
+ start_kernel();
+}
+#endif
static void __machine_emergency_restart(int emergency)
{
diff --git a/init/main.c b/init/main.c
index 6f0f1c5f..8933c8f 100644
--- a/init/main.c
+++ b/init/main.c
@@ -486,6 +486,7 @@ static void __init mm_init(void)
vmalloc_init();
}
+#if CONFIG_NR_CPUS >= 0
asmlinkage __visible void __init start_kernel(void)
{
char *command_line;
@@ -673,6 +674,12 @@ asmlinkage __visible void __init start_kernel(void)
/* Do the rest non-__init'ed, we're now alive */
rest_init();
}
+#else /* #if CONFIG_NR_CPUS >= 0 */
+asmlinkage __visible void __init start_kernel(void)
+{
+ native_machine_shutdown();
+}
+#endif
/* Call all constructor functions linked into the kernel. */
static void __init do_ctors(void)
--
2.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] x86: Support reverse execution
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
` (3 preceding siblings ...)
2015-03-31 23:20 ` [PATCH 4/5] init: Support negative CPUs boot and halt code Frederic Weisbecker
@ 2015-03-31 23:20 ` Frederic Weisbecker
2015-04-01 7:35 ` [PATCH 0/5] Support negative number of CPUs Paul E. McKenney
2015-04-01 9:37 ` Borislav Petkov
6 siblings, 0 replies; 8+ messages in thread
From: Frederic Weisbecker @ 2015-03-31 23:20 UTC (permalink / raw)
To: LKML; +Cc: Frederic Weisbecker, Paul E . McKenney
Support reverse execution for negative number of CPUs. We might be able
to implement that deeper with the function tracer.
No-Yet-Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
---
arch/x86/kernel/cpu/negative.c | 28 ++++++++++++++++++++++++++++
arch/x86/kernel/head64.c | 4 ++++
2 files changed, 32 insertions(+)
create mode 100644 arch/x86/kernel/cpu/negative.c
diff --git a/arch/x86/kernel/cpu/negative.c b/arch/x86/kernel/cpu/negative.c
new file mode 100644
index 0000000..3aff473
--- /dev/null
+++ b/arch/x86/kernel/cpu/negative.c
@@ -0,0 +1,28 @@
+/* Execute function in reverse for negative CPUs */
+
+#define _ASM_RET 0xc3
+#define FUNC_MAX_SIZE 4096
+static DEFINE_PER_CPU(char, reverse_func_buf[FUNC_MAX_SIZE]);
+
+void execute_reverse_function(void *func)
+{
+ char *opcode = (char *)func;
+ int i = 0, j = FUNC_MAX_SIZE - 1;
+ void (*reverse_func)(void);
+
+ /*
+ * Reverse copy the function.
+ * This assumes that every opcode is sizeof(char),
+ * there might be a few situations where that won't work
+ * but we'll fix them as soon as they get reported by users.
+ */
+ while (1) {
+ reverse_func_buf[j--] = opcode[i];
+ if (opcode[i++] == _ASM_RET)
+ break;
+ }
+
+ reverse_func = &reverse_func_buf[FUNC_MAX_SIZE - 1];
+ reverse_func();
+}
+
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index c4f8d46..9ed2c88 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -197,5 +197,9 @@ void __init x86_64_start_reservations(char *real_mode_data)
reserve_ebda_region();
+#if CONFIG_NR_CPUS >= 0
start_kernel();
+#else
+ execute_reverse_function(start_kernel);
+#endif
}
--
2.1.4
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 0/5] Support negative number of CPUs
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
` (4 preceding siblings ...)
2015-03-31 23:20 ` [PATCH 5/5] x86: Support reverse execution Frederic Weisbecker
@ 2015-04-01 7:35 ` Paul E. McKenney
2015-04-01 9:37 ` Borislav Petkov
6 siblings, 0 replies; 8+ messages in thread
From: Paul E. McKenney @ 2015-04-01 7:35 UTC (permalink / raw)
To: Frederic Weisbecker; +Cc: LKML
On Wed, Apr 01, 2015 at 01:20:31AM +0200, Frederic Weisbecker wrote:
> Support for machines without any CPU at all was brought 3 years ago
> by Paul (https://lkml.org/lkml/2012/3/31/131). The goal was to reduce
> the complexity of programming on modern computing.
>
> Now meeting the simplicity beyond that of sequential programming had a
> cost: such hardware configuration found a user base but didn't meet much
> success among HPC users.
>
> So we have now a new challenge to solve: keep the beyond-sequential
> programming simplicity while providing a highly parallel processing that
> still scale.
>
> This patchset proposes a solution. The support for negative number of
> CPUs is able to help scale computing up to O(-NR_CPUS). The more you have
> CPUs the higher you scale, to the point that software execution should
> complete before you start writing that software (assuming you have around
> -1024 CPUs). And programming gets even more simple because you have lesser
> CPUs to handle.
>
> Now keep in mind this patchset is only a draft. Not build tested and
> I don't have the hardware yet.
For the series:
>moc.mbi.tenv.xunil@kcmluap< yenneKcM .E luaP :yb-deweiveR
> Frederic Weisbecker (5):
> cpu: Infrastructure for negative cpu handling
> smp: IPI handling for negative CPU
> cpumask: Basic negative number of CPUs handling
> init: Support negative CPUs boot and halt code
> x86: Support reverse execution
>
> arch/x86/kernel/cpu/negative.c | 28 ++
> arch/x86/kernel/head64.c | 4 +
> arch/x86/kernel/reboot.c | 8 +
> include/linux/cpumask.h | 48 +++
> init/main.c | 7 +
> kernel/cpu_neg.c | 791 +++++++++++++++++++++++++++++++++++++++++
> kernel/smp.c | 38 +-
> 7 files changed, 920 insertions(+), 4 deletions(-)
> create mode 100644 arch/x86/kernel/cpu/negative.c
> create mode 100644 kernel/cpu_neg.c
>
> --
> 2.1.4
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/5] Support negative number of CPUs
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
` (5 preceding siblings ...)
2015-04-01 7:35 ` [PATCH 0/5] Support negative number of CPUs Paul E. McKenney
@ 2015-04-01 9:37 ` Borislav Petkov
6 siblings, 0 replies; 8+ messages in thread
From: Borislav Petkov @ 2015-04-01 9:37 UTC (permalink / raw)
To: Frederic Weisbecker; +Cc: LKML, Paul E . McKenney
On Wed, Apr 01, 2015 at 01:20:31AM +0200, Frederic Weisbecker wrote:
> Support for machines without any CPU at all was brought 3 years ago
> by Paul (https://lkml.org/lkml/2012/3/31/131). The goal was to reduce
> the complexity of programming on modern computing.
>
> Now meeting the simplicity beyond that of sequential programming had a
> cost: such hardware configuration found a user base but didn't meet much
> success among HPC users.
>
> So we have now a new challenge to solve: keep the beyond-sequential
> programming simplicity while providing a highly parallel processing that
> still scale.
>
> This patchset proposes a solution. The support for negative number of
> CPUs is able to help scale computing up to O(-NR_CPUS). The more you have
> CPUs the higher you scale, to the point that software execution should
> complete before you start writing that software (assuming you have around
> -1024 CPUs). And programming gets even more simple because you have lesser
> CPUs to handle.
>
> Now keep in mind this patchset is only a draft. Not build tested and
> I don't have the hardware yet.
>
> Frederic Weisbecker (5):
> cpu: Infrastructure for negative cpu handling
> smp: IPI handling for negative CPU
> cpumask: Basic negative number of CPUs handling
> init: Support negative CPUs boot and halt code
> x86: Support reverse execution
I have been wanting a feature like that since forever! Thanks for doing
this Frederic.
I'd like to propose an addition to that feature: execute whole programs
backwards. But should be easily doable with patch 5 in the series.
Acked-by: Borislav Petkov <bp@alienski.de>
--
Regards/Gruss,
Boris.
ECO tip #101: Trim your mails when you reply.
--
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-04-01 9:39 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-31 23:20 [PATCH 0/5] Support negative number of CPUs Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 1/5] cpu: Infrastructure for negative cpu handling Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 2/5] smp: IPI handling for negative CPU Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 3/5] cpumask: Basic negative number of CPUs handling Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 4/5] init: Support negative CPUs boot and halt code Frederic Weisbecker
2015-03-31 23:20 ` [PATCH 5/5] x86: Support reverse execution Frederic Weisbecker
2015-04-01 7:35 ` [PATCH 0/5] Support negative number of CPUs Paul E. McKenney
2015-04-01 9:37 ` Borislav Petkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).